Identificación del autor de la llamada desde el subproceso del servidor
Es posible determinar lo que realizó una llamada RPC determinada, incluso si la única información que tiene es el subproceso del servidor que ha prestado servicio a la llamada.
Esto puede ser muy útil, por ejemplo, para averiguar quién pasó parámetros no válidos a una llamada RPC.
Dependiendo de la secuencia de protocolo que use esta llamada en particular, puede obtener distintos grados de detalle. Algunos protocolos (como NetBios) no tienen esta información en absoluto.
Identificación del autor de la llamada desde el subproceso del servidor
Inicie un depurador en modo de usuario con el subproceso de servidor como destino.
Obtención del identificador de proceso mediante | (Estado del proceso) Comando:
0:001> | 0 id: 3d4 name: rtsvr.exe
Obtenga las llamadas activas en este proceso mediante la extensión !rpcexts.getcallinfo . (Vea la página de referencia para obtener una explicación de la sintaxis). Debe proporcionar el identificador de proceso 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
Busque llamadas con el estado 02 o 01 (enviado o activo). En este ejemplo, el proceso solo tiene una llamada. Si hubiera más, tendría que usar la extensión !rpcexts.getdbgcell con el número de celda de la columna THRDCELL. Esto le permitiría examinar los identificadores de subproceso para que pudiera determinar qué llamada le interesaba.
Después de saber qué llamada le interesa, examine el número de celda en la columna CONN/CLN. Este es el identificador de celda del objeto de conexión. En este caso, el número de celda es 0000.0003. Pase este número de celda y el identificador de proceso 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
Esta extensión mostrará toda la información disponible sobre el cliente de esta conexión. La cantidad de información real variará, dependiendo del transporte que se utilice.
En este ejemplo, se usan canalizaciones con nombre locales como transporte y se muestra la dirección del objeto de proceso del autor de la llamada. Si asocia un depurador de kernel (o inicia un depurador de kernel local), puede usar la extensión !process para interpretar esta dirección de proceso.
Si se usa LRPC como transporte, se mostrará el identificador de proceso y el identificador de subproceso del autor de la llamada.
Si se usa TCP como transporte, se mostrará la dirección IP del autor de la llamada.
Si se usan canalizaciones con nombre remoto como transporte, no habrá información disponible.
Nota En el ejemplo anterior se muestra cómo buscar el subproceso de cliente si conoce el subproceso de servidor. Para obtener un ejemplo de la técnica inversa, consulte Análisis de un problema de llamada bloqueada.