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

使用KMDF的MmCopyVirtualMemory()与PsGetCurrentProcess()时出现类型不兼容错误

解决MmCopyVirtualMemory参数类型不兼容的IntelliSense错误

问题分析

你遇到的这个看似矛盾的错误(提示PEPROCESS类型不兼容,但两边参数都是PEPROCESS),本质是VS的IntelliSense类型识别异常,或是内核编程环境配置、头文件引用的问题,而非代码逻辑错误。

解决步骤

  1. 确保核心头文件正确引用
    内核模式代码必须首先包含ntddk.h,它定义了所有必要的内核类型(如PEPROCESS)和函数原型(如PsGetCurrentProcess、MmCopyVirtualMemory):

    #include <ntddk.h>
    
  2. 检查WDK版本配置
    确认项目使用的WDK版本与目标Windows系统版本匹配。部分旧版WDK中PsGetCurrentProcess()的返回类型曾被定义为PKPROCESS,若遇到这种情况,可显式转换类型消除错误:

    (PEPROCESS)PsGetCurrentProcess()
    
  3. 重置IntelliSense缓存
    VS的IntelliSense缓存偶尔会出现过期或错误,可通过以下操作重置:

    • 执行项目 -> 清理解决方案
    • 删除项目目录下的隐藏.vs文件夹
    • 重新生成解决方案
  4. 排查类型定义冲突
    确保代码中没有自定义的PEPROCESS类型别名,避免与系统定义的类型冲突。

修正后的代码示例

#include <ntddk.h>

bool read_kernel_memory(HANDLE pid, PVOID address, PVOID buffer, SIZE_T size) {
    if (!address || !buffer || !size)
        return false;

    SIZE_T bytes_copied = 0;
    PEPROCESS target_process = NULL;
    NTSTATUS status = PsLookupProcessByProcessId(pid, &target_process);
    if (!NT_SUCCESS(status)) {
        DbgPrintEx(0, 0, "PsLookupProcessByProcessId failed (status: 0x%X)\n", status);
        return false;
    }

    status = MmCopyVirtualMemory(
        target_process,
        address,
        PsGetCurrentProcess(),
        buffer,
        size,
        KernelMode,
        &bytes_copied
    );

    return NT_SUCCESS(status);
}

补充说明

PEPROCESS是内核管理的对象,无需手动释放,系统会自动处理其生命周期。

内容的提问来源于stack exchange,提问作者Sergei Kiselev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 16:50:22