Identification de l’appelant à partir du thread de serveur
Il est possible de déterminer ce qui a effectué un appel RPC donné, même si les seules informations dont vous disposez sont le thread de serveur qui a pris en compte l’appel.
Cela peut être très utile, par exemple pour déterminer qui a passé des paramètres non valides à un appel RPC.
Selon la séquence de protocole utilisée par cet appel particulier, vous pouvez obtenir différents degrés de détail. Certains protocoles (comme NetBios) ne disposent pas de ces informations.
Identification de l’appelant à partir du thread de serveur
Démarrez un débogueur en mode utilisateur avec le thread serveur comme cible.
Obtenir l’ID de processus à l’aide de | (État du processus) Commande:
0:001> | 0 id: 3d4 name: rtsvr.exe
Obtenez les appels actifs dans ce processus à l’aide de l’extension !rpcexts.getcallinfo . (Consultez la page de référence pour obtenir une explication de la syntaxe.) Vous devez fournir l’ID de processus de 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
Recherchez les appels avec status 02 ou 01 (distribués ou actifs). Dans cet exemple, le processus n’a qu’un seul appel. S’il y avait plus, vous devrez utiliser l’extension !rpcexts.getdbgcell avec le numéro de cellule dans la colonne THRDCELL. Cela vous permettrait d’examiner les ID de thread afin de déterminer l’appel qui vous intéresse.
Une fois que vous savez quel appel vous intéresse, examinez le numéro de cellule dans la colonne CONN/CLN. Il s’agit de l’ID de cellule de l’objet de connexion. Dans ce cas, le numéro de cellule est 0000.0003. Transmettez ce numéro de cellule et l’ID de processus à !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
Cette extension affiche toutes les informations disponibles sur le client de cette connexion. La quantité d’informations réelles varie en fonction du transport utilisé.
Dans cet exemple, les canaux nommés locaux sont utilisés comme transport et l’adresse de l’objet de processus de l’appelant est affichée. Si vous attachez un débogueur de noyau (ou démarrez un débogueur de noyau local), vous pouvez utiliser l’extension !process pour interpréter cette adresse de processus.
Si LRPC est utilisé comme transport, l’ID de processus et l’ID de thread de l’appelant s’affichent.
Si TCP est utilisé comme transport, l’adresse IP de l’appelant s’affiche.
Si des canaux nommés distants sont utilisés comme transport, aucune information n’est disponible.
Note L’exemple précédent montre comment rechercher le thread client si vous connaissez le thread serveur. Pour obtenir un exemple de la technique inverse, consultez Analyse d’un problème d’appel bloqué.