!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_OID_REQUEST 대신 레거시 NDIS_REQUEST 처리합니다.
-nolimit
표시되는 보류 중인 OID의 수는 제한하지 않습니다.
-miniport
이 미니포트 스택에서 보류 중인 OID 요청을 찾습니다.
DLL
Ndiskd.dll
설명
!ndiskd.oid 는 시스템의 보류 중인 모든 OID 목록을 한 번에 표시하므로 시스템 중단을 디버깅하거나 버그 확인 상황(DRIVER_POWER_STATE_FAILURE)을 0x9F 데 도움이 될 수 있습니다. 예를 들어 가상의 0x9F 버그 검사를 분석한 결과 시스템이 IRP에 걸려 있고 NDIS를 기다리고 있다고 가정해 보겠습니다. NDIS에서 OS의 IRP는 전원 전환을 포함하여 OID로 변환되므로 !ndiskd.oid를 실행하면 이 예제에서 스택의 맨 아래에 있는 디바이스가 OID_PNP_SET_POWER 달라붙어 스택의 나머지 부분을 중단했을 수 있음을 알 수 있습니다. NDIS 드라이버는 1초 이상 OID를 보류하지 않아야 하므로 해당 디바이스가 문제를 해결하기 위해 OID를 너무 오랫동안 보류 상태로 유지한 이유를 조사할 수 있습니다.
예제
정상적으로 실행되는 시스템에서 보류 중인 OIDS의 예를 보려면 미니포트의 OID 요청 처리기 루틴(미니포트의 해당 미니포트 드라이버)에 중단점을 설정합니다. 먼저 매개 변수 없이 !ndiskd.minidriver 명령을 실행하여 시스템의 미니포트 드라이버 목록을 가져옵니다. 이 예제 출력에서는 kdnic minidriver ffffdf801418d650에 대한 핸들을 찾습니다.
3: kd> !ndiskd.minidriver
ffffdf8015a98380 - tunnel
ffffdf801418d650 - kdnic
미니 드라이버의 핸들을 클릭한 다음 세부 정보 페이지 아래쪽에 있는 "처리기" 링크를 클릭하여 처리기 목록을 확인합니다. 또는 !ndiskd.minidriver -handle -handlers 명령을 입력 할 수 있습니다 . 미니 드라이버의 처리기 목록이 있으면 이 예제에서 핸들이 fffff80f1fd71c90인 OidRequestHandler를 찾습니다.
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개의 드라이버에 물리적으로 분산된 하나의 논리적 작업이 수행됩니다.