PopSaveHiberContext

INT64 __fastcall PopSaveHiberContext(_POP_HIBER_CONTEXT *HiberContext){
  UINT8 v2; 
  __int64 v3; 
  __int64 v4; 
  UINT8 v5; 
  bool v6; 
  PO_MEMORY_IMAGE *MemoryImage; 
  _RTL_BITMAP *p_BootPhaseMap; 
  unsigned int v9; 
  unsigned int *Buffer; 
  unsigned int *v11; 
  $EBB6A4E41EA1FB11D7DFF661097B728A *v12; 
  $EBB6A4E41EA1FB11D7DFF661097B728A *v13; 
  _DUMP_STACK_CONTEXT *DumpStack; 
  PVOID v15; 
  unsigned __int64 v16; 
  int v17; 
  ULONG_PTR v18; 
  unsigned __int64 v19; 
  _LIST_ENTRY *Flink; 
  UINT64 v21; 
  UINT64 Blink; 
  UINT8 *v23; 
  _QWORD *CurrentMcb; 
  PVOID v25; 
  int Status; 
  unsigned int WakeCheck; 
  unsigned int v28; 
  INT64 v29; 
  unsigned int ProdConsSize; 
  char *ProdConsBuffer; 
  unsigned __int64 v32; 
  unsigned __int64 v33; 
  unsigned int i; 
  int v35; 
  int v36; 
  __int64 v37; 
  __int64 v38; 
  unsigned int v39; 
  __int64 v40; 
  unsigned int v41; 
  INT64 v42; 
  unsigned int v43; 
  char *v44; 
  unsigned __int64 v45; 
  UINT64 v46; 
  UINT8 v48; 
  char ReasonCodes[12]; 
  __int128 v50; 
  __int128 v51; 
  __int128 v52; 
  __int128 v53; 
  __int128 v54; 
  __int128 v55; 
  __int64 v56; 
  _OWORD a1[5]; 
  _OWORD v58[5]; 
  INT64 result[5]; 
  size_t Size; 
  int v61; 
  v56 = 0i64;
  v55 = 0i64;
  memset((INT64)result, 0i64);
  *(_DWORD *)ReasonCodes = 0;
  v3 = *((unsigned int *)KeGetCurrentPrcb() + 9);
  if( (_DWORD)v3 )
  {
    if( (HvlpFlags & 2) != 0 )
    {
      if( _InterlockedIncrement(&HiberContext->HvCaptureReadyBarrier) )
      {
        do
          _mm_pause();
        while( HiberContext->HvCaptureReadyBarrier );
      }
      if( PoResumeFromHibernate )
        return 1073742484;
      if( _InterlockedIncrement(&HiberContext->HvCaptureCompletedBarrier) )
      {
        do
          _mm_pause();
        while( HiberContext->HvCaptureCompletedBarrier );
      }
    }
  }
  else
  {
    PopCheckpointSystemSleep(PopSleepCheckpointSaveHiberContextBegin);
  }
  if( (unsigned int)v3 >= HiberContext->ProcessorCount )
    return 0;
  if( !(_DWORD)v3 )
  {
    PopWatchdogTimerCount = 0;
    _disable();
    if( (v61 & 0x200) != 0 )
      PopInternalError(0xA18D9ui64);
    if( (PopSimulateHiberBugcheck & 0x80u) != 0 )
    {
      v48 = 0;
    }
    else
    {
      v48 = IoDumpStackResumeCapable((UINT64 *)ReasonCodes);
      if( v48 )
        goto LABEL_13;
    }
    dword_140C23508 |= 4u;
    byte_140C23481 = 1;
LABEL_13:
    if( (unsigned int)PshedArePluginsPresent() )
    {
      dword_140C23508 |= 8u;
      byte_140C23481 = 1;
    }
    if( !(unsigned __int8)off_140C00850[0]() )
    {
      dword_140C23508 |= 1u;
      byte_140C23481 = 1;
    }
    if( KeActiveTracepointsPresent() )
    {
      dword_140C23508 |= 0x40u;
      byte_140C23481 = 1;
    }
    v6 = (_BYTE)HvlHypervisorConnected == 0;
    MemoryImage = HiberContext->MemoryImage;
    HiberContext->CurrentMcb = &v55;
    HiberContext->WakeState = &PoWakeState;
    HiberContext->WroteHiberFile = 1;
    if( !v6 )
    {
      HvlDisableEnlightenment(0);
      off_140C007A0[0]();
      if( (HvlpFlags & 2) != 0 )
      {
        _InterlockedIncrement(&HiberContext->HvCaptureReadyBarrier);
        while( HiberContext->HvCaptureReadyBarrier != (_DWORD)KeNumberProcessors_0 )
          _mm_pause();
        *(_QWORD *)&v50 = PoWakeState.ContextFrame.Rip;
        *((_QWORD *)&v50 + 1) = PoWakeState.ContextFrame.Rsp;
        *(_QWORD *)&v51 = PoWakeState.ContextFrame.Rbp;
        *((_QWORD *)&v51 + 1) = PoWakeState.ContextFrame.Rbx;
        *(_QWORD *)&v52 = PoWakeState.ContextFrame.Rdi;
        *((_QWORD *)&v52 + 1) = PoWakeState.ContextFrame.Rsi;
        v53 = *(_OWORD *)&PoWakeState.ContextFrame.R12;
        v54 = *(_OWORD *)&PoWakeState.ContextFrame.R14;
        if( HiberContext->IumEnabled )
        {
          a1[0] = v50;
          a1[2] = v52;
          a1[1] = v51;
          a1[4] = v54;
          a1[3] = v53;
          v35 = HvlPrepareForSecureHibernate(a1);
        }
        else
        {
          v58[0] = v50;
          v58[2] = v52;
          v58[1] = v51;
          v58[4] = v54;
          v58[3] = v53;
          v35 = HvlPrepareForHibernate(
                  v58,
                  &MemoryImage->HvPageTableRoot,
                  &MemoryImage->HvEntryPoint,
                  &MemoryImage->HvReservedTransitionAddress,
                  &MemoryImage->HvReservedTransitionAddressSize);
        }
        v36 = v35;
        if( v35 < 0 )
        {
          PopInternalAddToDumpFile(HiberContext->DumpStack, 0x178ui64, 0i64);
          KeBugCheckEx(0xA0u, 0xCui64, v36, (ULONG_PTR)HiberContext->DumpStack, 0i64);
        }
        HiberContext->HvCaptureReadyBarrier = 0;
        _InterlockedIncrement(&HiberContext->HvCaptureCompletedBarrier);
        while( HiberContext->HvCaptureCompletedBarrier != (_DWORD)KeNumberProcessors_0 )
          _mm_pause();
        HiberContext->HvCaptureReadyBarrier = KeNumberProcessors_0;
        HiberContext->HvCaptureCompletedBarrier = 0;
      }
      if( HiberContext->IumEnabled )
        HvlDiscardSecurePagesFromHibernation(HiberContext);
      else
        HvlDiscardPagesFromHibernation(HiberContext);
    }
    ++MemoryImage->Signature;
    p_BootPhaseMap = &HiberContext->BootPhaseMap;
    v9 = 0;
    Buffer = HiberContext->BootPhaseMap.Buffer;
    v11 = HiberContext->DiscardMap.Buffer;
    if( (HiberContext->BootPhaseMap.SizeOfBitMap & 0xFFFFFFE0) != 0 )
    {
      do
      {
        ++v9;
        *Buffer++ |= *v11++;
      }
      while( v9 < p_BootPhaseMap->SizeOfBitMap >> 5 );
    }
    v12 = &HiberContext->32;
    if( byte_140C23481 )
    {
      v13 = &HiberContext->32;
    }
    else
    {
      RtlCopyBitMap(&HiberContext->BootPhaseMap, &HiberContext->DiscardMap, 0i64);
      v13 = ($EBB6A4E41EA1FB11D7DFF661097B728A *)&HiberContext->BootPhaseMap;
    }
    RtlSetAllBits(&v13->DiscardMap);
    DumpStack = HiberContext->DumpStack;
    HiberContext->IoProgress = 8;
    IoGetDumpHiberRanges(v15, DumpStack);
    if( !byte_140C23481 )
      IoNotifyDump(1);
    v16 = __rdtsc();
    IoInitializeDumpStack(HiberContext->DumpStack, (UINT8 *)((unsigned __int64)HIDWORD(v16) << 32));
    v18 = v17;
    v19 = __rdtsc();
    qword_140C237C8 += (((unsigned __int64)HIDWORD(v19) << 32) | (unsigned int)v19) - v16;
    if( (v18 & 0x80000000) != 0i64 || PopSimulateHiberBugcheck == 1 )
    {
      PopCheckpointSystemSleep(PopSleepCheckpointInitializeDumpStackFailed);
      PopInternalAddToDumpFile(HiberContext->DumpStack, 0x178ui64, 0i64);
      KeBugCheckEx(0xA0u, 0xCui64, v18, (ULONG_PTR)HiberContext->DumpStack, 0i64);
    }
    PopMarkComponentsBootPhase(HiberContext);
    Flink = HiberContext->ClonedRanges.Flink;
    PoHiberInProgress = 1;
    if( Flink != &HiberContext->ClonedRanges )
    {
      do
      {
        v21 = (UINT64)Flink[2].Flink;
        Blink = (UINT64)Flink[1].Blink;
        v23 = (UINT8 *)Flink[2].Blink;
        Flink = Flink->Flink;
        for( HiberContext->ClonedPageCount += v21 - Blink; Blink < v21; Blink += (unsigned __int64)(unsigned int)Size >> 12 )
        {
          PopCreateDumpMdl((INT64)HiberContext, result, Blink, v21);
          memmove(v23, (UINT8 *)result[3], (unsigned int)Size);
          v23 += (unsigned int)Size;
        }
      }
      while( Flink != &HiberContext->ClonedRanges );
      v12 = &HiberContext->32;
    }
    PopResetRangeEnum(HiberContext);
    CurrentMcb = HiberContext->CurrentMcb;
    v25 = qword_140C23458;
    *CurrentMcb = qword_140C23458;
    CurrentMcb[1] = v25;
    CurrentMcb[2] = 0i64;
    *(_QWORD *)&ReasonCodes[4] = __rdtsc();
    Status = PopWriteHeaderPages(HiberContext, MemoryImage);
    if( Status >= 0 )
    {
      WakeCheck = MemoryImage->WakeCheck;
      if( HiberContext->IumEnabled )
      {
        v37 = (unsigned int)PopHiberScratchPages;
        v38 = HiberContext->ResumeContextPages + 2;
        HiberContext->IoProgress = 3;
        MemoryImage->FirstSecureRestorePage = v38 + ((unsigned __int64)(4 * v37 + 4095) >> 12);
        PopWriteSecurePages(HiberContext);
        qword_140C23950 = HiberContext->SecurePages;
      }
      HiberContext->IoProgress = 4;
      HiberContext->CurrentMap = p_BootPhaseMap;
      v28 = RtlNumberOfClearBits(&HiberContext->BootPhaseMap);
      v29 = qword_140C234D8;
      ProdConsSize = HiberContext->ProdConsSize;
      ProdConsBuffer = HiberContext->ProdConsBuffer;
      v32 = (v28 + HiberContext->ClonedPageCount) << 12;
      memset(qword_140C234D8, 0i64);
      *(_DWORD *)(v29 + 24) = 0;
      *(_QWORD *)v29 = ProdConsBuffer;
      *(_DWORD *)(v29 + 8) = ProdConsSize;
      *(_QWORD *)(v29 + 16) = v32;
      qword_140C23958 = 0i64;
      qword_140C23960 = 0i64;
      HiberContext->IoInfo.IoStatus = IoReady;
      HiberContext->IoInfo.IoBytesCompleted = 0i64;
      if( v48 && *((_QWORD *)HiberContext->DumpStack + 16) )
        HiberContext->IoInfo.AsyncCapable = 1;
      v33 = HiberContext->SecurePages
          + ((4 * (unsigned __int64)(unsigned int)PopHiberScratchPages + 4095) >> 12)
          + HiberContext->ResumeContextPages
          + 2;
      MemoryImage->FirstBootRestorePage = v33;
      HiberContext->IoInfo.FileOffset = v33 << 12;
      HiberContext->InitializationFinished = 1;
      PopWriteHiberImage(HiberContext, 1u);
      _InterlockedIncrement(&HiberContext->BootPhaseFinishedBarrier);
      for( i = HiberContext->ProcessorCount; HiberContext->BootPhaseFinishedBarrier != i; i = HiberContext->ProcessorCount )
        _mm_pause();
      v39 = 0;
      if( i )
      {
        do
        {
          v40 = v39++;
          v40 <<= 7;
          qword_140C23958 += *(unsigned __int64 *)((char *)&HiberContext->ProcessorContext->PagesProcessed + v40);
          *(unsigned __int64 *)((char *)&HiberContext->ProcessorContext->PagesProcessed + v40) = 0i64;
        }
        while( v39 < HiberContext->ProcessorCount );
      }
      qword_140C23968 = qword_140C23988;
      qword_140C23978 = (unsigned int)dword_140C23990;
      qword_140C23988 = 0i64;
      dword_140C23990 = 0;
      HiberContext->IoProgress = 5;
      HiberContext->CurrentMap = &v12->DiscardMap;
      HiberContext->NextPreserve = 0i64;
      v41 = RtlNumberOfClearBits(&v12->DiscardMap);
      v42 = qword_140C234D8;
      v43 = HiberContext->ProdConsSize;
      v44 = HiberContext->ProdConsBuffer;
      v45 = (unsigned __int64)v41 << 12;
      memset(qword_140C234D8, 0i64);
      *(_DWORD *)(v42 + 24) = 0;
      *(_QWORD *)v42 = v44;
      *(_DWORD *)(v42 + 8) = v43;
      *(_QWORD *)(v42 + 16) = v45;
      MemoryImage->FirstKernelRestorePage = (HiberContext->IoInfo.FileOffset + 4095) >> 12;
      HiberContext->BootPhaseFinishedBarrier = 0;
      HiberContext->IoInfo.IoBytesCompleted = 0i64;
      PopWriteHiberImage(HiberContext, 0);
      HiberContext->IoProgress = 7;
      PopWriteChecksumPages(HiberContext);
      v46 = *(_QWORD *)&ReasonCodes[4];
      HiberContext->IoProgress = 6;
      PopWriteImageHeader(HiberContext, MemoryImage, WakeCheck, v46);
      Status = HiberContext->Status;
      if( Status >= 0 )
      {
        if( TargetState == EffectiveState )
        {
          if( (*(_WORD *)PopSimulate & 0x8000) == 0 )
            DbgUnLoadImageSymbols(0i64, (PVOID)0xFFFFFFFFFFFFFFFEi64, 0i64);
          VslNotifyShutdown(1u);
        }
        if( (*(_WORD *)PopSimulate & 0x1000) != 0 )
        {
          Status = -1073741632;
        }
        else
        {
          Status = 0;
          if( (PopSimulateHiberBugcheck & 0x10) != 0 )
          {
            Status = 1073742484;
LABEL_84:
            PopCheckpointSystemSleep(PopSleepCheckpointSaveHiberContextEnd);
            off_140C008C8[0]();
            return(unsigned int)Status;
          }
        }
      }
    }
    KdPowerTransition(PowerDeviceD3);
    if( Status >= 0 && TargetState == PowerSystemHibernate )
    {
      PopNotifyShutdownListener();
      HvlConfigureMemoryZeroingOnReset(0);
      PopSetMemoryOverwriteRequestAction();
    }
    goto LABEL_84;
  }
  while( !HiberContext->InitializationFinished )
    _mm_pause();
  v4 = v3 << 7;
  PopCompressHiberBlocks(
    HiberContext,
    (_POP_PER_PROCESSOR_CONTEXT *)((char *)HiberContext->ProcessorContext + v4),
    1u,
    v2);
  if( _InterlockedIncrement(&HiberContext->BootPhaseFinishedBarrier) )
  {
    do
      _mm_pause();
    while( HiberContext->BootPhaseFinishedBarrier );
  }
  return(unsigned int)PopCompressHiberBlocks(
                         HiberContext,
                         (_POP_PER_PROCESSOR_CONTEXT *)((char *)HiberContext->ProcessorContext + v4),
                         0,
                         v5);
}

Referenced by:

PopSaveHiberContextWrapper