PopWriteHeaderPages

INT64 __stdcall PopWriteHeaderPages(_POP_HIBER_CONTEXT *HiberContext, PO_MEMORY_IMAGE *MemImage){
  _DWORD *IoPages; 
  _MDL *LoaderMdl; 
  unsigned int v6; 
  unsigned int v7; 
  _MDL *v8; 
  _DWORD *v9; 
  __int64 v10; 
  int Next; 
  unsigned int v12; 
  unsigned int v13; 
  unsigned int ResumeContextPages; 
  unsigned int v15; 
  __int64 ResumeContextCheck; 
  ULONG_PTR v17; 
  unsigned int v18; 
  unsigned int v19; 
  __int64 WakeCheck; 
  ULONG_PTR v21; 
  unsigned int v22; 
  __int64 v23; 
  ULONG_PTR v24; 
  IoPages = HiberContext->IoPages;
  HiberContext->IoProgress = 0;
  memset((INT64)IoPages, 0i64);
  LoaderMdl = HiberContext->LoaderMdl;
  if( !LoaderMdl )
    return 3221225495i64;
  v6 = PopHiberScratchPages;
  v7 = LoaderMdl->ByteCount >> 12;
  MemImage->NoFreePages = v7;
  if( v7 < v6 )
    return 3221225495i64;
  v8 = HiberContext->LoaderMdl + 1;
  if( v6 )
  {
    v9 = IoPages;
    v10 = v6;
    do
    {
      Next = (int)v8->Next;
      v8 = (_MDL *)((char *)v8 + 8);
      *v9++ = Next;
      --v10;
    }
    while( v10 );
  }
  PopWriteHiberPages(
    HiberContext,
    IoPages,
    (4 * (unsigned __int64)(unsigned int)PopHiberScratchPages + 4095) >> 12,
    HiberContext->ResumeContextPages + 2);
  MemImage->NoFreePages = PopHiberScratchPages;
  tcpxsum(0i64);
  MemImage->FreeMapCheck = v12;
  MemImage->HiberResumeXhciHandoffSkip = PopHiberResumeXhciHandoffSkip;
  if( HiberContext->ResumeContext )
  {
    HiberContext->IoProgress = 1;
    memset((INT64)IoPages, 0i64);
    memmove((UINT8 *)IoPages, (UINT8 *)HiberContext->ResumeContext, HiberContext->ResumeContextPages << 12);
    tcpxsum(0i64);
    MemImage->ResumeContextCheck = v13;
    ResumeContextPages = HiberContext->ResumeContextPages;
    MemImage->ResumeContextPages = ResumeContextPages;
    PopWriteHiberPages(HiberContext, IoPages, ResumeContextPages, 2ui64);
    tcpxsum(0i64);
    ResumeContextCheck = MemImage->ResumeContextCheck;
    v17 = v15;
    if( (_DWORD)ResumeContextCheck != v15 )
    {
      DbgPrint("Checksum for resume context page changed from %lx to %lx\n", ResumeContextCheck, v15);
      KeBugCheckEx(0xA0u, 3ui64, MemImage->ResumeContextCheck, v17, 0x1CDBui64);
    }
  }
  HiberContext->IoProgress = 2;
  memset((INT64)IoPages, 0i64);
  memmove((UINT8 *)IoPages, (UINT8 *)HiberContext->WakeState, 0x5C0ui64);
  tcpxsum(0i64);
  MemImage->WakeCheck = v18;
  PopWriteHiberPages(HiberContext, IoPages, 1ui64, 1ui64);
  tcpxsum(0i64);
  WakeCheck = MemImage->WakeCheck;
  v21 = v19;
  if( (_DWORD)WakeCheck != v19 )
  {
    DbgPrint("Checksum for context page changed from %lx to %lx\n", WakeCheck, v19);
    KeBugCheckEx(0xA0u, 3ui64, MemImage->WakeCheck, v21, 0x1CF1ui64);
  }
  tcpxsum(0i64);
  v23 = MemImage->WakeCheck;
  v24 = v22;
  if( (_DWORD)v23 != v22 )
  {
    DbgPrint("Checksum for partial context page %lx doesn't match full %lx\n", v23, v22);
    KeBugCheckEx(0xA0u, 4ui64, MemImage->WakeCheck, v24, 0x1CF8ui64);
  }
  return 0i64;
}

Referenced by:

PopSaveHiberContext