共用方式為


識別來自伺服器線程的呼叫端

即使您擁有的唯一資訊是服務呼叫的伺服器線程,也可以判斷指定 RPC 呼叫的內容。

這非常有用,例如,找出誰將無效的參數傳遞至 RPC 呼叫。

根據這個特定呼叫所使用的通訊協定序列,您可以取得不同程度的詳細數據。 某些通訊協定 (,例如 NetBios) 完全沒有此資訊。

從伺服器線程識別呼叫端

  1. 以伺服器線程作為目標啟動使用者模式調試程式。

  2. 使用 | (行程狀態) 命令來取得進程識別碼:

    0:001> |
      0     id: 3d4 name: rtsvr.exe
    
  3. 使用 !rpcexts.getcallinfo 擴充功能,取得此程式中的作用中呼叫。 (如需語法的說明,請參閱參考頁面。) 您需要提供0x3D4的程式識別碼:

    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 的通話, (分派或作用中) 。 在此範例中,進程只有一個呼叫。 如果有的話,您必須使用 !rpcexts.getdbgcell 延伸模組搭配 THRDCELL 數據行中的單元格編號。 這可讓您檢查線程標識碼,以便判斷您感興趣的呼叫。

  4. 知道您感興趣的呼叫之後,請查看 CONN/CLN 數據行中的儲存格號碼。 這是連接物件的單元格標識碼。 在此情況下,單元格編號為 0000.0003。 將此儲存格編號和行程標識碼傳遞至 !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 做為傳輸,則會顯示呼叫端的進程標識碼和線程標識碼。

如果使用 TCP 作為傳輸,則會顯示呼叫端的 IP 位址。

如果使用遠端命名管道作為傳輸,則不會提供任何資訊。

注意 上述範例示範如果您知道伺服器線程,如何尋找用戶端線程。 如需反向技術的範例,請參閱 分析停滯的通話問題