Проверка на наличие застрявших потоков
Для нормальной работы RPC требуются рабочие потоки. Распространенная проблема заключается в том, что некоторые компоненты в том же процессе будут взаимоблокироваться при удержании одного из глобальных критически важных разделов (например, блокировки загрузчика или блокировки кучи). Это приведет к зависаю многих потоков, в том числе некоторых рабочих потоков RPC.
В этом случае сервер RPC не будет реагировать на внешний мир. Вызовы RPC будут возвращать RPC_S_SERVER_UNAVAILABLE или RPC_S_SERVER_TOO_BUSY.
Аналогичная проблема может возникнуть, если неисправный драйвер не позволяет выполнить irps и достичь сервера RPC.
Если вы подозреваете, что может возникнуть одна из этих проблем, используйте DbgRpc с параметром -t (или используйте расширение !rpcexts.getthreadinfo ). Идентификатор процесса следует использовать в качестве параметра. В следующем примере предположим, что идентификатор процесса 0xC4:
D:\wmsg>dbgrpc -t -P c4
Searching for thread info ...
## PID CELL ID ST TID LASTTIME
-----------------------------------
00c4 0000.0004 03 0000011c 000f164f
00c4 0000.0007 03 00000120 008a6290
00c4 0000.0015 03 0000018c 008a6236
00c4 0000.0026 03 00000264 0005c443
00c4 0000.002d 03 00000268 000265bb
00c4 0000.0030 03 0000026c 000f1d32
00c4 0000.0034 03 00000388 007251e9
Столбец TID предоставляет идентификатор потока для каждого потока. Столбец LASTTIME содержит метку времени последнего изменения состояния для каждого потока.
Всякий раз, когда сервер получает запрос, по крайней мере один поток будет изменять состояние, а его метка времени будет обновлена. Таким образом, если запрос RPC выполняется к серверу и запрос завершается сбоем, но ни одна из меток времени не изменяется, это означает, что запрос фактически не достигает времени выполнения RPC. Вы должны исследовать причину этого.