!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 bug 检查 情况(DRIVER_POWER_STATE_FAILURE)时非常有用。 例如,假设分析虚构的0x9F bug 检查显示系统已挂在 IRP 上,并且正在等待 NDIS。 在 NDIS 中,OS 中的 IRP 转换为 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

单击微型驱动程序的句柄,然后单击其详细信息页面底部的“处理程序”链接以查看其处理程序列表。 也可以输入 !ndiskd.minidriver -handle -handlers 命令。 获得微型驱动程序的处理程序列表后,在此示例中查找 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

现在,单击 OidRequestHandler 右侧的“bp”链接,或使用其句柄输入 bp -handle 命令,以在该例程上设置断点。 接下来,键入 g 命令以允许调试者目标计算机运行并命中刚刚设置的断点。

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

在微型驱动程序的 OID 请求处理程序例程上触发断点后,可以运行 !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 挂起 OID_GEN_STATISTICS。 查看 !ndiskd.oid 的结果时,请回顾一下,筛选器克隆 OID 请求并将其传递到堆栈,并且 OID 通常从筛选器传递到筛选器到微型端口。 因此,尽管此示例中可能有三个单独的 OID 请求具有相同名称,但实际上发生了一个逻辑作,该作在物理上分布在 3 个 OID 和 3 个驱动程序上。

另请参阅

网络驱动程序设计指南

Windows Vista 和更高版本的网络参考

调试网络堆栈

NDIS 扩展 (Ndiskd.dll)

!ndiskd.help

0x9F bug 检查

OID_PNP_SET_POWER

bp、bu、bm (设置断点)

OID_GEN_STATISTICS

NDIS OID

NDIS OID 请求接口