PopSaveHiberContext
INT64 __fastcall PopSaveHiberContext(_POP_HIBER_CONTEXT *HiberContext){
UINT8 v2;
__int64 v3;
__int64 v4;
UINT8 v5;
bool v6;
PO_MEMORY_IMAGE *MemoryImage;
_RTL_BITMAP *p_BootPhaseMap;
unsigned int v9;
unsigned int *Buffer;
unsigned int *v11;
$EBB6A4E41EA1FB11D7DFF661097B728A *v12;
$EBB6A4E41EA1FB11D7DFF661097B728A *v13;
_DUMP_STACK_CONTEXT *DumpStack;
PVOID v15;
unsigned __int64 v16;
int v17;
ULONG_PTR v18;
unsigned __int64 v19;
_LIST_ENTRY *Flink;
UINT64 v21;
UINT64 Blink;
UINT8 *v23;
_QWORD *CurrentMcb;
PVOID v25;
int Status;
unsigned int WakeCheck;
unsigned int v28;
INT64 v29;
unsigned int ProdConsSize;
char *ProdConsBuffer;
unsigned __int64 v32;
unsigned __int64 v33;
unsigned int i;
int v35;
int v36;
__int64 v37;
__int64 v38;
unsigned int v39;
__int64 v40;
unsigned int v41;
INT64 v42;
unsigned int v43;
char *v44;
unsigned __int64 v45;
UINT64 v46;
UINT8 v48;
char ReasonCodes[12];
__int128 v50;
__int128 v51;
__int128 v52;
__int128 v53;
__int128 v54;
__int128 v55;
__int64 v56;
_OWORD a1[5];
_OWORD v58[5];
INT64 result[5];
size_t Size;
int v61;
v56 = 0i64;
v55 = 0i64;
memset((INT64)result, 0i64);
*(_DWORD *)ReasonCodes = 0;
v3 = *((unsigned int *)KeGetCurrentPrcb() + 9);
if( (_DWORD)v3 )
{
if( (HvlpFlags & 2) != 0 )
{
if( _InterlockedIncrement(&HiberContext->HvCaptureReadyBarrier) )
{
do
_mm_pause();
while( HiberContext->HvCaptureReadyBarrier );
}
if( PoResumeFromHibernate )
return 1073742484;
if( _InterlockedIncrement(&HiberContext->HvCaptureCompletedBarrier) )
{
do
_mm_pause();
while( HiberContext->HvCaptureCompletedBarrier );
}
}
}
else
{
PopCheckpointSystemSleep(PopSleepCheckpointSaveHiberContextBegin);
}
if( (unsigned int)v3 >= HiberContext->ProcessorCount )
return 0;
if( !(_DWORD)v3 )
{
PopWatchdogTimerCount = 0;
_disable();
if( (v61 & 0x200) != 0 )
PopInternalError(0xA18D9ui64);
if( (PopSimulateHiberBugcheck & 0x80u) != 0 )
{
v48 = 0;
}
else
{
v48 = IoDumpStackResumeCapable((UINT64 *)ReasonCodes);
if( v48 )
goto LABEL_13;
}
dword_140C23508 |= 4u;
byte_140C23481 = 1;
LABEL_13:
if( (unsigned int)PshedArePluginsPresent() )
{
dword_140C23508 |= 8u;
byte_140C23481 = 1;
}
if( !(unsigned __int8)off_140C00850[0]() )
{
dword_140C23508 |= 1u;
byte_140C23481 = 1;
}
if( KeActiveTracepointsPresent() )
{
dword_140C23508 |= 0x40u;
byte_140C23481 = 1;
}
v6 = (_BYTE)HvlHypervisorConnected == 0;
MemoryImage = HiberContext->MemoryImage;
HiberContext->CurrentMcb = &v55;
HiberContext->WakeState = &PoWakeState;
HiberContext->WroteHiberFile = 1;
if( !v6 )
{
HvlDisableEnlightenment(0);
off_140C007A0[0]();
if( (HvlpFlags & 2) != 0 )
{
_InterlockedIncrement(&HiberContext->HvCaptureReadyBarrier);
while( HiberContext->HvCaptureReadyBarrier != (_DWORD)KeNumberProcessors_0 )
_mm_pause();
*(_QWORD *)&v50 = PoWakeState.ContextFrame.Rip;
*((_QWORD *)&v50 + 1) = PoWakeState.ContextFrame.Rsp;
*(_QWORD *)&v51 = PoWakeState.ContextFrame.Rbp;
*((_QWORD *)&v51 + 1) = PoWakeState.ContextFrame.Rbx;
*(_QWORD *)&v52 = PoWakeState.ContextFrame.Rdi;
*((_QWORD *)&v52 + 1) = PoWakeState.ContextFrame.Rsi;
v53 = *(_OWORD *)&PoWakeState.ContextFrame.R12;
v54 = *(_OWORD *)&PoWakeState.ContextFrame.R14;
if( HiberContext->IumEnabled )
{
a1[0] = v50;
a1[2] = v52;
a1[1] = v51;
a1[4] = v54;
a1[3] = v53;
v35 = HvlPrepareForSecureHibernate(a1);
}
else
{
v58[0] = v50;
v58[2] = v52;
v58[1] = v51;
v58[4] = v54;
v58[3] = v53;
v35 = HvlPrepareForHibernate(
v58,
&MemoryImage->HvPageTableRoot,
&MemoryImage->HvEntryPoint,
&MemoryImage->HvReservedTransitionAddress,
&MemoryImage->HvReservedTransitionAddressSize);
}
v36 = v35;
if( v35 < 0 )
{
PopInternalAddToDumpFile(HiberContext->DumpStack, 0x178ui64, 0i64);
KeBugCheckEx(0xA0u, 0xCui64, v36, (ULONG_PTR)HiberContext->DumpStack, 0i64);
}
HiberContext->HvCaptureReadyBarrier = 0;
_InterlockedIncrement(&HiberContext->HvCaptureCompletedBarrier);
while( HiberContext->HvCaptureCompletedBarrier != (_DWORD)KeNumberProcessors_0 )
_mm_pause();
HiberContext->HvCaptureReadyBarrier = KeNumberProcessors_0;
HiberContext->HvCaptureCompletedBarrier = 0;
}
if( HiberContext->IumEnabled )
HvlDiscardSecurePagesFromHibernation(HiberContext);
else
HvlDiscardPagesFromHibernation(HiberContext);
}
++MemoryImage->Signature;
p_BootPhaseMap = &HiberContext->BootPhaseMap;
v9 = 0;
Buffer = HiberContext->BootPhaseMap.Buffer;
v11 = HiberContext->DiscardMap.Buffer;
if( (HiberContext->BootPhaseMap.SizeOfBitMap & 0xFFFFFFE0) != 0 )
{
do
{
++v9;
*Buffer++ |= *v11++;
}
while( v9 < p_BootPhaseMap->SizeOfBitMap >> 5 );
}
v12 = &HiberContext->32;
if( byte_140C23481 )
{
v13 = &HiberContext->32;
}
else
{
RtlCopyBitMap(&HiberContext->BootPhaseMap, &HiberContext->DiscardMap, 0i64);
v13 = ($EBB6A4E41EA1FB11D7DFF661097B728A *)&HiberContext->BootPhaseMap;
}
RtlSetAllBits(&v13->DiscardMap);
DumpStack = HiberContext->DumpStack;
HiberContext->IoProgress = 8;
IoGetDumpHiberRanges(v15, DumpStack);
if( !byte_140C23481 )
IoNotifyDump(1);
v16 = __rdtsc();
IoInitializeDumpStack(HiberContext->DumpStack, (UINT8 *)((unsigned __int64)HIDWORD(v16) << 32));
v18 = v17;
v19 = __rdtsc();
qword_140C237C8 += (((unsigned __int64)HIDWORD(v19) << 32) | (unsigned int)v19) - v16;
if( (v18 & 0x80000000) != 0i64 || PopSimulateHiberBugcheck == 1 )
{
PopCheckpointSystemSleep(PopSleepCheckpointInitializeDumpStackFailed);
PopInternalAddToDumpFile(HiberContext->DumpStack, 0x178ui64, 0i64);
KeBugCheckEx(0xA0u, 0xCui64, v18, (ULONG_PTR)HiberContext->DumpStack, 0i64);
}
PopMarkComponentsBootPhase(HiberContext);
Flink = HiberContext->ClonedRanges.Flink;
PoHiberInProgress = 1;
if( Flink != &HiberContext->ClonedRanges )
{
do
{
v21 = (UINT64)Flink[2].Flink;
Blink = (UINT64)Flink[1].Blink;
v23 = (UINT8 *)Flink[2].Blink;
Flink = Flink->Flink;
for( HiberContext->ClonedPageCount += v21 - Blink; Blink < v21; Blink += (unsigned __int64)(unsigned int)Size >> 12 )
{
PopCreateDumpMdl((INT64)HiberContext, result, Blink, v21);
memmove(v23, (UINT8 *)result[3], (unsigned int)Size);
v23 += (unsigned int)Size;
}
}
while( Flink != &HiberContext->ClonedRanges );
v12 = &HiberContext->32;
}
PopResetRangeEnum(HiberContext);
CurrentMcb = HiberContext->CurrentMcb;
v25 = qword_140C23458;
*CurrentMcb = qword_140C23458;
CurrentMcb[1] = v25;
CurrentMcb[2] = 0i64;
*(_QWORD *)&ReasonCodes[4] = __rdtsc();
Status = PopWriteHeaderPages(HiberContext, MemoryImage);
if( Status >= 0 )
{
WakeCheck = MemoryImage->WakeCheck;
if( HiberContext->IumEnabled )
{
v37 = (unsigned int)PopHiberScratchPages;
v38 = HiberContext->ResumeContextPages + 2;
HiberContext->IoProgress = 3;
MemoryImage->FirstSecureRestorePage = v38 + ((unsigned __int64)(4 * v37 + 4095) >> 12);
PopWriteSecurePages(HiberContext);
qword_140C23950 = HiberContext->SecurePages;
}
HiberContext->IoProgress = 4;
HiberContext->CurrentMap = p_BootPhaseMap;
v28 = RtlNumberOfClearBits(&HiberContext->BootPhaseMap);
v29 = qword_140C234D8;
ProdConsSize = HiberContext->ProdConsSize;
ProdConsBuffer = HiberContext->ProdConsBuffer;
v32 = (v28 + HiberContext->ClonedPageCount) << 12;
memset(qword_140C234D8, 0i64);
*(_DWORD *)(v29 + 24) = 0;
*(_QWORD *)v29 = ProdConsBuffer;
*(_DWORD *)(v29 + 8) = ProdConsSize;
*(_QWORD *)(v29 + 16) = v32;
qword_140C23958 = 0i64;
qword_140C23960 = 0i64;
HiberContext->IoInfo.IoStatus = IoReady;
HiberContext->IoInfo.IoBytesCompleted = 0i64;
if( v48 && *((_QWORD *)HiberContext->DumpStack + 16) )
HiberContext->IoInfo.AsyncCapable = 1;
v33 = HiberContext->SecurePages
+ ((4 * (unsigned __int64)(unsigned int)PopHiberScratchPages + 4095) >> 12)
+ HiberContext->ResumeContextPages
+ 2;
MemoryImage->FirstBootRestorePage = v33;
HiberContext->IoInfo.FileOffset = v33 << 12;
HiberContext->InitializationFinished = 1;
PopWriteHiberImage(HiberContext, 1u);
_InterlockedIncrement(&HiberContext->BootPhaseFinishedBarrier);
for( i = HiberContext->ProcessorCount; HiberContext->BootPhaseFinishedBarrier != i; i = HiberContext->ProcessorCount )
_mm_pause();
v39 = 0;
if( i )
{
do
{
v40 = v39++;
v40 <<= 7;
qword_140C23958 += *(unsigned __int64 *)((char *)&HiberContext->ProcessorContext->PagesProcessed + v40);
*(unsigned __int64 *)((char *)&HiberContext->ProcessorContext->PagesProcessed + v40) = 0i64;
}
while( v39 < HiberContext->ProcessorCount );
}
qword_140C23968 = qword_140C23988;
qword_140C23978 = (unsigned int)dword_140C23990;
qword_140C23988 = 0i64;
dword_140C23990 = 0;
HiberContext->IoProgress = 5;
HiberContext->CurrentMap = &v12->DiscardMap;
HiberContext->NextPreserve = 0i64;
v41 = RtlNumberOfClearBits(&v12->DiscardMap);
v42 = qword_140C234D8;
v43 = HiberContext->ProdConsSize;
v44 = HiberContext->ProdConsBuffer;
v45 = (unsigned __int64)v41 << 12;
memset(qword_140C234D8, 0i64);
*(_DWORD *)(v42 + 24) = 0;
*(_QWORD *)v42 = v44;
*(_DWORD *)(v42 + 8) = v43;
*(_QWORD *)(v42 + 16) = v45;
MemoryImage->FirstKernelRestorePage = (HiberContext->IoInfo.FileOffset + 4095) >> 12;
HiberContext->BootPhaseFinishedBarrier = 0;
HiberContext->IoInfo.IoBytesCompleted = 0i64;
PopWriteHiberImage(HiberContext, 0);
HiberContext->IoProgress = 7;
PopWriteChecksumPages(HiberContext);
v46 = *(_QWORD *)&ReasonCodes[4];
HiberContext->IoProgress = 6;
PopWriteImageHeader(HiberContext, MemoryImage, WakeCheck, v46);
Status = HiberContext->Status;
if( Status >= 0 )
{
if( TargetState == EffectiveState )
{
if( (*(_WORD *)PopSimulate & 0x8000) == 0 )
DbgUnLoadImageSymbols(0i64, (PVOID)0xFFFFFFFFFFFFFFFEi64, 0i64);
VslNotifyShutdown(1u);
}
if( (*(_WORD *)PopSimulate & 0x1000) != 0 )
{
Status = -1073741632;
}
else
{
Status = 0;
if( (PopSimulateHiberBugcheck & 0x10) != 0 )
{
Status = 1073742484;
LABEL_84:
PopCheckpointSystemSleep(PopSleepCheckpointSaveHiberContextEnd);
off_140C008C8[0]();
return(unsigned int)Status;
}
}
}
}
KdPowerTransition(PowerDeviceD3);
if( Status >= 0 && TargetState == PowerSystemHibernate )
{
PopNotifyShutdownListener();
HvlConfigureMemoryZeroingOnReset(0);
PopSetMemoryOverwriteRequestAction();
}
goto LABEL_84;
}
while( !HiberContext->InitializationFinished )
_mm_pause();
v4 = v3 << 7;
PopCompressHiberBlocks(
HiberContext,
(_POP_PER_PROCESSOR_CONTEXT *)((char *)HiberContext->ProcessorContext + v4),
1u,
v2);
if( _InterlockedIncrement(&HiberContext->BootPhaseFinishedBarrier) )
{
do
_mm_pause();
while( HiberContext->BootPhaseFinishedBarrier );
}
return(unsigned int)PopCompressHiberBlocks(
HiberContext,
(_POP_PER_PROCESSOR_CONTEXT *)((char *)HiberContext->ProcessorContext + v4),
0,
v5);
}Referenced by:
PopSaveHiberContextWrapper