ViFreeTrackedPool

VOID __stdcall ViFreeTrackedPool(PVOID VirtualAddress, UINT64 ChargedBytes, UINT64 CheckType, UINT64 SpecialPool){
  char v5; 
  UINT64 v6; 
  INT64 *Param4; 
  UINT64 v8; 
  unsigned __int64 v9; 
  UINT64 v10; 
  unsigned int v11; 
  unsigned __int64 v12; 
  volatile signed __int64 *v13; 
  volatile signed __int32 *v14; 
  UINT64 v15; 
  v5 = CheckType;
  v6 = ChargedBytes;
  if( (_DWORD)SpecialPool == 1 )
  {
    Param4 = (INT64 *)(((unsigned __int64)VirtualAddress & 0xFFFFFFFFFFFFF000ui64)
                     + (-(__int64)(((unsigned __int16)VirtualAddress & 0xFFF) != 0i64) & 0xFFFFFFFFFFFFF028ui64)
                     + 4072);
  }
  else if( ((unsigned __int16)VirtualAddress & 0xFFF) != 0 )
  {
    v6 = ChargedBytes - 16;
    Param4 = (INT64 *)((char *)VirtualAddress + ChargedBytes - 24);
  }
  else
  {
    Param4 = (INT64 *)((char *)VirtualAddress + ChargedBytes - 8);
  }
  v8 = *Param4;
  v9 = *Param4 & 0xFFFFFFFFFFFFF000ui64;
  v10 = *(_QWORD *)(v9 + 8);
  if( (MmVerifierData & 0x800) != 0 )
  {
    if( (v8 & 3) != 0 || !MmIsAddressValidEx(*Param4) )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Aui64, (UINT64)VirtualAddress, v8, (UINT64)Param4, v15);
    if( *(_QWORD *)(v9 + 16) != 556929861i64 )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Bui64, (UINT64)VirtualAddress, v9 + 16, (UINT64)Param4, v15);
    if( (v10 & 3) != 0 || !MmIsAddressValidEx(v10 + 40) )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Cui64, (UINT64)VirtualAddress, v10, v9 + 8, v15);
    if( *(_QWORD *)(v10 + 40) != 2557876544i64 )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Dui64, (UINT64)VirtualAddress, v10 + 40, 0x98761940ui64, v15);
    if( *(PVOID *)v8 != VirtualAddress )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Eui64, (UINT64)VirtualAddress, *(_QWORD *)v8, v8, v15);
    if( *(_QWORD *)(v8 + 16) != v6 )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Fui64, (UINT64)VirtualAddress, v6, v8 + 16, v15);
  }
  *(_QWORD *)(v8 + 16) |= 1ui64;
  RtlpInterlockedPushEntrySList((PSLIST_HEADER)(v10 + 80), (PSLIST_ENTRY)v8);
  v11 = v5 & 1;
  v12 = -(__int64)v6;
  _InterlockedExchangeAdd64((volatile signed __int64 *)(v10 + 8 * (v11 ^ 1i64) + 120), v12);
  v13 = &qword_140C2A670;
  _InterlockedDecrement((volatile signed __int32 *)(v10 + 4 * (v11 ^ 1i64) + 104));
  if( !v11 )
    v13 = &qword_140C2A678;
  _InterlockedExchangeAdd64(v13, v12);
  v14 = &dword_140C2A660;
  if( !v11 )
    v14 = &dword_140C2A664;
  _InterlockedDecrement(v14);
}

Referenced by:

VerifierFreeTrackedPool