次の方法で共有


サーバー スレッドからの呼び出し元の特定

特定の RPC 呼び出しを行った内容を特定できます。これは、呼び出しを処理したサーバー スレッドだけが情報である場合でも可能です。

これは非常に便利です。たとえば、RPC 呼び出しに無効なパラメーターを渡したユーザーを調べる場合などです。

この特定の呼び出しで使用されるプロトコル シーケンスに応じて、さまざまな詳細度を取得できます。 一部のプロトコル (NetBios など) には、この情報がまったくありません。

サーバースレッドから呼び出し元を特定する

  1. サーバー スレッドをターゲットとして使用してユーザー モード デバッガーを開始します。

  2. | を使用してプロセス ID を取得します。 (プロセスステータス)コマンド:

    0:001> |
      0     id: 3d4 name: rtsvr.exe
    
  3. !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 を調べて、関心のある呼び出しを特定できるようになります。

  4. 関心のある呼び出しがわかったら、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 アドレスが表示されます。

リモートの名前付きパイプがトランスポートとして使用されている場合、情報は使用できません。

注: 前の例は、サーバー スレッドがわかっている場合にクライアント スレッドを検索する方法を示しています。 逆の手法の例については、「スタック呼び出し問題の分析」を参照してください。