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