Partager via


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

  1. Démarrez un débogueur en mode utilisateur avec le thread serveur comme cible.

  2. Obtenir l’ID de processus à l’aide de | (État du processus) Commande:

    0:001> |
      0     id: 3d4 name: rtsvr.exe
    
  3. 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.

  4. 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é.