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