使用KMDF的MmCopyVirtualMemory()与PsGetCurrentProcess()时出现类型不兼容错误
解决
MmCopyVirtualMemory参数类型不兼容的IntelliSense错误 问题分析
你遇到的这个看似矛盾的错误(提示PEPROCESS类型不兼容,但两边参数都是PEPROCESS),本质是VS的IntelliSense类型识别异常,或是内核编程环境配置、头文件引用的问题,而非代码逻辑错误。
解决步骤
确保核心头文件正确引用
内核模式代码必须首先包含ntddk.h,它定义了所有必要的内核类型(如PEPROCESS)和函数原型(如PsGetCurrentProcess、MmCopyVirtualMemory):#include <ntddk.h>检查WDK版本配置
确认项目使用的WDK版本与目标Windows系统版本匹配。部分旧版WDK中PsGetCurrentProcess()的返回类型曾被定义为PKPROCESS,若遇到这种情况,可显式转换类型消除错误:(PEPROCESS)PsGetCurrentProcess()重置IntelliSense缓存
VS的IntelliSense缓存偶尔会出现过期或错误,可通过以下操作重置:- 执行
项目 -> 清理解决方案 - 删除项目目录下的隐藏
.vs文件夹 - 重新生成解决方案
- 执行
排查类型定义冲突
确保代码中没有自定义的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
相关产品推荐
相关产品推荐

