Geoff Chappell - Software Analyst
The defined values of the POP_SLEEP_CHECKPOINT enumeration (formally _POP_SLEEP_CHECKPOINT) mark the kernel’s progress at putting the system in and out of sleep. This diagnostic aid was introduced for the 1607 release of Windows 10.
The essential work at each new checkpoint is to record the latest value in the firmware. Then, if the transition to or from sleep does not complete, the last recorded checkpoint should be retrievable when Windows next starts. This record is kept as the one-byte value of the SystemSleepCheckpoint variable in the {F4B5FD1A-2F14-451D-9AA9-D8F5E7117101} namespace. The checkpoint’s retrieval when Windows next starts shows as a parameter, named Checkpoint, in the event, numbered 41, that the Microsoft-Windows-Kernel-Power event provider writes to the System log to report that the “system has rebooted without cleanly shutting down first.”
In what surely must be a rare circumstance, the kernel may judge that it cannot safely try setting a new checkpoint into the firmware variable. This then is fatal to Windows. It shows as the bug check INTERNAL_POWER_ERROR (0x000000A0) with the first parameter set to 0x0000010F. The proposed new value of the checkpoint is then the second parameter.
The 1903 release brought the elaboration that the kernel may itself stop a power transition for taking too long. Expiry of a watchdog timer shows as the bug check INTERNAL_POWER_ERROR but now with the first parameter as 0x0000000F, 0x000000F0 or 0x000000F1 (depending on the WatchdogState member of the POP_POWER_ACTION). In these cases, the mostly recently set value of the checkpoint becomes the third bug-check parameter. So that this can be done, the checkpoint is written not only to the firmware but is also kept by the kernel as internal variable. Thus is the POP_SLEEP_CHECKPOINT enumeration also the type of the internal variable PopSleepCheckpoint. As with other internal variables concerned with power management, this can be useful to know when debugging.
The POP_SLEEP_CHECKPOINT enumeration is not documented.
Not only is the POP_SLEEP_CHECKPOINT not documented as a type, but its possible values are not documented even for their possibly useful interpretation as a parameter for either the power event or the bug check. Perhaps the argument is that the parameter can be useful, else why trouble to code for saving and retrieving it, but its one intended interpreter is Microsoft.
Online documentation of the INTERNAL_POWER_ERROR bug check, as observed today, 16th September 2022, goes no further than noting cases in which the second or third parameter is the “sleep checkpoint most recently reached.” These cases aren’t yet listed on the corresponding page in the offline Bug Check Reference from the Debugging Tools for Windows as distributed with the Software Development Kit even as recently as for the 2004 edition of Windows 10.
The values and names below are from type information in public symbol files for the kernel, starting with the 1607 release of Windows 10.
Value | Name | Versions |
---|---|---|
0x00 | PopSleepCheckpointInvalid | 1607 and higher |
0x01 | PopSleepCheckpointPowerTransitionStart | 1607 and higher |
0x02 | PopSleepCheckpointSuspendAppsBefore | 1607 and higher |
0x03 | PopSleepCheckpointSuspendAppsAfter | 1607 and higher |
0x04 | PopSleepCheckpointSuspendServicesBefore | 1607 and higher |
0x05 | PopSleepCheckpointSuspendServicesAfter | 1607 and higher |
0x06 | PopSleepCheckpointNotifySuperfetchBefore | 1607 and higher |
0x07 | PopSleepCheckpointNotifySuperfetchAfter | 1607 and higher |
0x08 | PopSleepCheckpointNotifyCallbacksBefore | 1607 and higher |
0x09 | PopSleepCheckpointNotifyCallbacksAfter | 1607 and higher |
0x0A | PopSleepCheckpointSleepTransactionCommitted | 1607 and higher |
0x0B | PopSleepCheckpointQueryDriversBefore | 1607 and higher |
0x0C | PopSleepCheckpointQueryDriversAfter | 1607 and higher |
0x0D | PopSleepCheckpointAllocatingHiberContext | 1607 and higher |
0x0E | PopSleepCheckpointSuspendDriversBefore | 1607 and higher |
0x0F | not defined | |
0x10 | PopSleepCheckpointPreSleepNotification | 1607 and higher |
0x11 | PopSleepCheckpointInterruptsDisabledBegin | 1607 and higher |
0x12 | PopSleepCheckpointInvokeHandlerBefore | 1607 and higher |
0x13 | PopSleepCheckpointSaveHiberContextBegin | 1607 and higher |
0x14 | PopSleepCheckpointInitializeDumpStackFailed | 1607 and higher |
0x15 | PopSleepCheckpointHiberWriteFailed | 1607 and higher |
0x16 | PopSleepCheckpointHiberFileTooSmall | 1607 and higher |
0x17 | PopSleepCheckpointSaveHiberContextFailed | 1607 and higher |
0x18 | PopSleepCheckpointSaveHiberContextEnd | 1607 and higher |
0x19 | PopSleepCheckpointHiberKernelHandoff | 1607 and higher |
0x1A | PopSleepCheckpointInvokeHandlerAfter | 1607 and higher |
0x1B | PopSleepCheckpointReadHiberfileBefore | 1607 and higher |
0x1C | PopSleepCheckpointInitializeDumpStackForReadFailed | 1607 and higher |
0x1D | PopSleepCheckpointHiberReadFailed | 1607 and higher |
0x1E | PopSleepCheckpointChecksumFailure | 1607 and higher |
0x1F | PopSleepCheckpointDecompressionFailed | 1607 and higher |
0x20 | PopSleepCheckpointReadHiberfileAfter | 1607 and higher |
0x21 | PopSleepCheckpointInterruptsDisabledEnd | 1607 and higher |
0x22 | not defined | |
0x23 | not defined | |
0x24 | PopSleepCheckpointWakeDriversAfter | 1607 and higher |
0x25 | PopSleepCheckpointResumeAppsBefore | 1607 and higher |
0x26 | PopSleepCheckpointResumeAppsAfter | 1607 and higher |
0x27 | PopSleepCheckpointResumeServicesBefore | 1607 and higher |
0x28 | PopSleepCheckpointResumeServicesAfter | 1607 and higher |
0x29 | PopSleepCheckpointPowerTransitionEnd | 1607 and higher |
0x2A | PopSleepCheckpointAllocatingHiberContextNoFileObject | 1809 and higher |
0x2B | PopSleepCheckpointAllocatingHiberContextGetDumpStackFailed | 1809 and higher |
0x2C | PopSleepCheckpointAllocatingHiberContextLoadResumeContextFailed | 1809 and higher |
0x2D | PopSleepCheckpointAllocatingHiberContextBcdOpenFailed | 1809 and higher |
0x2E | PopSleepCheckpointAllocatingHiberContextEstablishResumeObjectFailed | 1809 and higher |
0x2F | PopSleepCheckpointAllocatingHiberContextSetPendingResumeFailed | 1809 and higher |
0x30 | PopSleepCheckpointAllocatingHiberContextAllocateIoPagesPagesFailed | 1809 and higher |
0x31 | PopSleepCheckpointAllocatingHiberContextAdapterBuffersInvalid1 | 1809 and higher |
0x32 | PopSleepCheckpointAllocatingHiberContextAllocateDumpPagesFailed | 1809 and higher |
0x33 | PopSleepCheckpointAllocatingHiberContextAdapterBuffersInvalid2 | 1809 and higher |
0x34 | PopSleepCheckpointAllocatingHiberContextUnHibernatedMdlFailed | 1809 and higher |
0x35 | PopSleepCheckpointAllocatingHiberContextSecureResourcesFailed | 1809 and higher |
0x36 | PopSleepCheckpointPrepareSleepBefore | 2004 and higher |
0x37 | PopSleepCheckpointPrepareSleepAfter | 2004 and higher |
0x38 | PopSleepCheckpointBootstatAvailable | 2004 and higher |
0x2A (1607 to 1803); 0x36 (1809 to 1903); 0x39 |
PopSleepCheckpointMaximum | 1607 and higher |