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