PopRestoreHiberContext

struct KPRCB *__fastcall PopRestoreHiberContext(UINT64 a1){
  struct KPRCB *result; 
  unsigned int v3; 
  unsigned __int64 v4; 
  INT64 v5; 
  __int64 v6; 
  _QWORD *v7; 
  INT64 v8; 
  int v9; 
  __int64 v10; 
  unsigned __int64 v11; 
  unsigned __int64 v12; 
  int v13; 
  char v14; 
  unsigned __int64 v15; 
  unsigned int v16; 
  __int64 v17; 
  __int64 v18; 
  __int64 v19; 
  __int64 v20; 
  unsigned int v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  unsigned __int64 v24; 
  __int64 v25; 
  __int64 v26; 
  unsigned __int64 v27; 
  UINT8 *v28; 
  int v29; 
  ULONG_PTR v30; 
  unsigned __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  void(__fastcall *v35)(__int64); 
  __int64 v36; 
  __int128 v37; 
  __int64 v38; 
  unsigned __int64 v39; 
  INT64 v40; 
  v37 = 0i64;
  v38 = 0i64;
  result = (struct KPRCB *)KeGetCurrentPrcb();
  v3 = *((_DWORD *)result + 9);
  if( v3 < *(_DWORD *)(a1 + 256) )
  {
    v4 = 0i64;
    v5 = *(_QWORD *)(a1 + 264) + ((unsigned __int64)v3 << 7);
    *(_QWORD *)(v5 + 80) = 0i64;
    if( v3 == *(_DWORD *)(a1 + 192) )
    {
      byte_140C50390 = 0;
      v12 = __rdtsc();
      if( qword_140C50388 )
      {
        v13 = BgLibraryInitialize(qword_140C50388, 0xFFFFFFFFui64);
        v14 = byte_140C50390;
        if( v13 >= 0 )
          v14 = 1;
        byte_140C50390 = v14;
      }
      v15 = __rdtsc();
      qword_140C23920 += (((unsigned __int64)HIDWORD(v15) << 32) | (unsigned int)v15) - v12;
    }
    if( !v3 )
    {
      v40 = qword_140C234D8;
      v6 = 0i64;
      v7 = *(_QWORD **)(a1 + 200);
      v39 = __rdtsc();
      if( v7[11] == v7[69] )
        v6 = v7[72];
      *(_QWORD *)(a1 + 400) = v6;
      v8 = qword_140C234D8;
      v9 = *(_DWORD *)(a1 + 280);
      v10 = *(_QWORD *)(a1 + 272);
      memset(qword_140C234D8, 0i64);
      *(_DWORD *)(v8 + 24) = 0;
      *(_QWORD *)v8 = v10;
      *(_DWORD *)(v8 + 8) = v9;
      *(_QWORD *)(v8 + 16) = v6;
      *(_BYTE *)(a1 + 4) = 1;
      IoNotifyDump(2);
      if( *(_QWORD *)(a1 + 400) )
      {
        *(_DWORD *)(a1 + 184) = 9;
        *(_QWORD *)(a1 + 160) = &v37;
        *(_QWORD *)&v37 = qword_140C23458;
        *((_QWORD *)&v37 + 1) = qword_140C23458;
        v38 = 0i64;
        ((void(__fastcall *)(_QWORD))off_140C00858[0])(0i64);
        IoInitializeDumpStack(*(_DUMP_STACK_CONTEXT **)(a1 + 168), v28);
        v30 = v29;
        if( v29 < 0 || PopSimulateHiberBugcheck == 4 )
        {
          PopCheckpointSystemSleep(PopSleepCheckpointInitializeDumpStackForReadFailed);
          PopInternalAddToDumpFile(*(PVOID *)(a1 + 168), 0x178ui64, 0i64);
          KeBugCheckEx(0xA0u, 0xCui64, v30, *(_QWORD *)(a1 + 168), 0i64);
        }
        v31 = __rdtsc();
        v11 = v39;
        qword_140C23900 = (((unsigned __int64)HIDWORD(v31) << 32) | (unsigned int)v31) - v39;
        v32 = *(_QWORD *)(a1 + 168);
        *(_DWORD *)(a1 + 328) = 0;
        *(_QWORD *)(a1 + 344) = 0i64;
        if( *(_QWORD *)(v32 + 128) )
          *(_BYTE *)(a1 + 392) = 1;
        PopHiberReadChecksums((_POP_HIBER_CONTEXT *)a1);
        v33 = *(_QWORD *)(a1 + 200);
        *(_DWORD *)(a1 + 184) = 10;
        *(_QWORD *)(a1 + 376) = *(_QWORD *)(v33 + 112) << 12;
        while( *(_QWORD *)(a1 + 400) )
        {
          PopRequestRead(a1, v40, 1);
          if( (unsigned int)PopDecompressHiberBlocks((PVOID)a1, v5) == -2147483614 && !*(_DWORD *)(a1 + 328) )
            _mm_pause();
        }
        PopDecompressHiberBlocks((PVOID)a1, v5);
        v35 = *(void(__fastcall **)(__int64))(*(_QWORD *)(a1 + 168) + 72i64);
        if( v35 )
          v35(v34);
      }
      else
      {
        v11 = v39;
      }
      IoNotifyDump(3);
      ((void(__fastcall *)(__int64))off_140C00858[0])(1i64);
      _InterlockedAdd((volatile signed __int32 *)(a1 + 16), 1u);
      while( 1 )
      {
        v16 = *(_DWORD *)(a1 + 256);
        if( *(_DWORD *)(a1 + 16) == v16 )
          break;
        _mm_pause();
      }
      v17 = 0i64;
      v18 = 0i64;
      v19 = 0i64;
      v20 = 0i64;
      v21 = 0;
      if( v16 )
      {
        v22 = *(_QWORD *)(a1 + 264);
        do
        {
          v23 = v4;
          v24 = (unsigned __int64)v21 << 7;
          qword_140C238E0 += *(_QWORD *)(v24 + v22 + 64);
          qword_140C238F0 += *(_QWORD *)(v24 + *(_QWORD *)(a1 + 264) + 72);
          qword_140C23918 += *(_QWORD *)(v24 + *(_QWORD *)(a1 + 264) + 80);
          v22 = *(_QWORD *)(a1 + 264);
          v4 = *(_QWORD *)(v24 + v22 + 64) + *(_QWORD *)(v24 + v22 + 72);
          if( v4 <= v23 )
            v4 = v23;
          v17 += *(_QWORD *)(v24 + v22 + 88);
          v18 += *(_QWORD *)(v24 + v22 + 96);
          ++v21;
          v19 += *(_QWORD *)(v24 + v22 + 104);
          v20 += *(_QWORD *)(v24 + v22 + 112);
          v16 = *(_DWORD *)(a1 + 256);
        }
        while( v21 < v16 );
      }
      v25 = v17 / (v19 + 1);
      v26 = v18 / (v20 + 1);
      if( v26 > v25 )
      {
        v36 = 100 * (qword_140C238E8 * v16 / (v19 + v20 + 1) - v25) / (v26 - v25);
        if( v36 > 99 )
        {
          dword_140C23484 = 99;
          goto LABEL_27;
        }
        dword_140C23484 = v36;
        if( (int)v36 >= 1 )
          goto LABEL_27;
      }
      dword_140C23484 = 1;
LABEL_27:
      v27 = __rdtsc();
      qword_140C23908 = (((unsigned __int64)HIDWORD(v27) << 32) | (unsigned int)v27) - v11;
      result = (struct KPRCB *)(qword_140C23908 - qword_140C23900 - v4);
      qword_140C238D8 = (__int64)result;
      return result;
    }
    while( !*(_BYTE *)(a1 + 4) )
      _mm_pause();
    result = (struct KPRCB *)PopDecompressHiberBlocks((PVOID)a1, v5);
    _InterlockedAdd((volatile signed __int32 *)(a1 + 16), 1u);
  }
  return result;
}

Referenced by:

PopHandleNextState