Windows内核驱动调用GetProcessImageFileNameW时LPWSTR未初始化错误如何解决
问题原因
- 变量类型定义错误:你当前写的
LPWSTR path[MAX_PATH]本质是长度为MAX_PATH的宽字符指针数组,数组内的每个指针元素都没有初始化,所以编译器会直接抛出未初始化内存的错误。 - API调用场景错误:
GetProcessImageFileNameW属于Win32用户态API,不能直接在内核驱动代码中调用,强制调用会触发内核态异常。
解决方案
1. 修正缓冲区定义
将指针数组替换为实际的宽字符缓冲区,提前初始化即可解决编译报错:
// 定义MAX_PATH长度的宽字符缓冲区,初始化为0 WCHAR path[MAX_PATH] = {0};
2. 替换为内核态适配的进程路径获取逻辑
内核态下需要使用ZwQueryInformationProcess搭配ProcessImageFileName信息类获取进程镜像路径,示例代码如下:
#include <ntddk.h> #include <ntstatus.h> // 声明ProcessImageFileName信息类对应结构 typedef struct _PROCESS_IMAGE_FILE_NAME { UNICODE_STRING Name; WCHAR Buffer[MAX_PATH]; } PROCESS_IMAGE_FILE_NAME, *PPROCESS_IMAGE_FILE_NAME; NTSTATUS GetProcessImagePath(HANDLE hProcess, PUNICODE_STRING pOutImageName) { NTSTATUS status; PROCESS_IMAGE_FILE_NAME imageInfo = {0}; ULONG returnLength = 0; status = ZwQueryInformationProcess( hProcess, ProcessImageFileName, &imageInfo, sizeof(imageInfo), &returnLength ); if (!NT_SUCCESS(status)) { DbgPrint("ZwQueryInformationProcess failed, status: 0x%X\n", status); return status; } // 拷贝结果到输出参数 RtlCopyUnicodeString(pOutImageName, &imageInfo.Name); return STATUS_SUCCESS; }
补充用户态适配代码
如果你是在用户态代码中使用GetProcessImageFileNameW,修正缓冲区定义后就可以正常调用,修正后的代码如下:
WCHAR path[MAX_PATH] = {0}; if (GetProcessImageFileNameW(hProcess, path, MAX_PATH) == 0) { DbgPrint("Can't get the process image name, error: %d\n", GetLastError()); return; }
内容的提问来源于stack exchange,提问作者tantan
相关产品推荐
相关产品推荐

