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