Поделиться через


!ndiskd.oid

Расширение !ndiskd.oid отображает сведения о запросе NDIS OID. Если вы запускаете это расширение без параметров, !ndiskd отобразит список всех ожидающих запросов OID на всех минипортах и фильтрах. Каждый минипорт или фильтр имеет по крайней мере один ожидающий запрос OID и любое количество очередных запросов OID.

Обратите внимание, что фильтры обычно клонировать запросы OID и передают клонирование вниз. Это означает, что даже если протокол выдает один запрос OID, может быть несколько экземпляров клонированных запросов: по одному в каждом фильтре и другом в мини-порте. !ndiskd.oid будет отображать каждый клон отдельно, поэтому вы можете увидеть больше ожидающих OID, чем протокол фактически выдан.

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

Параметры

-ручка
Дескриптор NDIS_OID_REQUEST

-legacyoid
Рассматривается как устаревшая NDIS_REQUEST вместо NDIS_OID_REQUEST.

-nolimit
Не ограничивает количество отображаемых OID.

-miniport
Находит ожидающие запросы OID в стеке мини-порта.

DLL-библиотеки

Ndiskd.dll

Замечания

!ndiskd.oid показывает список всех ожидающих OID в системе за раз, поэтому это может быть полезно в отладке системы зависания или 0x9F ситуаций проверки ошибок (DRIVER_POWER_STATE_FAILURE). Например, предположим, что анализ вымышленного 0x9F проверки ошибок показал, что система была висела на IRP и ждала NDIS. В NDIS irPs из ОС преобразуются в OID, включая переходы питания, поэтому, выполнив !ndiskd.oid , можно увидеть, что в этом примере устройство в нижней части стека, возможно, цепляется к OID_PNP_SET_POWER и зависает остальную часть стека. Драйверы NDIS не должны перо OID в течение более одной секунды, поэтому вы могли бы изучить, почему это устройство держало OID в ожидании слишком долго, чтобы попытаться решить проблему.

Примеры

Чтобы просмотреть пример ожидающих OIDS в системе, работающей обычно, задайте точку останова для подпрограммы обработчика запросов OID мини-порта (в соответствующем драйвере минипорта). Сначала выполните команду !ndiskd.minidriver без параметров, чтобы получить список драйверов минипорта в системе. В этом примере выходных данных найдите дескриптор kdnic minidriver, ffffdf801418d650..

3: kd> !ndiskd.minidriver
    ffffdf8015a98380 - tunnel
    ffffdf801418d650 - kdnic

Щелкните дескриптор мини-driver, а затем щелкните ссылку "Обработчики" в нижней части страницы сведений, чтобы просмотреть список обработчиков. Можно также ввести команду !ndiskd.minidriver -handle -handlers . После получения списка обработчиков мини-driver найдите обработчик OidRequestHandler, дескриптор которого fffff80f1fd71c90 в этом примере.

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

Теперь щелкните ссылку "bp" справа от OidRequestHandler или введите команду bp -handle с его дескриптором , чтобы задать точку останова для этой подпрограммы. Затем введите команду g , чтобы разрешить целевому компьютеру отладки запускаться и нажимать точку останова, которой вы только что задали.

2: kd> bp fffff80f1fd71c90
2: kd> g
Breakpoint 1 hit
fffff80f`1fd71c90 448b4204        mov     r8d,dword ptr [rdx+4]

После активации точки останова в подпрограмме обработчика запросов OID мини-driver, как показано в предыдущем примере, можно запустить команду !ndiskd.oid, чтобы просмотреть список всех ожидающих OID в системе.

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

В этом примере ожидается OID_GEN_STATISTICS OID. При просмотре результатов !ndiskd.oid, помните, что фильтры клонируют запросы OID и передают их по стеку, а OID обычно передаются из фильтра для фильтрации в мини-порт. Таким образом, хотя в этом примере может выглядеть три отдельных запроса OID с одинаковым именем, в этом примере происходит одна логическая операция, которая была физически распределена по 3 OID и на 3 драйверах.

См. также

Руководство по проектированию сетевого драйвера

Справочник по сети Windows Vista и более поздних версий

Отладка сетевого стека

Расширения NDIS (Ndiskd.dll)

!ndiskd.help

проверка ошибок 0x9F

OID_PNP_SET_POWER

bp, bu, bm (Установка точки останова)

OID_GEN_STATISTICS

NDIS OIDs

Интерфейс запроса NDIS OID