PopWriteHiberPages

VOID __stdcall PopWriteHiberPages(
        _POP_HIBER_CONTEXT *HiberContext,
        VOID *ArgPageVa,
        UINT64 ArgNoPages,
        UINT64 ArgFilePage){
  _POP_HIBER_CONTEXT *v6; 
  void *BugCheckParameter4; 
  POP_MCB_CONTEXT *CurrentMcb; 
  UINT64 v10; 
  UINT64 v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  unsigned int i; 
  unsigned __int64 v17; 
  unsigned __int64 v18; 
  int v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  int v22; 
  UINT64 MaxTransferLength; 
  _LARGE_INTEGER IoLocation; 
  __int64 Address; 
  _POP_HIBER_CONTEXT *v26; 
  __int64 v27; 
  POP_MCB_CONTEXT *v28; 
  __int64 v29[40]; 

  v26 = HiberContext;
  v6 = HiberContext;
  memset(v29, 0i64, 0x138u);
  BugCheckParameter4 = 0i64;
  MaxTransferLength = 0i64;
  IoLocation.QuadPart = 0i64;
  if( (*(&stru_140C23628 + 2676) & 0x1F) == 0 )
    off_140C008C0[0]();
  ++*(&stru_140C23628 + 669);
  if( v6->Status >= 0 )
  {
    if( (ArgFilePage + ArgNoPages) << 12 > (unsigned __int64)qword_140C23450 )
    {
      PopCheckpointSystemSleep(PopSleepCheckpointHiberFileTooSmall);
      if( v6->IoProgress - 4 <= 1 )
        BugCheckParameter4 = (void *)PopGetRemainingHibernateRangeDataSize(v6);
      LODWORD(v21) = MmGetNumberOfPhysicalPages(0i64);
      Address = v21;
      IoAddTriageDumpDataBlock(&Address, (_BYTE *)8);
      PopRecordHibernateDiagnosticInfo((INT64)v6);
      IoAddTriageDumpDataBlock((char *)&stru_140C23628 + 2680, (_BYTE *)0x80);
      KeBugCheckEx(0xA0u, (PVOID)0xB, qword_140C23450, (PVOID)v6->IoProgress, BugCheckParameter4);
    }
    if( ArgNoPages > 0xFFFFFFFFFFFFFi64 )
      PopInternalError((PVOID)0xA203D);
    CurrentMcb = (POP_MCB_CONTEXT *)v6->CurrentMcb;
    v10 = ArgFilePage << 12;
    v28 = CurrentMcb;
    v11 = ArgNoPages << 12;
    while( v11 )
    {
      IoLocation = PopGetIoLocation(CurrentMcb, v10, &MaxTransferLength);
      v12 = v11;
      if( v11 > MaxTransferLength )
        v12 = MaxTransferLength;
      v13 = (unsigned __int16)ArgPageVa & 0xFFF;
      v14 = ((unsigned __int64)v12 + v13 + 4095) >> 12;
      if( v14 > 0x10 )
      {
        v22 = v14 - 16;
        v14 = 16i64;
        v12 -= v22 << 12;
      }
      v27 = v12;
      v29[0] = 0i64;
      HIDWORD(v29[5]) = (unsigned __int16)ArgPageVa & 0xFFF;
      LOWORD(v29[1]) = 8 * (((v13 + (unsigned __int64)v12 + 4095) >> 12) + 6);
      LODWORD(v29[5]) = v12;
      v29[4] = (unsigned __int64)ArgPageVa & 0xFFFFFFFFFFFFF000ui64;
      v29[3] = (__int64)ArgPageVa;
      WORD1(v29[1]) = 1;
      if( v14 )
      {
        v15 = 0i64;
        for( i = 0; i < v14; v15 = i )
        {
          LODWORD(v17) = MmGetPhysicalAddress((UINT64)ArgPageVa + 4096 * v15);
          ++i;
          v29[v15 + 6] = v17 >> 12;
        }
        v6 = v26;
      }
      v18 = __rdtsc();
      v19 = v6->DumpStack->Init.WriteRoutine(&IoLocation, (_MDL *)v29);
      v20 = __rdtsc();
      *(&stru_140C23628 + 218) += v14;
      *(&stru_140C23628 + 50) += (((unsigned __int64)HIDWORD(v20) << 32) | (unsigned int)v20) - v18;
      v11 -= v27;
      v10 += v27;
      ArgPageVa = (char *)ArgPageVa + v27;
      if( v19 < 0 )
      {
        v6->Status = v19;
        return;
      }
      CurrentMcb = v28;
    }
  }
}

Referenced by:

PopWriteChecksumPages
PopWriteHeaderPages
PopWriteImageHeader
PopWriteSecurePages
PopWriteSecurePagesCallback