PopWriteHeaderPages
NTSTATUS __stdcall PopWriteHeaderPages(POP_HIBER_CONTEXT *HiberContext, PO_MEMORY_IMAGE *MemImage){
POP_HIBER_CONTEXT v2;
VOID *v4;
__int64 v6;
unsigned int v7;
unsigned int v8;
int *v9;
_DWORD *v10;
__int64 v11;
int v12;
unsigned int v13;
size_t v14;
unsigned int v15;
unsigned int v16;
unsigned int v17;
__int64 ResumeContextCheck;
unsigned __int64 v19;
size_t v20;
unsigned int v21;
unsigned int v22;
__int64 WakeCheck;
unsigned __int64 v24;
unsigned int v25;
__int64 v26;
unsigned __int64 v27;
v2 = HiberContext[38];
v4 = (VOID *)*((_QWORD *)HiberContext + 18);
HiberContext[46] = 0;
memset(v4, 0i64, v2 << 12);
v6 = *((_QWORD *)HiberContext + 15);
if( !v6 )
return -1073741801;
v7 = *(&stru_140C23628 + 702);
v8 = *(_DWORD *)(v6 + 40) >> 12;
MemImage->NoFreePages = v8;
if( v8 < v7 )
return -1073741801;
v9 = (int *)(*((_QWORD *)HiberContext + 15) + 48i64);
if( v7 )
{
v10 = v4;
v11 = v7;
do
{
v12 = *v9;
v9 += 2;
*v10++ = v12;
--v11;
}
while( v11 );
}
PopWriteHiberPages(
(_POP_HIBER_CONTEXT *)HiberContext,
v4,
(4 * (unsigned __int64)*(&stru_140C23628 + 702) + 4095) >> 12,
(unsigned int)(HiberContext[62] + 2));
MemImage->NoFreePages = *(&stru_140C23628 + 702);
tcpxsum(0i64);
MemImage->FreeMapCheck = v13;
MemImage->HiberResumeXhciHandoffSkip = *(&stru_140C23628 + 2820);
if( *((_QWORD *)HiberContext + 30) )
{
v14 = HiberContext[38] << 12;
HiberContext[46] = 1;
memset(v4, 0i64, v14);
memmove(v4, *((const VOID **)HiberContext + 30), HiberContext[62] << 12);
tcpxsum(0i64);
MemImage->ResumeContextCheck = v15;
v16 = HiberContext[62];
MemImage->ResumeContextPages = v16;
PopWriteHiberPages((_POP_HIBER_CONTEXT *)HiberContext, v4, v16, 2ui64);
tcpxsum(0i64);
ResumeContextCheck = MemImage->ResumeContextCheck;
v19 = v17;
if( (_DWORD)ResumeContextCheck != v17 )
{
DbgPrint("Checksum for resume context page changed from %lx to %lx\n", ResumeContextCheck, v17);
KeBugCheckEx(0xA0u, (PVOID)3, (PVOID)MemImage->ResumeContextCheck, (PVOID)v19, (PVOID)0x1CDB);
}
}
v20 = HiberContext[38] << 12;
HiberContext[46] = 2;
memset(v4, 0i64, v20);
memmove(v4, *((const VOID **)HiberContext + 22), 0x5C0u);
tcpxsum(0i64);
MemImage->WakeCheck = v21;
PopWriteHiberPages((_POP_HIBER_CONTEXT *)HiberContext, v4, 1ui64, 1ui64);
tcpxsum(0i64);
WakeCheck = MemImage->WakeCheck;
v24 = v22;
if( (_DWORD)WakeCheck != v22 )
{
DbgPrint("Checksum for context page changed from %lx to %lx\n", WakeCheck, v22);
KeBugCheckEx(0xA0u, (PVOID)3, (PVOID)MemImage->WakeCheck, (PVOID)v24, (PVOID)0x1CF1);
}
tcpxsum(0i64);
v26 = MemImage->WakeCheck;
v27 = v25;
if( (_DWORD)v26 != v25 )
{
DbgPrint("Checksum for partial context page %lx doesn't match full %lx\n", v26, v25);
KeBugCheckEx(0xA0u, (PVOID)4, (PVOID)MemImage->WakeCheck, (PVOID)v27, (PVOID)0x1CF8);
}
return 0;
}Referenced by:
PopSaveHiberContext