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

获取关联进程PID的文件句柄:Windows API查询及代码实现咨询

如何通过Windows API列出指定PID关联的文件句柄

嘿,我刚好深入研究过这个需求——要实现类似Process Explorer的文件句柄枚举功能,核心得依赖Windows的原生内核API,毕竟用户态的公开API没法直接拿到这么底层的信息。下面是具体的实现思路、关键API,还有靠谱的参考资料:

一、核心API与实现步骤

1. 最核心的组合:NtQuerySystemInformation + NtQueryObject

这就是Process Explorer这类工具背后的核心逻辑,步骤如下:

  • 首先调用NtQuerySystemInformation,传入信息类SystemHandleInformation(数值为16),它会返回一个包含系统所有打开句柄的SYSTEM_HANDLE_INFORMATION结构体数组。每个结构体里包含了对应句柄所属的PID、句柄值、对象类型标记等信息。
  • 从返回的数组里过滤出你目标PID对应的所有句柄。
  • 对每个过滤后的句柄,调用NtQueryObject,传入信息类ObjectTypeInformation(数值为2),获取该句柄对应的对象类型名称。如果名称是File,那就是你要找的文件句柄了。
  • 注意:这两个都是未公开的原生API,需要自己声明函数原型,要么静态链接ntdll.lib,要么动态加载ntdll.dll来调用。

2. 备选方案:句柄复制 + 文件属性判断

如果你不想用未公开API,可以先通过OpenProcess获取目标进程的句柄(需要PROCESS_DUP_HANDLE权限),然后尝试复制目标进程的句柄到当前进程,再用GetFileInformationByHandle或GetFileType来判断是否为文件句柄。不过这种方法效率很低,因为要逐个尝试可能的句柄值,而且权限要求严格,不如第一种方案实用。

3. 不推荐的笨办法:遍历句柄值

先调用GetProcessHandleCount拿到目标进程的句柄总数,然后从0开始遍历可能的句柄值,用DuplicateHandle尝试复制,再判断类型。这种方法不仅慢,还容易遗漏或误判,只适合简单测试,不建议正式使用。

二、靠谱的参考资料

  • Windows Driver Kit (WDK) 文档:虽然NtQuerySystemInformation是未公开API,但WDK里有完整的系统信息类、相关结构体的定义说明,比如SYSTEM_HANDLE_INFORMATION、OBJECT_TYPE_INFORMATION的结构细节,这是最权威的官方资料。
  • 《Windows Internals》系列书籍:这本书是Windows内核领域的圣经,详细讲解了句柄管理、内核对象的底层机制,甚至提到了Process Explorer这类工具的实现思路,能帮你从原理上理解整个流程。
  • 开源进程工具的源码:比如Process Explorer的开源版本(或者类似的开源工具如Process Hacker),直接看它们的源码就能明白具体怎么调用API、解析结构体,这是最直观的实践参考。
  • 微软开发者博客:部分官方博客会讲解句柄枚举的场景、权限要求、版本兼容性问题,能帮你避开很多坑。

三、关键注意事项

  • 权限要求:枚举系统句柄需要SE_DEBUG_NAME权限,所以你的程序必须以管理员身份运行,否则会获取不到完整的句柄信息。
  • 结构体对齐:原生API的结构体有特定的内存对齐要求,解析时一定要注意,不然容易出现内存错误或解析失败。
  • 版本兼容性:不同Windows版本的结构体可能有细微变化,比如Windows 10之后SYSTEM_HANDLE_INFORMATION有扩展字段,需要做版本适配。

内容的提问来源于stack exchange,提问作者Richard Smith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 09:19:28