Я пытаюсь устранить неполадки, связанные с медленным запуском стороннего двоичного файла (нет источник). Это 32-разрядное приложение, работающее в 64-разрядной версии Windows 7.
Я использовал отладчик, чтобы взломать приложение, когда оно зависло с 0% загрузкой ЦП во время запуска, и, похоже, оно ожидает ReadFile
для возврата. Первый аргумент ReadFile
— значение дескриптора, 000000f0. Команда Windbg !handle
говорит мне:
Ручка f0 Тип файла Атрибуты 0 Предоставленный доступ 0x120189: Контроль чтения, синхронизация Чтение/список, ReadEA, ReadAttr, WriteAttr HandleCount 2 PointerCount 4 Нет доступной конкретной информации об объекте
Я хочу знать, какому устройству это соответствует. Но 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
фактический системный вызов (наверное, нет)?