DRIVER_POWER_STATE_FAILURE (9f)
A driver is causing an inconsistent power state.
Arguments:
Arg1: 00000500, The device object completed the irp for the system power
state request, but failed to call PoStartNextPowerIrp.
Arg2: 00000002
Arg3: 8188ab80, Optional Target device's DEVICE_OBJECT
Arg4: 81982d98, DeviceObject
Debugging Details: DEVICE_OBJECT: 8188ab80 DRIVER_OBJECT: 817c7718 IMAGE_NAME: MyDriver.sys DEBUG_FLR_IMAGE_TIMESTAMP: 49e3e422 MODULE_NAME: MyDriver FAULTING_MODULE: f7645000 MyDriver DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT BUGCHECK_STR: 0x9F PROCESS_NAME: System LAST_CONTROL_TRANSFER: from 804f99f7 to 80528fe8 STACK_TEXT:
FOLLOWUP_NAME: MachineOwner FAILURE_BUCKET_ID: 0x9F_VRF_IMAGE_MyDriver.sys BUCKET_ID: 0x9F_VRF_IMAGE_MyDriver.sys Followup: MachineOwner |
파일 RW를 감시하는 파일시스템 필터 드라이버 작성 중 위의 버그체크 코드를 만났다.
CD Burning을 감시하기 위해, CdRomX에 Attach한 후 시스템을 재 부팅하거나
종료할 때 발생한 문제이다.
WinDbg가 분석해준 내용을 살펴보면 power관련된 처리를 제대로 하지 못했다는 내용인데,
좀 자세히 살펴보자
WinDbg도움말에서 해당 버그첵 코드를 확인해 보면 파라미터 각각에 대한 설명이 상세히 기술되어 있다.
The following parameters appear on the blue screen. Parameter 1 indicates the type of violation.
Parameter 1 |
Parameter 2 |
Parameter 3 |
Parameter 4 |
Cause |
0x1 (Windows 2000 and later) |
The device object |
Reserved |
Reserved |
The device object that is being freed still has an outstanding power request that it has not completed. |
0x2 (Windows 2000 and later) |
The target device's device object, if it is available |
The device object |
The driver object, if it is available |
The device object completed the I/O request packet (IRP) for the system power state request, but it failed to call PoStartNextPowerIrp. |
0x3 (Windows 2000 only) |
A pointer to the target device object |
Apointer to the device object |
The IRP |
The device driver did not properly set the IRP as "pending" or complete the IRP. |
0x3 (Windows XP and later) |
The physical device object (PDO) of the stack |
The functional device object (FDO) of the stack |
The blocked IRP |
A device object has been blocking an IRP for too long a time. |
0x100 (Windows 2000 only) |
A pointer to the nonpaged device object |
A pointer to the target device object |
A pointer to the device object to notify |
The device objects in the devnode inconsistently used DO_POWER_PAGABLE. |
0x101 (Windows 2000 only) |
The child device object (FDO) |
The child device object (PDO) |
The parent device object |
A parent device object has detected that a child device has not set the DO_POWER_PAGABLE bit. |
0x500 (Windows XP and Windows Server 2003 only) |
Reserved |
The target device's device object, if available |
Device object |
The device object completed the IRP for the system power state request, but it failed to call PoStartNextPowerIrp. |
A driver is causing an inconsistent power state.
(드라이버가 엉터리 파워상태를 야기했다)
Arguments:
Arg1: 00000500, The device object completed the irp for the system power
state request, but failed to call PoStartNextPowerIrp.
(디바이스 오브젝트가 시스템 파워 상태 요청에 대해 irp를 완료하기는 했으나
PoStartNextPowerIrp()를 호출하는 데 실패했다. 머 이런 내용이다.)
Arg2: 00000002
Arg3: 8188ab80, Optional Target device's DEVICE_OBJECT
(이놈은 우리 드라이버가 irp를 잔달한 우리 드라이버의 하위 드라이버의 포인터 이다.)
Arg4: 81982d98, DeviceObject
(문제를 야기한 이놈은 역시나 우리의 드라이버다.)
파일 시스템 드라이버야 WDM이 아닌 레거시 드라이버이다 보니 IRP_MJ_POWER에 대한 별도 처리부분은 없는 상태이고, CdRomX에 Attach한 DeviceObject로 파워관련 IRP가 내려오지 싶다.
역시나 확인을 해보니, 시스템 종료시 CdRomX에 Attach한 디바이스 Object로 IRP_MJ_POWER IRP가 내려온다.
사실 작업 대상이 디바이스가 아닌 파일시스템 쪽이다 보니, POWER,PNP관련 된 부분은 크게 신경 쓰지 않았거덩....(자랑이냐?)
여하간에 WDM 관련 책을 보니 IRP_MJ_POWER 요청에 대해서는 어찌 어찌 하라는 코드가 있더란 말이지...
그래서 IRP_MJ_POWER IRP를 걸러내서 이렇게 변경했다..
IoSkipCurrentIrpStackLocation( Irp ); |
PoStartNextPowerIrp( Irp ); |
일단 문제는 사라졌는데... 좀 더 확인이 필요할것 같다.
현재는 특정 Dispatch함수를 모든 IRP의 디스패치 루틴으로 등록하는 방식인데, IRP_MJ_POWER에 대한 디스패치 루틴을 등록하지 않으면 문제가 발생하지 않을까?
아 그리고, CdRomX에 Attach할때 Attach대상 디바이스 객체의 Flags에 DO_POWER_PAGABLE이 설정되어 있으면, 우리의 디바이스 객체에도 DO_POWER_PAGABLE를 설정해 주어야 한단다.
추측이 다소 포함된 내용이므로 전적으로 신뢰하지 말것...
책임질 수 없음.
'Windows Programming > 드라이버' 카테고리의 다른 글
파일 시스템 필터 드라이버 등록하기 #1 - Device Naming (0) | 2009.04.23 |
---|---|
메모리를 할당한 후 반드시 리턴값을 확인 할 것 (0) | 2009.04.14 |
IRP_MJ_DEVICE_CONTROL Irp의 완료처리 (0) | 2009.03.31 |
FileObject->RelatedFileObject가 유효한 경우 (1) | 2009.01.19 |
File System의 로드와 볼륨마운트 과정 (1) | 2009.01.16 |