使用 PsLookupProcessByProcessId 获取进程 PID

Get Process PID With PsLookupProcessByProcessId

#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。

有人可以帮我吗?

but in the 30 line he doesn't print anything

你试试这么说

DbgPrint((CHAR*)UniqueProcessId);

不打印任何内容。

DbgPrint 接受指向格式 string 的指针以在第一个参数中打印。但是 (CHAR*)UniqueProcessId 不是字符串,即使您将它转换为 (CHAR*)。如果 UniqueProcessId 有效值 - 它很小,通常小于 0x10000,并且对该位置的内存访问(DbgPrint 将尝试读取此“字符串”)必须导致 exception/bsod。但是因为使用 EPROCESS 的硬编码偏移量 (0x440) 总是错误的——你读的不是进程 UniqueProcessId 而是一些随机数据,这在您的情况下,不小心指向了有效内存。打印的有效代码必须像

DbgPrint("UniqueProcessId=%p\n",UniqueProcessId);

还有你在这一行之前的所有代码,没有意义并且包含严重错误