PopWriteHiberPages
VOID __stdcall PopWriteHiberPages(
_POP_HIBER_CONTEXT *HiberContext,
VOID *ArgPageVa,
UINT64 ArgNoPages,
UINT64 ArgFilePage){
_POP_HIBER_CONTEXT *v6;
void *BugCheckParameter4;
POP_MCB_CONTEXT *CurrentMcb;
UINT64 v10;
UINT64 v11;
unsigned int v12;
__int64 v13;
unsigned __int64 v14;
__int64 v15;
unsigned int i;
unsigned __int64 v17;
unsigned __int64 v18;
int v19;
unsigned __int64 v20;
__int64 v21;
int v22;
UINT64 MaxTransferLength;
_LARGE_INTEGER IoLocation;
__int64 Address;
_POP_HIBER_CONTEXT *v26;
__int64 v27;
POP_MCB_CONTEXT *v28;
__int64 v29[40];
v26 = HiberContext;
v6 = HiberContext;
memset(v29, 0i64, 0x138u);
BugCheckParameter4 = 0i64;
MaxTransferLength = 0i64;
IoLocation.QuadPart = 0i64;
if( (*(&stru_140C23628 + 2676) & 0x1F) == 0 )
off_140C008C0[0]();
++*(&stru_140C23628 + 669);
if( v6->Status >= 0 )
{
if( (ArgFilePage + ArgNoPages) << 12 > (unsigned __int64)qword_140C23450 )
{
PopCheckpointSystemSleep(PopSleepCheckpointHiberFileTooSmall);
if( v6->IoProgress - 4 <= 1 )
BugCheckParameter4 = (void *)PopGetRemainingHibernateRangeDataSize(v6);
LODWORD(v21) = MmGetNumberOfPhysicalPages(0i64);
Address = v21;
IoAddTriageDumpDataBlock(&Address, (_BYTE *)8);
PopRecordHibernateDiagnosticInfo((INT64)v6);
IoAddTriageDumpDataBlock((char *)&stru_140C23628 + 2680, (_BYTE *)0x80);
KeBugCheckEx(0xA0u, (PVOID)0xB, qword_140C23450, (PVOID)v6->IoProgress, BugCheckParameter4);
}
if( ArgNoPages > 0xFFFFFFFFFFFFFi64 )
PopInternalError((PVOID)0xA203D);
CurrentMcb = (POP_MCB_CONTEXT *)v6->CurrentMcb;
v10 = ArgFilePage << 12;
v28 = CurrentMcb;
v11 = ArgNoPages << 12;
while( v11 )
{
IoLocation = PopGetIoLocation(CurrentMcb, v10, &MaxTransferLength);
v12 = v11;
if( v11 > MaxTransferLength )
v12 = MaxTransferLength;
v13 = (unsigned __int16)ArgPageVa & 0xFFF;
v14 = ((unsigned __int64)v12 + v13 + 4095) >> 12;
if( v14 > 0x10 )
{
v22 = v14 - 16;
v14 = 16i64;
v12 -= v22 << 12;
}
v27 = v12;
v29[0] = 0i64;
HIDWORD(v29[5]) = (unsigned __int16)ArgPageVa & 0xFFF;
LOWORD(v29[1]) = 8 * (((v13 + (unsigned __int64)v12 + 4095) >> 12) + 6);
LODWORD(v29[5]) = v12;
v29[4] = (unsigned __int64)ArgPageVa & 0xFFFFFFFFFFFFF000ui64;
v29[3] = (__int64)ArgPageVa;
WORD1(v29[1]) = 1;
if( v14 )
{
v15 = 0i64;
for( i = 0; i < v14; v15 = i )
{
LODWORD(v17) = MmGetPhysicalAddress((UINT64)ArgPageVa + 4096 * v15);
++i;
v29[v15 + 6] = v17 >> 12;
}
v6 = v26;
}
v18 = __rdtsc();
v19 = v6->DumpStack->Init.WriteRoutine(&IoLocation, (_MDL *)v29);
v20 = __rdtsc();
*(&stru_140C23628 + 218) += v14;
*(&stru_140C23628 + 50) += (((unsigned __int64)HIDWORD(v20) << 32) | (unsigned int)v20) - v18;
v11 -= v27;
v10 += v27;
ArgPageVa = (char *)ArgPageVa + v27;
if( v19 < 0 )
{
v6->Status = v19;
return;
}
CurrentMcb = v28;
}
}
}Referenced by:
PopWriteChecksumPages
PopWriteHeaderPages
PopWriteImageHeader
PopWriteSecurePages
PopWriteSecurePagesCallback