PopWriteHiberPages

VOID __fastcall PopWriteHiberPages(
        _POP_HIBER_CONTEXT *HiberContext,
        VOID *ArgPageVa,
        UINT64 ArgNoPages,
        UINT64 ArgFilePage){
  _POP_HIBER_CONTEXT *v6; 
  ULONG_PTR BugCheckParameter4; 
  __int64 CurrentMcb; 
  unsigned __int64 v10; 
  UINT64 v11; 
  unsigned int v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  __int64 v15; 
  unsigned int i; 
  unsigned __int64 v17; 
  int v18; 
  unsigned __int64 v19; 
  int v20; 
  unsigned __int64 v21; 
  __int64 IoLocation; 
  UINT64 Address; 
  _POP_HIBER_CONTEXT *v24; 
  __int64 v25; 
  __int64 v26; 
  INT64 result; 
  __int16 v28; 
  __int16 v29; 
  VOID *v30; 
  unsigned __int64 v31; 
  unsigned int v32; 
  int v33; 
  __int64 v34[34]; 
  v24 = HiberContext;
  v6 = HiberContext;
  memset((INT64)&result, 0i64);
  BugCheckParameter4 = 0i64;
  v21 = 0i64;
  IoLocation = 0i64;
  if( (PopWatchdogTimerCount & 0x1F) == 0 )
    off_140C008C0[0]();
  ++PopWatchdogTimerCount;
  if( v6->Status >= 0 )
  {
    if( (ArgFilePage + ArgNoPages) << 12 > qword_140C23450 )
    {
      PopCheckpointSystemSleep(PopSleepCheckpointHiberFileTooSmall);
      if( v6->IoProgress - 4 <= 1 )
        BugCheckParameter4 = PopGetRemainingHibernateRangeDataSize((INT64)v6);
      Address = MmGetNumberOfPhysicalPages(0i64);
      IoAddTriageDumpDataBlock(&Address, 8ui64);
      PopRecordHibernateDiagnosticInfo((INT64)v6);
      IoAddTriageDumpDataBlock(&PopHibernateDiagnosticInfo, 0x80ui64);
      KeBugCheckEx(0xA0u, 0xBui64, qword_140C23450, v6->IoProgress, BugCheckParameter4);
    }
    if( ArgNoPages > 0xFFFFFFFFFFFFFi64 )
      PopInternalError(0xA203Dui64);
    CurrentMcb = (__int64)v6->CurrentMcb;
    v10 = ArgFilePage << 12;
    v26 = CurrentMcb;
    v11 = ArgNoPages << 12;
    while( v11 )
    {
      IoLocation = PopGetIoLocation(CurrentMcb, v10, &v21);
      v12 = v11;
      if( v11 > v21 )
        v12 = v21;
      v13 = (unsigned __int16)ArgPageVa & 0xFFF;
      v14 = ((unsigned __int64)v12 + v13 + 4095) >> 12;
      if( v14 > 0x10 )
      {
        v20 = v14 - 16;
        v14 = 16i64;
        v12 -= v20 << 12;
      }
      v25 = v12;
      result = 0i64;
      v33 = (unsigned __int16)ArgPageVa & 0xFFF;
      v28 = 8 * (((v13 + (unsigned __int64)v12 + 4095) >> 12) + 6);
      v32 = v12;
      v31 = (unsigned __int64)ArgPageVa & 0xFFFFFFFFFFFFF000ui64;
      v30 = ArgPageVa;
      v29 = 1;
      if( v14 )
      {
        v15 = 0i64;
        for( i = 0; i < v14; v15 = i )
        {
          ++i;
          v34[v15] = (unsigned __int64)MmGetPhysicalAddress((char *)ArgPageVa + 4096 * v15).QuadPart >> 12;
        }
        v6 = v24;
      }
      v17 = __rdtsc();
      v18 = (*((__int64(__fastcall **)(__int64 *, INT64 *))v6->DumpStack + 8))(&IoLocation, &result);
      v19 = __rdtsc();
      dword_140C23990 += v14;
      qword_140C237B8 += (((unsigned __int64)HIDWORD(v19) << 32) | (unsigned int)v19) - v17;
      v11 -= v25;
      v10 += v25;
      ArgPageVa = (char *)ArgPageVa + v25;
      if( v18 < 0 )
      {
        v6->Status = v18;
        return;
      }
      CurrentMcb = v26;
    }
  }
}

Referenced by:

PopWriteChecksumPages
PopWriteHeaderPages
PopWriteImageHeader
PopWriteSecurePages
PopWriteSecurePagesCallback