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;
_DWORD *v14;
__int64 v15;
int StoreStats;
_EX_RUNDOWN_REF *v18;
int *v19;
__int64 v20;
unsigned int v21;
__int128 v22;
__int128 v23;
__int64 v24;
_DWORD *v25;
UINT64 *v26;
int v27[384];
v26 = ReturnLength;
v5 = UserDataLength;
memset(v27, 0i64, sizeof(v27));
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();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&BugCheckParameter2, 0i64);
if( Object )
{
DWORD1(v22) = *((_DWORD *)Object + 272);
*((_QWORD *)&v22 + 1) = *((_QWORD *)Object + 226) << 12;
if( (_InterlockedExchangeAdd64(&BugCheckParameter2._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&BugCheckParameter2);
KeAbPostRelease(&BugCheckParameter2);
KeLeaveCriticalRegion();
v10 = 0i64;
v11 = 0i64;
v23 = 0ui64;
v12 = 0;
v13 = v24;
do
{
v14 = SmKmStoreReferenceEx((_SMKM_STORE_LIST *)SmGlobals, v12);
v25 = v14;
if( v14 )
{
v21 = 1536;
StoreStats = SMKM_STORE::SmStGetStoreStats((__int64)v14, v15, (__int64)v27, &v21);
v18 = (_EX_RUNDOWN_REF *)SmKmStoreRefFromStoreIndex((__int64)SmGlobals, v25[1504] & 0x3FF);
ExReleaseRundownProtection(v18 + 1);
if( StoreStats >= 0 )
{
v19 = &v27[11];
v20 = 8i64;
do
{
v10 += (unsigned int)v27[3] * (unsigned __int64)(unsigned int)*v19;
*((_QWORD *)&v23 + 1) = v10;
v19 += 2;
--v20;
}
while( v20 );
v11 += (unsigned __int64)(unsigned int)v27[8] << 12;
*(_QWORD *)&v23 = v11;
v13 += (unsigned __int64)(unsigned int)v27[9] << 12;
v24 = v13;
}
}
++v12;
}
while( v12 < 0x400 );
*(_OWORD *)UserData = v22;
*((_OWORD *)UserData + 1) = v23;
*((_QWORD *)UserData + 4) = v24;
*(_DWORD *)v26 = 40;
}
else
{
if( (_InterlockedExchangeAdd64(&BugCheckParameter2._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&BugCheckParameter2);
KeAbPostRelease(&BugCheckParameter2);
KeLeaveCriticalRegion();
return -1073741399;
}
return v7;
}Referenced by:
SmQueryStoreInformation