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