Identificazione del chiamante dal thread del server
È possibile determinare cosa ha effettuato una determinata chiamata RPC, anche se le uniche informazioni disponibili sono il thread del server che ha eseguito la chiamata.
Ciò può essere molto utile, ad esempio per scoprire chi ha passato parametri non validi a una chiamata RPC.
A seconda della sequenza di protocollo usata da questa particolare chiamata, è possibile ottenere diversi gradi di dettaglio. Alcuni protocolli (ad esempio NetBios) non dispongono di queste informazioni.
Identificazione del chiamante dal thread del server
Avviare un debugger in modalità utente con il thread del server come destinazione.
Ottenere l'ID del processo usando | (Stato processo) Comando:
0:001> | 0 id: 3d4 name: rtsvr.exe
Ottenere le chiamate attive in questo processo usando l'estensione !rpcexts.getcallinfo . Per una spiegazione della sintassi, vedere la pagina di riferimento. È necessario specificare l'ID processo di 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
Cercare le chiamate con stato 02 o 01 (inviato o attivo). In questo esempio, il processo ha una sola chiamata. In caso contrario, è necessario usare l'estensione !rpcexts.getdbgcell con il numero di cella nella colonna THRDCELL. In questo modo è possibile esaminare gli ID del thread in modo da poter determinare la chiamata a cui si è interessati.
Dopo aver appreso la chiamata a cui si è interessati, esaminare il numero di cella nella colonna CONN/CLN. Si tratta dell'ID cella dell'oggetto connessione. In questo caso, il numero di cella è 0000,0003. Passare questo numero di cella e l'ID del processo a !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
Questa estensione visualizzerà tutte le informazioni disponibili sul client di questa connessione. La quantità di informazioni effettive varia a seconda del trasporto utilizzato.
In questo esempio, le named pipe locali vengono usate come trasporto e viene visualizzato l'indirizzo dell'oggetto processo del chiamante. Se si collega un debugger del kernel (o si avvia un debugger del kernel locale), è possibile usare l'estensione !process per interpretare l'indirizzo del processo.
Se LRPC viene usato come trasporto, verrà visualizzato l'ID del processo e l'ID del thread del chiamante.
Se TCP viene usato come trasporto, verrà visualizzato l'indirizzo IP del chiamante.
Se le named pipe remote vengono utilizzate come trasporto, non saranno disponibili informazioni.
Nota Nell'esempio precedente viene illustrato come trovare il thread client se si conosce il thread del server. Per un esempio della tecnica inversa, vedere Analisi di un problema di chiamata bloccata.