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