You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 04:21:03