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

关于RTL_USER_PROCESS_PARAMETERS中CurrentDirectory属性缺失的技术问询

获取进程启动时的工作目录(Minifilter场景)

一、ProcessParameters中的CurrentDirectory是否存在?

存在,但它是未公开的内部结构,不同Windows版本(如Win7/Win10/Win11)的PEB结构偏移、_RTL_USER_PROCESS_PARAMETERS布局会有差异,直接套用网上旧偏移读取大概率出错,导致看不到该字段。

二、如何正确从ProcessParameters获取CurrentDirectory?

  1. 使用官方兼容定义(推荐)
    微软在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判断系统版本后动态计算偏移,避免硬编码偏移引发兼容性问题。

  2. 动态获取结构偏移
    若需跨版本兼容,可通过解析PEB调试符号、或结合RtlImageNtHeader与导出表动态查找CurrentDirectory的偏移,该方式实现复杂,适合需广泛兼容的场景。

三、其他获取途径

  • 拦截内核态进程创建系统调用:拦截NtCreateProcessEx或NtCreateUserProcess,其参数结构体(如关联的OBJECT_ATTRIBUTES)中会传递用户态CreateProcess传入的lpCurrentDirectory信息。
  • 从进程对象属性读取:进程创建时,其OBJECT_ATTRIBUTES中可能包含当前目录的句柄,可通过句柄查询对应路径。
  • 通过文件句柄查询路径:若能获取当前目录的文件对象句柄,可调用IoQueryFileDosDeviceName获取对应的Dos路径。

注意事项

  • Minifilter中操作其他进程内存需使用MmCopyVirtualMemory或ProbeForRead,确保内存访问安全,避免系统崩溃。
  • 未公开结构布局可能随Windows更新变化,建议结合系统版本做适配,优先使用官方兼容接口。

内容的提问来源于stack exchange,提问作者Catalin Florea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 06:48:16