SmProcessCompressionInfoRequest
NTSTATUS __stdcall SmProcessCompressionInfoRequest(
PVOID UserData,
UINT64 UserDataLength,
UINT64 *ReturnLength,
INT8 RequestorMode){
int v5;
NTSTATUS v7;
__int64 v8;
_ETHREAD *CurrentThread;
__int64 v10;
__int64 v11;
unsigned int v12;
__int64 v13;
__int64 v14;
__int64 v15;
int StoreStats;
struct _EX_RUNDOWN_REF *v18;
char *v19;
__int64 v20;
unsigned int v21;
__int128 v22;
__int128 v23;
__int64 v24;
__int64 v25;
UINT64 *v26;
INT64 result;
unsigned int v28;
unsigned int v29;
unsigned int v30;
char v31;
v26 = ReturnLength;
v5 = UserDataLength;
memset((INT64)&result, 0i64);
v7 = 0;
v21 = 0;
LODWORD(v22) = 0;
v24 = 0i64;
if( v5 != 40 )
return -1073741306;
if( RequestorMode )
{
if( ((unsigned __int8)UserData & 7) != 0 )
ExRaiseDatatypeMisalignment();
v8 = (__int64)UserData;
if( (unsigned __int64)UserData >= 0x7FFFFFFF0000i64 )
v8 = 0x7FFFFFFF0000i64;
*(_BYTE *)v8 = *(_BYTE *)v8;
*(_BYTE *)(v8 + 39) = *(_BYTE *)(v8 + 39);
}
v22 = *(_OWORD *)UserData;
v23 = *((_OWORD *)UserData + 1);
v24 = *((_QWORD *)UserData + 4);
if( (_BYTE)v22 != 3 || (v22 & 0xFFFFFF00) != 0 )
return -1073741811;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&BugCheckParameter2, 0i64);
if( qword_140D23158 )
{
DWORD1(v22) = *((_DWORD *)qword_140D23158 + 272);
*((_QWORD *)&v22 + 1) = *((_QWORD *)qword_140D23158 + 226) << 12;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&BugCheckParameter2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&BugCheckParameter2);
KeAbPostRelease(&BugCheckParameter2);
KeLeaveCriticalRegion();
v10 = 0i64;
v11 = 0i64;
v23 = 0ui64;
v12 = 0;
v13 = v24;
do
{
v14 = SmKmStoreReferenceEx((INT64)&SmGlobals, v12);
v25 = v14;
if( v14 )
{
v21 = 1536;
StoreStats = SMKM_STORE::SmStGetStoreStats(v14, v15, (__int64)&result, &v21);
v18 = (struct _EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex((INT64)&SmGlobals, *(_DWORD *)(v25 + 6016) & 0x3FF);
ExReleaseRundownProtection(v18 + 1);
if( StoreStats >= 0 )
{
v19 = &v31;
v20 = 8i64;
do
{
v10 += v28 * (unsigned __int64)*(unsigned int *)v19;
*((_QWORD *)&v23 + 1) = v10;
v19 += 8;
--v20;
}
while( v20 );
v11 += (unsigned __int64)v29 << 12;
*(_QWORD *)&v23 = v11;
v13 += (unsigned __int64)v30 << 12;
v24 = v13;
}
}
++v12;
}
while( v12 < 0x400 );
*(_OWORD *)UserData = v22;
*((_OWORD *)UserData + 1) = v23;
*((_QWORD *)UserData + 4) = v24;
*(_DWORD *)v26 = 40;
}
else
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&BugCheckParameter2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&BugCheckParameter2);
KeAbPostRelease(&BugCheckParameter2);
KeLeaveCriticalRegion();
return -1073741399;
}
return v7;
}Referenced by:
SmQueryStoreInformation