サーバー スレッドからの呼び出し元の特定
特定の RPC 呼び出しを行った内容を特定できます。これは、呼び出しを処理したサーバー スレッドだけが情報である場合でも可能です。
これは非常に便利です。たとえば、RPC 呼び出しに無効なパラメーターを渡したユーザーを調べる場合などです。
この特定の呼び出しで使用されるプロトコル シーケンスに応じて、さまざまな詳細度を取得できます。 一部のプロトコル (NetBios など) には、この情報がまったくありません。
サーバースレッドから呼び出し元を特定する
サーバー スレッドをターゲットとして使用してユーザー モード デバッガーを開始します。
| を使用してプロセス ID を取得します。 (プロセスステータス)コマンド:
0:001> | 0 id: 3d4 name: rtsvr.exe
!rpcexts.getcallinfo 拡張機能を使用して、このプロセスでアクティブな呼び出しを取得します。 (構文の説明については、リファレンス ページを参照してください)。0x3D4のプロセス ID を指定する必要があります。
0:001> !rpcexts.getcallinfo 0 0 FFFF 3d4 Searching for call info ... PID CELL ID ST PNO IFSTART THRDCELL CALLFLAG CALLID LASTTIME CONN/CLN ---------------------------------------------------------------------------- 03d4 0000.0004 02 000 19bb5061 0000.0002 00000001 00000001 00a1aced 0000.0003
状態 02 または 01 (ディスパッチ済みまたはアクティブ) の通話を探します。 この例では、プロセスの呼び出しは 1 つだけです。 それ以上ある場合は、THRDCELL 列の セル番号と共に !rpcexts.getdbgcell 拡張子を使用する必要があります。 これにより、スレッド ID を調べて、関心のある呼び出しを特定できるようになります。
関心のある呼び出しがわかったら、CONN/CLN 列のセル番号を確認します。 これは、接続オブジェクトのセルIDです。 この場合、セル番号は 0000.0003 です。 このセル番号とプロセス ID を !rpcexts.getdbgcell に渡します。
0:001> !rpcexts.getdbgcell 3d4 0.3 Getting cell info ... Connection Connection flags: Exclusive Authentication Level: Default Authentication Service: None Last Transmit Fragment Size: 24 (0x6F56D) Endpoint for the connection: 0x0.1 Last send time (in seconds since boot):10595.565 (0x2963.235) Last receive time (in seconds since boot):10595.565 (0x2963.235) Getting endpoint info ... Process object for caller is 0xFF9DF5F0
この拡張機能には、この接続のクライアントに関して利用可能なすべての情報が表示されます。 実際の情報の量は、使用されているトランスポートによって異なります。
この例では、ローカルの名前付きパイプがトランスポートとして使用され、呼び出し元のプロセス オブジェクト アドレスが表示されます。 カーネル デバッガーをアタッチする (またはローカル カーネル デバッガーを起動する) 場合は、!process 拡張機能を使用してこのプロセス アドレスを解釈できます。
LRPC がトランスポートとして使用されている場合は、呼び出し元のプロセス ID とスレッド ID が表示されます。
TCP がトランスポートとして使用されている場合は、呼び出し元の IP アドレスが表示されます。
リモートの名前付きパイプがトランスポートとして使用されている場合、情報は使用できません。
注: 前の例は、サーバー スレッドがわかっている場合にクライアント スレッドを検索する方法を示しています。 逆の手法の例については、「スタック呼び出し問題の分析」を参照してください。