2011年12月30日 星期五

Bug Check 0x9F: DRIVER_POWER_STATE_FAILURE


Windbg ver. 6.12.2.633 release note, we find some information how to diagnose bugcheck 9F.  
These information is also helpful and provide some directions when we try to check the BSOD 9F dump file.  

a) Bug Check 0x9F Update   Add logic to diagnose bugcheck 0x9F minidumps using new to Windows 7 data added to the 0x9F Mini Dumps by the Kernel and Networking Teams.
Data includes:
All Kernel ExWorkerThreads that process Power IRPs.
IRPs Associated with any ExWorkerThread
IRPs Associated with  PnP Completion Queue.  
All Kernel Power IRPs
Device Stacks for all IRPS
NT_TRIAGE_POWER Structure
NT_TRIAGE_PNP structure


BSOD 9F information in the http://msdn.microsoft.com/en-us/library/windows/hardware/ff559329(v=vs.85).asp

The most failures that we meet is the parameter1=3 condition.  Actually, we can know what device driver cause the BSOD  by parameter 2 and what power action cause the BSOD by parameter 4.



kd>!analyze -v
*******************************************************************************
*                                                                             *
*                        Bugcheck Analysis                                    *
*                                                                             *
*******************************************************************************

DRIVER_POWER_STATE_FAILURE (9f)
A driver has failed to complete a power IRP within a specific time (usually 10 minutes).
Arguments:
Arg1: 00000003, A device object has been blocking an Irp for too long a time
Arg2: 857d6030, Physical Device Object of the stack
Arg3: 82b5dae0, nt!TRIAGE_9F_POWER on Win7, otherwise the Functional Device Object of the stack
Arg4: 85086008, The blocked IRP
0: kd> dt nt!TRIAGE_9F_POWER 82b5dae0 
   +0x000 Signature        : 0x8000
   +0x002 Revision         : 1
   +0x004 IrpList          : 0x82b78480 _LIST_ENTRY
   +0x008 ThreadList       : 0x82b77f28 _LIST_ENTRY
   +0x00c DelayedWorkQueue : 0x82b715bc _TRIAGE_EX_WORK_QUEUE
The dt (Display Type) command displays the structure. You can use various debugger commands to follow the LIST_ENTRY fields to examine the list of outstanding IRPs and the power IRP worker threads. Use the !irp command to examine the IRP that was blocked. (The address of this IRP is in Parameter 4 (arg4).)


Here are also some suggestion in the website.


Use the !poaction command to display the threads that handle the power operations and any allocated power IRPs.
To help you determine the cause of the error, consider the following questions: Can you find the blocked thread? When you examine the thread with the !thread debugger command, what does the thread consist of? Is there IO associated with the thread that is blocking it? What symbols are on the stack? When you examine the blocked power IRP, what do you notice? What is the PnP minor function code of the power IRP? What are the characteristics of the physical device object (PDO) driver (Parameter 2, arg2)? Is it is a miniport driver?



parameter 1   parameter2        parameter3                                                   parameter4

0x3 (Windows XP and later)


The physical device object (PDO) of the stack





The functional device object (FDO) of the stack. In Windows 7, this parameter points to the nt!TRIAGE_9F_POWERstructure.
The blocked IRP
A device object has been blocking an IRP for too long a time.



沒有留言:

張貼留言