サードパーティのバイナリ(ソースなし)の起動が遅い場合のトラブルシューティングを試みています。これは、64ビットWindows 7上で動作する32ビットアプリケーションです。WOW64でHANDLE作成をトラップする
起動時にCPU使用率が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
のブレークポイントは決して起動されません(プロセスエクスプローラがパス\Device\NamedPipe\
を持つ別のハンドルを表示したために奇妙です)。
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:
は参考のため、ここではWindowsのx64でNtCreateFile
をトレースするためのコマンド(akak ZwCreateFile
)です。
File
のハンドルは他にどこから来ますか?他のHANDLE作成関数は実際のシステムコールのためにNtCreateFile
に委譲していませんか?
スタートアップを監視するプロセスモニターとも考えましたか? 2つ目のオプションは、windbgからのカーネルの側面を調べるためにlivekdされます。 – deemok
@deemok:はい、私が知る限り、procmonはタイムアウトした 'ReadFile'呼び出しを見ていません。私はカーネルデバッガを走らせることができたと思いますが、VMはそれほど悪くないでしょうが、私はそれを避けようとしています。すべての必要な情報は、ユーザーモードで利用可能でなければなりません.HANDLEを作成するAPIがあれば、呼び出しが行われます。 –
'NtCreateFile'が' HANDLE'を得る際に呼び出される唯一のシステムルーチンであるかどうかわかりません。それにもかかわらず、「ハンドル」特性を発見する方法があるはずだと私は信じています。特定のプロセスの中で 'HANDLE'は根底にある' FILE_OBJECT'に対応していなければなりません(もちろんファイルハンドルであれば)。あなたは 'ObReferenceObjectByHandle'を使用して、そのファイルハンドルを確認し(' ObjectType'をチェックして)、オブジェクトデータを 'FILE_OBJECT'にキャストすることができます。'DRIVER_OBJECT'へのポインタを含む' DEVICE_OBJECT'へのポインタを含んでいます。理論的にはすべてが見つかります – valdo