Ich schreibe einen einfachen Kernel-Treiber für meine Anwendung (denken Sie an eine sehr einfache Anti-Malware-Anwendung.)
Ich habe ZwOpenFile()
angehakt und PsGetCurrentProcess()
verwendet, um eine Handhabe für den Aufrufer-Prozess zu erhalten.
Es gibt eine PEPROCESS-Struktur zurück:
%Vor% Ich verwende ZwQueryInformationProcess()
, um PID
und ImageFileName
zu erhalten:
und versuchen, den Prozess FullPath
auf diese Weise zu bekommen (aber ich bekomme BSOD):
Wie Sie sehen, ist str.Buffer
leer oder mit Müll gefüllt. Möglicherweise löst ein Pufferüberlauf beim Füllen von str
via ZwQueryInformationProcess()
den BSOD aus.
Jede Hilfe wäre willkommen.
Die MSDN-Dokumentation für diese API zeigt dies an
Wenn die ProcessInformationClass Parameter ist ProcessImageFileName, der Puffer, auf den die ProcessInformation Parameter sollte sein groß genug, um einen UNICODE_STRING zu halten Struktur sowie die Zeichenfolge selbst. Die Zeichenfolge, die in der Pufferelement ist der Name des Bildes Datei.datei.
In diesem Sinne schlage ich vor, dass Sie versuchen, Ihre Pufferstruktur wie folgt zu ändern:
%Vor%Zusätzlich muss Ihr Code den in den Dokumenten beschriebenen Fehlerfall überprüfen und behandeln. Dies könnte der Grund sein, warum Sie den BSOD-Trigger-Fall verpasst haben.
Wenn der Puffer zu klein ist, wird der Funktion scheitert mit dem STATUS_INFO_LENGTH_MISMATCH Fehlercode und der ReturnLength-Parameter ist festgelegt auf die erforderliche Puffergröße.
// Deklarieren Sie dieses Codeteil in der Headerdatei, falls vor der Funktionsdefinition anderweitig verfügbar.
%Vor%// Funktionsdefinition
%Vor%// Funktionsaufruf .. Schreiben Sie diesen Code in PreOperation Rückruf und IRQ sollte PASSIVE_LEVEL
sein %Vor%in der FullPath-Variablen gibt es Full Path of Process. Wenn der Prozess explorer.exe ist, sieht der Pfad folgendermaßen aus: -
%Vor%Hinweis: - \ Device \ HarddiskVolume3 Der Pfad könnte aufgrund von Machine und unterschiedlichem Volume auf der Festplatte geändert werden. Dies ist ein Beispiel in meinem Fall.