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