PopHiberReadChecksums
VOID __stdcall PopHiberReadChecksums(_POP_HIBER_CONTEXT *HiberContext){
wchar_t *IoChecksums;
__int64 v2;
PO_MEMORY_IMAGE *MemoryImage;
_MDL *DumpMdl;
unsigned __int64 NoChecksumEntries;
UINT64 v7;
unsigned __int64 v8;
_LARGE_INTEGER IoLocation;
unsigned __int64 IoPages;
__int64 IoPagesCount;
__int64 Pages;
int v13;
UINT64 v14;
bool v15;
UINT64 v16;
UINT64 v17;
unsigned __int64 v18;
unsigned int v19;
unsigned __int64 v20;
unsigned __int64 v21;
int v22;
void *BugCheckParameter4;
unsigned __int64 v24;
UINT64 v25;
PO_MEMORY_IMAGE *v26;
unsigned __int64 v27;
UINT64 MaxTransferLength;
_LARGE_INTEGER v29;
wchar_t *v30;
IoChecksums = HiberContext->IoChecksums;
v2 = 0i64;
v29.QuadPart = 0i64;
MaxTransferLength = 0i64;
v30 = IoChecksums;
if( IoChecksums )
{
MemoryImage = HiberContext->MemoryImage;
DumpMdl = HiberContext->IoInfo.DumpMdl;
v26 = MemoryImage;
NoChecksumEntries = MemoryImage->NoChecksumEntries;
v7 = MemoryImage->FirstChecksumRestorePage << 12;
v27 = __rdtsc();
v8 = (2 * NoChecksumEntries + 4095) & 0xFFFFFFFFFFFFF000ui64;
if( v8 )
{
do
{
IoLocation = PopGetIoLocation((POP_MCB_CONTEXT *)HiberContext->CurrentMcb, v7, &MaxTransferLength);
IoPages = (unsigned __int64)HiberContext->IoPages;
IoPagesCount = HiberContext->IoPagesCount;
Pages = HiberContext->IoInfo.Pages;
v13 = (int)HiberContext->IoPages;
v29 = IoLocation;
v14 = MaxTransferLength;
v15 = v8 < MaxTransferLength;
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;
v25 = 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
{
LODWORD(v21) = MmGetPhysicalAddress((UINT64)HiberContext->IoPages + 4096 * v2);
++v19;
*((_QWORD *)&DumpMdl[1].Next + v2) = v21 >> 12;
v2 = v19;
}
while( v19 < v20 );
IoChecksums = v30;
v17 = v25;
MemoryImage = v26;
}
v22 = HiberContext->DumpStack->Init.ReadRoutine(0, &v29, DumpMdl);
BugCheckParameter4 = (void *)v22;
if( v22 < 0 )
{
PopInternalAddToDumpFile(HiberContext->DumpStack, 0x178ui64, 0i64);
KeBugCheckEx(0xA0u, (PVOID)0x10A, (PVOID)0xA, HiberContext, BugCheckParameter4);
}
memmove(IoChecksums, HiberContext->IoPages, v17);
IoChecksums = (wchar_t *)((char *)IoChecksums + v17);
v7 += v17;
v2 = 0i64;
v30 = IoChecksums;
v8 -= v17;
}
while( v8 );
NoChecksumEntries = MemoryImage->NoChecksumEntries;
}
HiberContext->IoInfo.HighestChecksumIndex = NoChecksumEntries;
v24 = __rdtsc();
*(&stru_140C23628 + 97) += (((unsigned __int64)HIDWORD(v24) << 32) | (unsigned int)v24) - v27;
}
}Referenced by:
PopRestoreHiberContext