PopDecompressHiberBlocks

NTSTATUS __stdcall PopDecompressHiberBlocks(ULONG_PTR BugCheckParameter3, INT64 a2){
  PRODUCER_CONSUMER_WAIT_FLAGS v2; 
  char v3; 
  PRODUCER_CONSUMER_WAIT_FLAGS v4; 
  _DWORD *a9; 
  PRODUCER_CONSUMER_CONTEXT *v7; 
  NTSTATUS v8; 
  VOID *v9; 
  CHAR *v10; 
  CHAR *v11; 
  unsigned __int64 v13; 
  unsigned __int64 v14; 
  _DWORD *v15; 
  unsigned int v16; 
  _QWORD *ProducerConsumerBuffer; 
  unsigned __int64 v18; 
  INT64 *v19; 
  _QWORD *v20; 
  int v21; 
  unsigned __int64 v22; 
  __int64 v23; 
  unsigned __int64 v24; 
  UINT64 v25; 
  unsigned int v26; 
  unsigned int v27; 
  unsigned __int64 v28; 
  unsigned __int64 v29; 
  unsigned int v30; 
  unsigned __int64 v31; 
  _DWORD *v32; 
  unsigned __int64 v33; 
  NTSTATUS v34; 
  unsigned __int64 v35; 
  unsigned int v36; 
  _POP_PER_PROCESSOR_CONTEXT *PrivateContext; 
  VOID *v38; 
  UINT64 v39; 
  UINT64 RequestedSize_4; 
  CHAR *ReservedBuffer; 
  int ScratchBuffer; 
  VOID *Callback; 
  _PRODUCER_CONSUMER_CONTEXT *SharedContext; 
  unsigned __int64 v45; 
  __int64 v46; 
  _DWORD *v47; 
  __int64 v48; 
  INT64 v49[22]; 
  char v50[128]; 
  VOID *v51; 

  v4 = v2;
  Callback = v51;
  a9 = *(_DWORD **)&BugCheckParameter3;
  LOBYTE(v39) = v3;
  memset(v49, 0i64, sizeof(v49));
  v7 = (PRODUCER_CONSUMER_CONTEXT *)::SharedContext;
  v8 = 0;
  ScratchBuffer = 0;
  v46 = 0i64;
  LODWORD(RequestedSize_4) = 0;
  SharedContext = (_PRODUCER_CONSUMER_CONTEXT *)::SharedContext;
  while( 1 )
  {
    PopHiberCheckForDebugBreak();
    if( !*(&stru_140C23628 + 98) && a9[48] == KeGetCurrentPrcb()->Number && byte_140C23480 )
      *(&stru_140C23628 + 98) = KeQueryPerformanceCounter(0i64);
    if( a9[48] == KeGetCurrentPrcb()->Number
      && !byte_140C23481
      && (!byte_140C23480 || (unsigned int)dword_140C23464 > 0x640) )
    {
      v13 = __rdtsc();
      if( byte_140C50390 )
      {
        BgDisplayProgressIndicator(1u);
        byte_140C50485 = 1;
      }
      v14 = __rdtsc();
      *(&stru_140C23628 + 95) += (((unsigned __int64)HIDWORD(v14) << 32) | (unsigned int)v14) - v13;
    }
    HIDWORD(v39) = 4;
    v10 = ConsumerPeekAndConsumeBuffer(v7, (UINT64 *)((char *)&v39 + 4), v4, v9);
    v11 = v10;
    if( !v10 )
      break;
    v15 = PopReadProducerConsumerBuffer(v10, 4ui64, &ScratchBuffer, v7, (_POP_PER_PROCESSOR_CONTEXT *)a2, 1u);
    v47 = v15;
    v16 = 8 * (unsigned __int8)*v15;
    ProducerConsumerBuffer = PopReadProducerConsumerBuffer(
                               v11 + 4,
                               v16,
                               v50,
                               SharedContext,
                               (_POP_PER_PROCESSOR_CONTEXT *)a2,
                               1u);
    v19 = &v49[6];
    v20 = ProducerConsumerBuffer;
    v21 = *v15;
    ReservedBuffer = &v11[v16 + 4];
    v22 = 0i64;
    if( (_BYTE)v21 )
    {
      v23 = (unsigned __int8)v21;
      do
      {
        v24 = *v20 >> 4;
        v18 = v24 + (*v20 & 0xFi64) + 1;
        v22 += (*v20 & 0xFi64) + 1;
        while( v24 < v18 )
          *v19++ = v24++;
        ++v20;
        --v23;
      }
      while( v23 );
    }
    if( v22 > (unsigned int)a9[71] )
    {
      PopCheckpointSystemSleep(PopSleepCheckpointDecompressionFailed);
      PopInternalAddToDumpFile(a9, 0x1C8ui64, 0i64);
      KeBugCheckEx(0xA0u, (PVOID)0x107, (PVOID)0xA, a9, 0i64);
    }
    v25 = *(_QWORD *)(a2 + 8);
    v26 = (_DWORD)v22 << 12;
    v48 = v26;
    v49[0] = 0i64;
    LODWORD(v49[1]) = (unsigned __int16)(8 * (((unsigned __int64)v26 >> 12) + 6));
    v49[4] = 0i64;
    v49[5] = v26;
    MmMapMemoryDumpMdlEx2(v25, v18, (INT64)v49, 1i64);
    v27 = (*v15 >> 8) & 0x3FFFFF;
    v7 = SharedContext;
    v45 = __rdtsc();
    if( v27 == v26 )
    {
      ProducerConsumerCopyFromContextBuffer((CHAR *)v49[3], v26, SharedContext, ReservedBuffer);
      *(_QWORD *)(a2 + 72) += __rdtsc() - v45;
      v28 = __rdtsc();
      ProducerConsumerBufferComplete((__int64)v7, (__int64)(v7 + 12), (int)v11, HIDWORD(v39));
      v29 = __rdtsc();
      *(_QWORD *)(a2 + 80) += (((unsigned __int64)HIDWORD(v29) << 32) | (unsigned int)v29) - v28;
    }
    else
    {
      ProducerConsumerCopyFromContextBuffer(*(CHAR **)(a2 + 24), v27, SharedContext, ReservedBuffer);
      v30 = HIDWORD(v39);
      ReservedBuffer = (CHAR *)__rdtsc();
      *(_QWORD *)(a2 + 72) += &ReservedBuffer[-v45];
      ProducerConsumerBufferComplete((__int64)v7, (__int64)(v7 + 12), (int)v11, v30);
      v31 = __rdtsc();
      *(_QWORD *)(a2 + 80) += (((unsigned __int64)HIDWORD(v31) << 32) | (unsigned int)v31) - (_QWORD)ReservedBuffer;
      if( Callback )
      {
        ((void(__fastcall *)(_DWORD *))Callback)(a9);
        v46 = *(&stru_140C23628 + 93);
      }
      v32 = v47;
      v33 = __rdtsc();
      LODWORD(PrivateContext) = (*v47 >> 8) & 0x3FFFFF;
      v34 = RtlDecompressBufferProgress(
              *((_WORD *)&PopCompressMethodMap + ((unsigned __int64)(unsigned int)*v47 >> 30)),
              (UINT8 *)v49[3],
              v26,
              *(UINT8 **)(a2 + 24),
              (UINT64)PrivateContext,
              &RequestedSize_4,
              *(VOID **)(a2 + 16),
              Callback,
              a9,
              v38,
              v39);
      v35 = __rdtsc();
      if( v34 < 0 || (_DWORD)RequestedSize_4 != v26 )
      {
        a9[47] = -1073741246;
        PopCheckpointSystemSleep(PopSleepCheckpointDecompressionFailed);
        PopInternalAddToDumpFile(a9, 0x1C8ui64, 0i64);
        KeBugCheckEx(0xA0u, (PVOID)0x107, (PVOID)0xA, a9, 0i64);
      }
      *(_QWORD *)(a2 + 64) += v35 - v33;
      if( Callback )
        *(_QWORD *)(a2 + 64) = v46 + *(_QWORD *)(a2 + 64) - *(&stru_140C23628 + 93);
      v7 = SharedContext;
      v36 = *v32 >> 30;
      *(_QWORD *)((-(__int64)(v36 < 2) & 0xFFFFFFFFFFFFFFF8ui64) + a2 + 112) += v48;
      *(_QWORD *)((-(__int64)(v36 < 2) & 0xFFFFFFFFFFFFFFF8ui64) + a2 + 96) += v35 - (_QWORD)ReservedBuffer;
    }
    if( !(_BYTE)v39 )
      return v8;
  }
  return -2147483614;
}

Referenced by:

PopRestoreHiberContext