我正在尝试解决第三方二进制文件的缓慢启动问题(无源)。它是在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确实显示了另一个路径为\Device\NamedPipe\
的句柄)。
供参考,以下是在Windows x64上跟踪NtCreateFile
(akak ZwCreateFile
)的命令:
bp ntdll!NtCreateFile "!ustr poi(@r8+10) ; r $t0 = @rcx ; gu ; dd @$t0 L1 ; gc"
Thanks to Skywing for pointing me in the right direction on that
类型File
的HANDLE还能来自哪里?其他HANDLE创建函数是否委托给NtCreateFile
实际的系统调用(我猜不是)?
答案 0 :(得分:1)
看起来你只能在进行内核调试时获取文件句柄信息。所以有3种选择。
答案 1 :(得分:1)
句柄可以继承,也可以由DuplicateHandle()创建。您可以尝试在句柄上调用GetFileInformationByHandleEx并查询FileNameInfo。