!ndiskd.oid
A extensão !ndiskd.oid exibe as informações sobre uma solicitação NDIS OID. Se você executar essa extensão sem parâmetros, !ndiskd exibirá uma lista de todas as solicitações OID pendentes em todas as miniportas e filtros. Cada miniporta ou filtro tem no máximo uma solicitação OID pendente e qualquer número de solicitações OID enfileiradas.
Os filtros normalmente clonam solicitações OID e passam o clone para baixo. Isso significa que, mesmo que um protocolo emita uma única solicitação OID, pode haver várias instâncias de solicitações clonadas: uma em cada filtro e outra na miniporta. !ndiskd.oid mostrará cada clone separadamente, então você pode ver mais OIDs pendentes do que o protocolo emitiu.
!ndiskd.oid [-handle <x>] [-legacyoid] [-nolimit>] [-miniport <x>]
Parâmetros
-manejar
Identificador de um NDIS_OID_REQUEST
-legado
Trata como um NDIS_REQUEST legado em vez de um NDIS_OID_REQUEST.
-sem limite
Não limita o número de OIDs pendentes que são exibidos.
-miniporto
Localiza solicitações OID pendentes na pilha desta miniporta.
DLL
Ndiskd.dll
Comentários
!ndiskd.oid mostra uma lista de todos os OIDs pendentes no sistema de cada vez, para que possa ser útil na depuração de travamentos do sistema ou situações de verificação de bugs 0x9F (DRIVER_POWER_STATE_FAILURE). Por exemplo, suponha que a análise de uma verificação de bugs 0x9F fictícia revelou que o sistema estava travado em um IRP e estava aguardando NDIS. No NDIS, os IRPs do sistema operacional são convertidos em OIDs, incluindo transições de energia. Assim, executando !ndiskd.oid, você pode ver que, neste exemplo, um dispositivo na parte inferior da pilha pode ter se agarrado a um OID_PNP_SET_POWER e pendurado o resto da pilha. Os drivers NDIS não devem gastar um OID por mais de um segundo, então você pode investigar por que esse dispositivo manteve o OID pendente por muito tempo para tentar resolver o problema.
Exemplos
Para ver um exemplo de OIDS pendentes em um sistema que está funcionando normalmente, defina um ponto de interrupção na rotina do processador de solicitações OID de uma miniporta (no driver correspondente da miniporta). Primeiro, execute o comando !ndiskd.minidriver sem parâmetros para obter uma lista com os drivers de miniporta no sistema. Nesta saída do exemplo, procure o identificador do minidriver kdnic, ffffdf801418d650.
3: kd> !ndiskd.minidriver
ffffdf8015a98380 - tunnel
ffffdf801418d650 - kdnic
Clique no identificador do minidriver e, em seguida, clique no link "Processadores" na parte inferior da página de detalhes para ver a lista dos processadores. Como alternativa, você pode inserir o comando !ndiskd.minidriver -handle -handlers. Depois de ter a lista dos processadores do minidriver, procure o OidRequestHandler, cujo identificador é fffff80f1fd71c90 neste exemplo.
2: kd> !ndiskd.minidriver ffffdf801418d650 -handlers
HANDLERS
NDIS Handler Function pointer Symbol (if available)
InitializeHandlerEx fffff80f1fd78230 bp
SetOptionsHandler fffff80f1fd72800 bp
HaltHandlerEx fffff80f1fd78040 bp
ShutdownHandlerEx fffff80f1fd722c0 bp
CheckForHangHandlerEx fffff80f1fd72810 bp
ResetHandlerEx fffff80f1fd72f70 bp
PauseHandler fffff80f1fd78000 bp
RestartHandler fffff80f1fd78940 bp
OidRequestHandler fffff80f1fd71c90 bp
CancelOidRequestHandler fffff80f1fd722c0 bp
DirectOidRequestHandler [None]
CancelDirectOidRequestHandler [None]
DevicePnPEventNotifyHandler fffff80f1fd789a0 bp
SendNetBufferListsHandler fffff80f1fd71870 bp
ReturnNetBufferListsHandler fffff80f1fd71b50 bp
CancelSendHandler fffff80f1fd722c0 bp
Agora clique no link "bp" à direita do OidRequestHandler ou insira o comando bp -handle com o identificador para definir um ponto de interrupção nessa rotina. Em seguida, digite o comando g para permitir que o computador de destino de depuração seja executado e acerte o ponto de interrupção que você acabou de definir.
2: kd> bp fffff80f1fd71c90
2: kd> g
Breakpoint 1 hit
fffff80f`1fd71c90 448b4204 mov r8d,dword ptr [rdx+4]
Depois de acionar o ponto de interrupção na rotina do processador de solicitações OID de um minidriver, conforme mostrado pelo exemplo anterior, você pode executar o comando !ndiskd.oid para ver uma lista de todos os OIDs pendentes no sistema.
1: kd> !ndiskd.oid
ALL PENDING OIDs
NetAdapter ffffdf80140c71a0 - Microsoft Kernel Debug Network Adapter
Current OID OID_GEN_STATISTICS
Filter ffffdf8014950c70 - Microsoft Kernel Debug Network Adapter-WFP Native MAC Layer LightWeight Filter-0000
Current OID OID_GEN_STATISTICS
Filter ffffdf801494dc70 - Microsoft Kernel Debug Network Adapter-QoS Packet Scheduler-0000
Current OID OID_GEN_STATISTICS
Neste exemplo, o OID pendente é OID_GEN_STATISTICS. Quando você olhar os resultados do !ndiskd.oid, lembre-se de que os filtros clonam solicitações OID e as transmitem pela pilha, e os OIDs normalmente são passados de filtro para filtro para miniporta. Portanto, embora possa parecer que há três solicitações OID separadas com o mesmo nome neste exemplo, há na verdade uma operação lógica ocorrendo que foi fisicamente espalhada em 3 OIDs e em 3 drivers.
Confira também
Guia de design para driver de rede
Referência de rede do Windows Vista e posterior