SMKM_STORE_MGR::SmCompressCtxProcessReadyQueue
__int64 __fastcall SMKM_STORE_MGR::SmCompressCtxProcessReadyQueue(__int64 a1, __int64 a2, KIRQL a3, int a4){
__int64 v4;
INT64 *v6;
KIRQL v7;
char v9;
__int64 *v10;
unsigned int *v11;
__int64 result;
int v13;
unsigned __int64 v14;
__int64 v15;
unsigned __int64 *v16;
INT64 *v17;
INT64 v18;
struct _EX_RUNDOWN_REF *v19;
v4 = a1 + 96;
v6 = (INT64 *)(a1 + 112);
v7 = a3;
if( a3 == 0xFF )
v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(a1 + 112));
while( 1 )
{
v9 = 0;
if( !a4 && (**(_QWORD **)(v4 + 8) & 0xFFFFFFFFFFFFFFF8ui64) < 0x80 )
v9 = 4;
v10 = *(__int64 **)(v4 + 8);
if( v10 == (__int64 *)v4 )
{
v11 = 0i64;
}
else
{
v11 = *(unsigned int **)v4;
*(_QWORD *)v4 = **(_QWORD **)v4 & 0xFFFFFFFFFFFFFFF8ui64;
if( v11 == (unsigned int *)v10 )
{
*(_QWORD *)v4 = 0i64;
*(_QWORD *)(v4 + 8) = v4;
}
else
{
*v10 = *v10 & 7 | (8 * (((unsigned __int64)*v10 >> 3) - 1));
}
}
ExReleaseSpinLockExclusiveFromDpcLevel(v6);
result = v7;
__writecr8(v7);
if( !v11 )
break;
v13 = SMKM_STORE_MGR::SmFeAddInitiate(
a2,
v11 + 6,
1,
*(_DWORD *)(*((_QWORD *)v11 + 13) + 6016i64) & 0x3FF,
(__int64)v11,
*((_ETHREAD **)v11 + 4),
v9);
if( v13 < 0 )
{
if( v13 == -1073741739 )
{
v14 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v6);
v15 = (**(_QWORD **)(v4 + 8) >> 3) + 1i64;
*(_QWORD *)v11 = *(_QWORD *)v4 | *v11 & 7;
v16 = *(unsigned __int64 **)(v4 + 8);
*(_QWORD *)v4 = v11;
if( v16 == (unsigned __int64 *)v4 )
{
*(_QWORD *)(v4 + 8) = v11;
v16 = (unsigned __int64 *)v11;
}
*v16 = *(_DWORD *)v16 & 7 | (unsigned __int64)(8 * v15);
ExReleaseSpinLockExclusiveFromDpcLevel(v6);
result = (unsigned int)KiIrqlFlags;
__writecr8(v14);
return result;
}
MmUnmapLockedPages(*(PVOID *)(**((_QWORD **)v11 + 2) + 24i64), **((PMDL **)v11 + 2));
v17 = (INT64 *)*((_QWORD *)v11 + 4);
v18 = *v17;
*(_DWORD *)v17 = v13;
*(_QWORD *)(*((_QWORD *)v11 + 4) + 8i64) = 0i64;
SmIoRequestComplete((INT64)v17, v11, v18, *((_QWORD *)v11 + 4));
v19 = (struct _EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex(
a2,
*(_DWORD *)(*((_QWORD *)v11 + 13) + 6016i64) & 0x3FF);
ExReleaseRundownProtection(v19 + 1);
ExFreePoolWithTag(v11, 0);
}
v7 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v6);
}
return result;
}
Referenced by:
No references.