Я пытаюсь устранить проблемы с медленным запуском стороннего бинарного файла (без источника). Это 32-битное приложение, работающее в 64-битной Windows 7.
Я использовал отладчик, чтобы проникнуть в приложение, когда оно зависло с использованием ЦП 0% во время запуска, и, похоже, оно ожидает возврата 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\
).
Для справки, вот команда для трассировки NtCreateFile
(он же ZwCreateFile
) в Windows x64:
bp ntdll!NtCreateFile "!ustr poi(@r8+10) ; r $t0 = @rcx ; gu ; dd @$t0 L1 ; gc"
Спасибо Skywing за то, что указали мне правильное направление.
Откуда еще может взяться HANDLE типа File
? Разве другие функции создания HANDLE не делегируют NtCreateFile
для фактического системного вызова (я думаю, что нет)?
ReadFile
, время ожидания которого истекло. Думаю, я мог бы запустить отладчик ядра, с виртуальной машиной это было бы не так уж плохо, но я пытался этого избежать. Вся необходимая информация должна быть доступна в пользовательском режиме во время вызова любого API, создающего HANDLE. - person Ben Voigt   schedule 23.03.2012NtCreateFile
единственной системной процедурой, вызываемой при полученииHANDLE
. Но я считаю, что должен быть способ обнаружить свойстваHANDLE
, тем не менее. В конкретном процессеHANDLE
должен соответствовать основномуFILE_OBJECT
(если это дескриптор файла, конечно). Вы можете использоватьObReferenceObjectByHandle
, проверить, что это дескриптор файла (проверьтеObjectType
), а затем преобразовать данные объекта вFILE_OBJECT
. Среди прочего он содержит указатель наDEVICE_OBJECT
, который содержит указатель наDRIVER_OBJECT
. Так что теоретически все можно открыть - person valdo   schedule 23.03.2012Sysinternals Handle
? Он описывается как эквивалент командной строки Process Explorer. Попробую версию от Sysinternals, я не запускаю бинарники, скачанные с какого-то неизвестного русского веб-сервера. Нет, дескриптор также не отображается в выводеhandle.exe
. - person Ben Voigt   schedule 23.03.2012-c
дляhandle.exe
, он находит ранее не включенный в список дескриптор f0 и называет его\Device\NamedPipe
. Как и вариант-a
. Однако я не думаю, что это был истинный путь, который был открыт. - person Ben Voigt   schedule 23.03.2012!handle
, когда отладчик прерывается при входе в процесс, а он еще не существует. - person Ben Voigt   schedule 23.03.2012