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