Compartilhar via


!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

Depuração da pilha de rede

Extensões NDIS (Ndiskd.dll)

!ndiskd.help

Verificação de bugs 0x9F

OID_PNP_SET_POWER

bp, bu, bm (Definir ponto de interrupção)

OID_GEN_STATISTICS

OIDs NDIS

Interface de solicitação OID NDIS