!ndiskd.oid
!ndiskd.oid 扩展显示有关 NDIS OID 请求的信息。 如果在没有参数的情况下运行此扩展,!ndiskd 将显示所有微型端口和筛选器上所有挂起的 OID 请求的列表。 每个微型端口或筛选器最多具有一个挂起的 OID 请求和任意数量的排队 OID 请求。
请注意:筛选器通常克隆 OID 请求,并向下传递克隆。 这意味着,即使协议发出单个 OID 请求,也可能有多个克隆请求实例:一个在每个筛选器中,另一个在微型端口中。 !ndiskd.oid 将分别显示每个克隆,因此你可能会看到比协议实际发布的 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 微型驱动程序的句柄 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 个驱动程序上。