7

我正在尝试解决第三方二进制文件(无源)启动缓慢的问题。它是在 64 位 Windows 7 上运行的 32 位应用程序。

我使用调试器闯入应用程序,而它在启动期间以 0% 的 CPU 使用率挂起,并且似乎正在等待ReadFile返回。第一个参数ReadFile是句柄值,000000f0。windbg 的!handle命令告诉我:

Handle f0
  Type            File
  Attributes      0
  GrantedAccess   0x120189:
         ReadControl,Synch
         Read/List,ReadEA,ReadAttr,WriteAttr
  HandleCount     2
  PointerCount    4
  No Object Specific Information available

我想知道这对应的是什么设备。但 Sysinternals Process Explorer 并未将此句柄包含在其进程句柄列表中。

我使用 windbg 跟踪所有调用ntdll!NtCreateFile并打印路径和返回的句柄:这个句柄不在其中。kernel32!CreateNamedPipeW,kernel32!CallNamedPipeW和上的断点kernel32!WaitNamedPipeW永远不会被触发(这很奇怪,因为 Process Explorer 确实显示了另一个带有 path 的句柄\Device\NamedPipe\)。

作为参考,这里是在 Windows x64 上跟踪NtCreateFile(akak ) 的命令:ZwCreateFile

bp ntdll!NtCreateFile "!ustr poi(@r8+10) ; r $t0 = @rcx ; gu ; dd @$t0 L1 ; gc"

感谢 Skywing 为我指明了正确的方向

类型的 HANDLE 还能File从哪里来?其他 HANDLE 创建函数不委托给NtCreateFile实际的系统调用(我猜不是)吗?

4

2 回答 2

1

句柄可以被继承,也可以由 DuplicateHandle() 创建。您可以尝试在句柄上调用GetFileInformationByHandleEx并查询 FileNameInfo。

于 2012-03-23T00:14:50.150 回答
1

看起来您只能在进行内核调试时获取文件句柄信息。所以有3个选项。

  1. 进行本地机器内核调试,这应该不是问题,因为您只需要获取文件句柄信息并且将保持静态。请参阅以下内容:http: //msdn.microsoft.com/en-us/library/windows/hardware/ff553382 (v=vs.85).aspx
  2. 对 VM 机器进行远程内核调试。“更安全”的意思是你不能炸毁你的机器。
  3. 蓝屏你的盒子并以这种方式查看转储。对你的盒子做同样不是一件好事,但我过去做过类似的事情,当我需要能够在不改变机器状态的情况下对机器进行全面分析时。
于 2012-03-22T22:54:44.040 回答