ViFreeTrackedPool

VOID __stdcall ViFreeTrackedPool(VOID *VirtualAddress, UINT64 ChargedBytes, UINT64 CheckType, UINT64 SpecialPool){
  char v5; 
  UINT64 v6; 
  INT64 *Param4; 
  _SLIST_ENTRY *v8; 
  unsigned __int64 v9; 
  _SLIST_HEADER *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 = (_SLIST_ENTRY *)*Param4;
  v9 = *Param4 & 0xFFFFFFFFFFFFF000ui64;
  v10 = *(_SLIST_HEADER **)(v9 + 8);
  if( (MmVerifierData & 0x800) != 0 )
  {
    if( ((unsigned __int8)v8 & 3) != 0 || !MmIsAddressValidEx(*Param4) )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Au, (ULONG_PTR)VirtualAddress, (ULONG_PTR)v8, (ULONG_PTR)Param4, v15);
    if( *(_QWORD *)(v9 + 16) != 556929861i64 )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Bu, (ULONG_PTR)VirtualAddress, v9 + 16, (ULONG_PTR)Param4, v15);
    if( ((unsigned __int8)v10 & 3) != 0 || !MmIsAddressValidEx((INT64)&v10[2].Region) )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Cu, (ULONG_PTR)VirtualAddress, (ULONG_PTR)v10, v9 + 8, v15);
    if( v10[2].Region != 2557876544 )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Du, (ULONG_PTR)VirtualAddress, (_DWORD)v10 + 40, 0x98761940, v15);
    if( v8->Next != VirtualAddress )
      VerifierBugCheckIfAppropriate(
        0xC4ui64,
        0x13Eu,
        (ULONG_PTR)VirtualAddress,
        (ULONG_PTR)v8->Next,
        (ULONG_PTR)v8,
        v15);
    if( v8[1].Next != (_SLIST_ENTRY *)v6 )
      VerifierBugCheckIfAppropriate(0xC4ui64, 0x13Fu, (ULONG_PTR)VirtualAddress, v6, (_DWORD)v8 + 16, v15);
  }
  v8[1].Next = (_SLIST_ENTRY *)((unsigned __int64)v8[1].Next | 1);
  RtlpInterlockedPushEntrySList(v10 + 5, v8);
  v11 = v5 & 1;
  v12 = -(__int64)v6;
  _InterlockedExchangeAdd64((volatile signed __int64 *)&v10[7].Region + (v11 ^ 1i64), v12);
  v13 = &qword_140C2A670;
  _InterlockedDecrement((volatile signed __int32 *)&v10[6].HeaderX64 + (v11 ^ 1i64) + 2);
  if( !v11 )
    v13 = &qword_140C2A678;
  _InterlockedExchangeAdd64(v13, v12);
  v14 = &dword_140C2A660;
  if( !v11 )
    v14 = &dword_140C2A664;
  _InterlockedDecrement(v14);
}

Referenced by:

VerifierFreeTrackedPool