Comment utiliser ZwQueryInformationProcess pour obtenir ProcessImageFileName dans un pilote de noyau?

Je suis en train d'écrire un simple pilote de noyau pour mon application (pensez à un de très simple, l'application anti-malware.)

J'ai accroché ZwOpenFile() et utilisé PsGetCurrentProcess() pour obtenir un handle pour le processus appelant.

Elle renvoie une PEPROCESS structure:

PEPROCESS proc = PsGetCurrentProcess();

Je suis en utilisant ZwQueryInformationProcess() pour obtenir le PID et ImageFileName:

DbgPrint("ZwOpenFile Called...\n");
DbgPrint("PID: %d\n", PsGetProcessId(proc));
DbgPrint("ImageFileName: %.16s\n", PsGetProcessImageFileName(proc));

et essayer d'obtenir le processus FullPath de cette façon (mais je reçois BSOD):

WCHAR strBuffer[260];
UNICODE_STRING str;

//initialize
str.Buffer = strBuffer;
str.Length = 0x0;
str.MaximumLength = sizeof(strBuffer);

//note that the seconds arg (27) is ProcessImageFileName
ZwQueryInformationProcess(proc, 27, &str, sizeof(str), NULL);

DbgPrint("FullPath: %wZ\n", str.Buffer);

Comment utiliser ZwQueryInformationProcess pour obtenir ProcessImageFileName dans un pilote de noyau?

Comme vous le voyez str.Buffer est vide ou rempli d'ordures. Peut-être un débordement de la mémoire tampon pendant le remplissage du str via ZwQueryInformationProcess() déclenche le BSOD.

Comment utiliser ZwQueryInformationProcess pour obtenir ProcessImageFileName dans un pilote de noyau?

Toute aide serait appréciée.

OriginalL'auteur fardjad | 2010-09-14