Compartilhar via


!ndiskd.oid

A extensão !ndiskd.oid exibe informações sobre uma solicitação de OID do NDIS. Se você executar essa extensão sem parâmetros, o !ndiskd exibirá uma lista de todas as solicitações OID pendentes em todos os miniportos e filtros. Cada miniporto ou filtro tem no máximo uma solicitação OID pendente e qualquer número de solicitações OID na fila.

Observe que 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 no miniporto. !ndiskd.oid mostrará cada clone separadamente, para que você possa ver mais OIDs pendentes do que o protocolo realmente emitido.

!ndiskd.oid [-handle <x>] [-legacyoid] [-nolimit>] [-miniport <x>] 

Parâmetros

-manejar
Identificador de um NDIS_OID_REQUEST

-legacyoid
Trata como uma NDIS_REQUEST herdada em vez de uma NDIS_OID_REQUEST.

-nolimit
Não limita o número de OIDs pendentes que são exibidos.

-miniport
Localiza solicitações OID pendentes na pilha deste miniporto.

DLL

Ndiskd.dll

Observações

!ndiskd.oid mostra uma lista de todos os OIDs pendentes no sistema de cada vez, para que ele possa ser útil na depuração de travamentos do sistema ou 0x9F situações de verificação de bugs (DRIVER_POWER_STATE_FAILURE). Por exemplo, suponha que a análise de uma verificação de bug 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, portanto, executando !ndiskd.oid , você pode ver que, neste exemplo, um dispositivo na parte inferior da pilha pode estar se agarrando a um OID_PNP_SET_POWER e travado o restante da pilha. Os drivers NDIS não devem aguardar uma OID por mais de um segundo, portanto, você pode investigar por que esse dispositivo manteve a OID pendente por muito tempo para tentar resolver o problema.

Exemplos

Para ver um exemplo de OIDS pendente em um sistema em execução normalmente, defina um ponto de interrupção na rotina do manipulador de solicitação OID de um miniporto (no driver de miniporto correspondente do miniporto). Primeiro, execute o comando !ndiskd.minidriver sem parâmetros para obter uma lista de drivers de miniporto no sistema. Nesta saída de 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 "Manipuladores" na parte inferior de sua página de detalhes para ver a lista de seus manipuladores. Como alternativa, você pode inserir o comando !ndiskd.minidriver -handle -handlers . Depois de ter a lista dos manipuladores 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 seu identificador para definir um ponto de interrupção nessa rotina. Em seguida, digite o comando g para permitir que o computador de destino de depurador seja executado e atinja 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 disparar o ponto de interrupção na rotina do manipulador 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. Ao examinar os resultados de !ndiskd.oid, lembre-se de que os filtros clonam solicitações de OID e as transmitem para baixo na pilha, e os OIDs normalmente são passados do filtro para o filtro para o miniporto. Portanto, embora possa parecer que há três solicitações OID separadas com o mesmo nome neste exemplo, na verdade, há uma operação lógica em andamento que foi fisicamente distribuída entre 3 OIDs e em 3 drivers.

Consulte também

Guia de design do driver de rede)

Referência de rede posterior e do Windows Vista

Depurando a pilha de rede

Extensões de NDIS (Ndiskd.dll)

!ndiskd.help

0x9F verificação de bugs

OID_PNP_SET_POWER

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

OID_GEN_STATISTICS

NDIS OIDs

Interface de solicitação OID do NDIS