!ndiskd.oid

!ndiskd.oid 扩展显示有关 NDIS OID 请求的信息。 如果在没有参数的情况下运行此扩展,!ndiskd 将显示所有微型端口和筛选器上所有挂起的 OID 请求的列表。 每个微型端口或筛选器最多具有一个挂起的 OID 请求和任意数量的排队 OID 请求。

请注意:筛选器通常克隆 OID 请求,并向下传递克隆。 这意味着,即使协议发出单个 OID 请求,也可能有多个克隆请求实例:一个在每个筛选器中,另一个在微型端口中。 !ndiskd.oid 将分别显示每个克隆,因此你可能会看到比协议实际发布的 OID 更多的挂起 OID。

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

参数

-handle
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 微型驱动程序的句柄 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 OIDs

NDIS OID 请求接口