【发布时间】:2021-08-08 09:06:56
【问题描述】:
#include<Ntifs.h>
#include <ntddk.h>
#include <WinDef.h>
void SampleUnload(_In_ PDRIVER_OBJECT DriverObject) {
UNREFERENCED_PARAMETER(DriverObject);
DbgPrint("Sample driver Unload called\n");
}
extern "C"
NTSTATUS
DriverEntry(_In_ PDRIVER_OBJECT DriverObject, _In_ PUNICODE_STRING RegistryPath) {
UNREFERENCED_PARAMETER(RegistryPath);
DriverObject->DriverUnload = SampleUnload;
DbgPrint("Sample driver Load called\n");
PEPROCESS EP = NULL;
if (PsLookupProcessByProcessId(::PsGetCurrentProcessId(), &EP) == STATUS_INVALID_PARAMETER) {
DbgPrint("Can't get the eprocess");
}
else {
DbgPrint("Its working");
}
LPBYTE pUpi = ((LPBYTE)EP) + 0x440;
PVOID UniqueProcessId = *((PVOID*)pUpi);
DbgPrint("Test Test Test!");
DbgPrint((CHAR*)UniqueProcessId);
return STATUS_SUCCESS;
}
大家好, 我正在尝试打印出驱动程序的 pid 作为练习。 当我启动驱动程序时,他正在工作,但在 30 行中他没有打印任何内容,而在所有其他行中他都打印了! 我想使用 EPROCESS 打印出进程的 pid。
有人可以帮帮我吗?
【问题讨论】:
-
((LPBYTE)EP) + 0x440应该做什么? -
我知道如何打印。我所有其他人的打印工作都很好。 ((LPBYTE)EP) + 0x440 是 PID 的地址。
-
UniqueProcessId == PsGetCurrentProcessId()和EP== PsGetCurrentProcess在您的情况下。所以不清楚你尝试做什么。如果PsLookupProcessByProcessId返回>= 0,你也必须调用ObDereferenceObject(EP),如果api返回< 0,你不能访问EP,但你根本不检查结果。 -
使用 PsLookupProcessByProcessId 获取进程 PID - 但
PsLookupProcessByProcessId将进程 PID 作为输入。所以你必须已经有了它才能使用这个 api。奇怪的名字。 -
DbgPrint((CHAR*)UniqueProcessId);无论如何都会出错。奇怪的是没有蓝屏死机。DbgPrint("pid=%p\n",UniqueProcessId);必须是