关于RTL_USER_PROCESS_PARAMETERS中CurrentDirectory属性缺失的技术问询
获取进程启动时的工作目录(Minifilter场景)
一、ProcessParameters中的CurrentDirectory是否存在?
存在,但它是未公开的内部结构,不同Windows版本(如Win7/Win10/Win11)的PEB结构偏移、_RTL_USER_PROCESS_PARAMETERS布局会有差异,直接套用网上旧偏移读取大概率出错,导致看不到该字段。
二、如何正确从ProcessParameters获取CurrentDirectory?
使用官方兼容定义(推荐)
微软在WDK的ntddk.h/winternl.h中提供了_PEB和_RTL_USER_PROCESS_PARAMETERS的部分兼容定义,你可以基于此读取:- 先获取目标进程PEB中的
ProcessParameters指针(类型为PRTL_USER_PROCESS_PARAMETERS) CurrentDirectory是RTL_DRIVE_LETTER_CURDIR类型字段,包含目录路径的Unicode字符串- 伪代码示例:
// 假设已拿到目标进程的PEB指针pPeb PRTL_USER_PROCESS_PARAMETERS pParams = pPeb->ProcessParameters; if (pParams != NULL) { UNICODE_STRING currentDir = pParams->CurrentDirectory.DosPath; // currentDir.Buffer即为工作目录的Unicode路径 }
注意:需针对目标系统版本编译驱动,或运行时通过
RtlGetVersion判断系统版本后动态计算偏移,避免硬编码偏移引发兼容性问题。- 先获取目标进程PEB中的
动态获取结构偏移
若需跨版本兼容,可通过解析PEB调试符号、或结合RtlImageNtHeader与导出表动态查找CurrentDirectory的偏移,该方式实现复杂,适合需广泛兼容的场景。
三、其他获取途径
- 拦截内核态进程创建系统调用:拦截
NtCreateProcessEx或NtCreateUserProcess,其参数结构体(如关联的OBJECT_ATTRIBUTES)中会传递用户态CreateProcess传入的lpCurrentDirectory信息。 - 从进程对象属性读取:进程创建时,其
OBJECT_ATTRIBUTES中可能包含当前目录的句柄,可通过句柄查询对应路径。 - 通过文件句柄查询路径:若能获取当前目录的文件对象句柄,可调用
IoQueryFileDosDeviceName获取对应的Dos路径。
注意事项
- Minifilter中操作其他进程内存需使用
MmCopyVirtualMemory或ProbeForRead,确保内存访问安全,避免系统崩溃。 - 未公开结构布局可能随Windows更新变化,建议结合系统版本做适配,优先使用官方兼容接口。
内容的提问来源于stack exchange,提问作者Catalin Florea
相关产品推荐
相关产品推荐

