PopWriteHiberPages
VOID __fastcall PopWriteHiberPages(
_POP_HIBER_CONTEXT *HiberContext,
VOID *ArgPageVa,
UINT64 ArgNoPages,
UINT64 ArgFilePage){
_POP_HIBER_CONTEXT *v6;
ULONG_PTR BugCheckParameter4;
__int64 CurrentMcb;
unsigned __int64 v10;
UINT64 v11;
unsigned int v12;
__int64 v13;
unsigned __int64 v14;
__int64 v15;
unsigned int i;
unsigned __int64 v17;
int v18;
unsigned __int64 v19;
int v20;
unsigned __int64 v21;
__int64 IoLocation;
UINT64 Address;
_POP_HIBER_CONTEXT *v24;
__int64 v25;
__int64 v26;
INT64 result;
__int16 v28;
__int16 v29;
VOID *v30;
unsigned __int64 v31;
unsigned int v32;
int v33;
__int64 v34[34];
v24 = HiberContext;
v6 = HiberContext;
memset((INT64)&result, 0i64);
BugCheckParameter4 = 0i64;
v21 = 0i64;
IoLocation = 0i64;
if( (PopWatchdogTimerCount & 0x1F) == 0 )
off_140C008C0[0]();
++PopWatchdogTimerCount;
if( v6->Status >= 0 )
{
if( (ArgFilePage + ArgNoPages) << 12 > qword_140C23450 )
{
PopCheckpointSystemSleep(PopSleepCheckpointHiberFileTooSmall);
if( v6->IoProgress - 4 <= 1 )
BugCheckParameter4 = PopGetRemainingHibernateRangeDataSize((INT64)v6);
Address = MmGetNumberOfPhysicalPages(0i64);
IoAddTriageDumpDataBlock(&Address, 8ui64);
PopRecordHibernateDiagnosticInfo((INT64)v6);
IoAddTriageDumpDataBlock(&PopHibernateDiagnosticInfo, 0x80ui64);
KeBugCheckEx(0xA0u, 0xBui64, qword_140C23450, v6->IoProgress, BugCheckParameter4);
}
if( ArgNoPages > 0xFFFFFFFFFFFFFi64 )
PopInternalError(0xA203Dui64);
CurrentMcb = (__int64)v6->CurrentMcb;
v10 = ArgFilePage << 12;
v26 = CurrentMcb;
v11 = ArgNoPages << 12;
while( v11 )
{
IoLocation = PopGetIoLocation(CurrentMcb, v10, &v21);
v12 = v11;
if( v11 > v21 )
v12 = v21;
v13 = (unsigned __int16)ArgPageVa & 0xFFF;
v14 = ((unsigned __int64)v12 + v13 + 4095) >> 12;
if( v14 > 0x10 )
{
v20 = v14 - 16;
v14 = 16i64;
v12 -= v20 << 12;
}
v25 = v12;
result = 0i64;
v33 = (unsigned __int16)ArgPageVa & 0xFFF;
v28 = 8 * (((v13 + (unsigned __int64)v12 + 4095) >> 12) + 6);
v32 = v12;
v31 = (unsigned __int64)ArgPageVa & 0xFFFFFFFFFFFFF000ui64;
v30 = ArgPageVa;
v29 = 1;
if( v14 )
{
v15 = 0i64;
for( i = 0; i < v14; v15 = i )
{
++i;
v34[v15] = (unsigned __int64)MmGetPhysicalAddress((char *)ArgPageVa + 4096 * v15).QuadPart >> 12;
}
v6 = v24;
}
v17 = __rdtsc();
v18 = (*((__int64(__fastcall **)(__int64 *, INT64 *))v6->DumpStack + 8))(&IoLocation, &result);
v19 = __rdtsc();
dword_140C23990 += v14;
qword_140C237B8 += (((unsigned __int64)HIDWORD(v19) << 32) | (unsigned int)v19) - v17;
v11 -= v25;
v10 += v25;
ArgPageVa = (char *)ArgPageVa + v25;
if( v18 < 0 )
{
v6->Status = v18;
return;
}
CurrentMcb = v26;
}
}
}Referenced by:
PopWriteChecksumPages
PopWriteHeaderPages
PopWriteImageHeader
PopWriteSecurePages
PopWriteSecurePagesCallback