PopHiberReadChecksums
VOID __stdcall PopHiberReadChecksums(_POP_HIBER_CONTEXT *HiberContext){
wchar_t *IoChecksums;
__int64 v2;
PO_MEMORY_IMAGE *MemoryImage;
_MDL *DumpMdl;
unsigned __int64 NoChecksumEntries;
unsigned __int64 v7;
unsigned __int64 v8;
__int64 IoLocation;
unsigned __int64 IoPages;
__int64 IoPagesCount;
__int64 Pages;
int v13;
unsigned __int64 v14;
bool v15;
unsigned __int64 v16;
UINT64 v17;
unsigned __int64 v18;
unsigned int v19;
unsigned __int64 v20;
int v21;
ULONG_PTR BugCheckParameter4;
unsigned __int64 v23;
UINT64 v24;
PO_MEMORY_IMAGE *v25;
unsigned __int64 v26;
unsigned __int64 v27;
__int64 v28;
wchar_t *v29;
IoChecksums = HiberContext->IoChecksums;
v2 = 0i64;
v28 = 0i64;
v27 = 0i64;
v29 = IoChecksums;
if( IoChecksums )
{
MemoryImage = HiberContext->MemoryImage;
DumpMdl = HiberContext->IoInfo.DumpMdl;
v25 = MemoryImage;
NoChecksumEntries = MemoryImage->NoChecksumEntries;
v7 = MemoryImage->FirstChecksumRestorePage << 12;
v26 = __rdtsc();
v8 = (2 * NoChecksumEntries + 4095) & 0xFFFFFFFFFFFFF000ui64;
if( v8 )
{
do
{
IoLocation = PopGetIoLocation((__int64)HiberContext->CurrentMcb, v7, &v27);
IoPages = (unsigned __int64)HiberContext->IoPages;
IoPagesCount = HiberContext->IoPagesCount;
Pages = HiberContext->IoInfo.Pages;
v13 = (int)HiberContext->IoPages;
v28 = IoLocation;
v14 = v27;
v15 = v8 < v27;
DumpMdl->MdlFlags = 0;
DumpMdl->Next = 0i64;
if( v15 )
v14 = v8;
v16 = IoPagesCount << 12;
if( v14 < v16 )
v16 = v14;
v17 = Pages << 12;
if( v16 < v17 )
v17 = v16;
DumpMdl->ByteCount = v17;
v24 = v17;
DumpMdl->StartVa = (void *)(IoPages & 0xFFFFFFFFFFFFF000ui64);
DumpMdl->ByteOffset = IoPages & 0xFFF;
DumpMdl->Size = 8 * (((v17 + (IoPages & 0xFFF) + 4095) >> 12) + 6);
DumpMdl->MappedSystemVa = HiberContext->IoPages;
v18 = (v17 + (v13 & 0xFFF) + 4095i64) >> 12;
DumpMdl->MdlFlags = 1;
if( v18 )
{
v19 = 0;
v20 = v18;
do
{
++v19;
*((_QWORD *)&DumpMdl[1].Next + v2) = (unsigned __int64)MmGetPhysicalAddress((char *)HiberContext->IoPages + 4096 * v2).QuadPart >> 12;
v2 = v19;
}
while( v19 < v20 );
IoChecksums = v29;
v17 = v24;
MemoryImage = v25;
}
v21 = (*((__int64(__fastcall **)(_QWORD, __int64 *, _MDL *))HiberContext->DumpStack + 20))(0i64, &v28, DumpMdl);
BugCheckParameter4 = v21;
if( v21 < 0 )
{
PopInternalAddToDumpFile(HiberContext->DumpStack, 0x178ui64, 0i64);
KeBugCheckEx(0xA0u, 0x10Aui64, 0xAui64, (ULONG_PTR)HiberContext, BugCheckParameter4);
}
memmove((UINT8 *)IoChecksums, (UINT8 *)HiberContext->IoPages, v17);
IoChecksums = (wchar_t *)((char *)IoChecksums + v17);
v7 += v17;
v2 = 0i64;
v29 = IoChecksums;
v8 -= v17;
}
while( v8 );
NoChecksumEntries = MemoryImage->NoChecksumEntries;
}
HiberContext->IoInfo.HighestChecksumIndex = NoChecksumEntries;
v23 = __rdtsc();
qword_140C23930 += (((unsigned __int64)HIDWORD(v23) << 32) | (unsigned int)v23) - v26;
}
}Referenced by:
PopRestoreHiberContext