gpt4 book ai didi

c++ - 如何在过滤器驱动程序中获取当前进程镜像文件全名?

转载 作者:太空宇宙 更新时间:2023-11-04 02:34:27 28 4
gpt4 key购买 nike

在过滤器驱动程序中,我可以调用 IoGetCurrentProcess 来获取 PEPROCESS 结构,然后调用 PsGetProcessImageFileName 来获取文件名。

我的问题是如何获得过程镜像文件的完整名称?

最佳答案

您可以使用信息类为 27 的 ZwQueryInformationProcess。以下代码使用此例程从进程的句柄中获取完整的图像文件名。

NTSTATUS GetProcessNameByHandle(_In_ HANDLE ProcessHandle, _Out_ PUNICODE_STRING *Name)
{
ULONG retLength = 0;
ULONG pniSize = 512;
PUNICODE_STRING pni = NULL;
NTSTATUS status = STATUS_UNSUCCESSFUL;

do {
pni = (PUNICODE_STRING)ExAllocatePoolWithTag(PagedPool, pniSize, POOL_TAG);
if (pni != NULL) {
status = ZwQueryInformationProcess(ProcessHandle, 27, pni, pniSize, &retLength);
if (!NT_SUCCESS(status)) {
ExFreePoolWithTag(pni, POOL_TAG);
pniSize *= 2;
}
} else status = STATUS_INSUFFICIENT_RESOURCES;
} while (status == STATUS_INFO_LENGTH_MISMATCH);

if (NT_SUCCESS(status))
*Name = pni;

return status;
}

您可以通过以下方式获取进程句柄:

  • ObOpenObjectByPointer,您需要进程的 EPROCESS 地址(PsLookupProcessByProcessId 可能有帮助)。

  • ZwOpenProcess – 您需要知道目标进程的 PID。

然而,在微过滤器的前/后回调的每次调用中使用此代码可能会非常耗时。我通过在使用 PID 作为键的哈希表中缓存进程名称来解决这个问题。通知例程 (PsSetXXXNotifyRoutine(Ex)) 在构建和管理此类表时可能非常有用。

关于c++ - 如何在过滤器驱动程序中获取当前进程镜像文件全名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39348630/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com