RtlpHpFixedVsFree
VOID __stdcall RtlpHpFixedVsFree(VOID *HeapAddress, VOID *Address, UINT64 a3, UINT64 a4){
unsigned __int64 v4;
unsigned __int64 v6;
unsigned __int64 Param2;
VOID *v8;
int v9;
unsigned __int8 v10;
__m128i v11;
unsigned __int64 *v12;
unsigned __int64 v13;
unsigned __int64 *v14;
bool i;
unsigned __int8 v16;
UINT8 v17;
int v18;
unsigned __int64 v19;
_ETHREAD *CurrentThread;
unsigned int SessionId;
unsigned __int8 v22;
int v23;
__int64 v24;
_KLOCK_ENTRY *v25;
__int64 v26;
_RTL_BITMAP_EX BitMapHeader;
unsigned __int64 Param1;
UINT64 a3a;
v4 = (unsigned __int64)(unsigned int)a3 >> 12;
v6 = (unsigned __int64)((_BYTE *)Address - (_BYTE *)HeapAddress) >> 12;
Param2 = (unsigned int)a4;
Param1 = (unsigned int)a3;
v8 = Address;
v9 = a4 & 1;
if( (a4 & 1) != 0 )
{
v10 = -1;
}
else
{
v17 = RtlpHpAcquireLockExclusive((_EX_PUSH_LOCK *)HeapAddress + 3, *((_DWORD *)HeapAddress + 8));
v8 = Address;
v10 = v17;
}
v11 = *((__m128i *)HeapAddress + 3);
BitMapHeader.SizeOfBitMap = *((_QWORD *)HeapAddress + 6);
BitMapHeader.Buffer = (unsigned __int64 *)((unsigned __int64)HeapAddress ^ _mm_srli_si128(v11, 8).m128i_u64[0]);
if( v6 >= BitMapHeader.SizeOfBitMap )
goto LABEL_20;
if( v4 <= 1 )
{
if( v4 != 1 )
goto LABEL_20;
v16 = _bittest64((const signed __int64 *)BitMapHeader.Buffer, v6);
LABEL_19:
if( !v16 )
goto LABEL_20;
goto LABEL_8;
}
if( BitMapHeader.SizeOfBitMap - v6 < v4 )
goto LABEL_20;
v12 = &BitMapHeader.Buffer[v6 >> 6];
v13 = *v12;
v14 = &BitMapHeader.Buffer[(v6 + v4 - 1) >> 6];
if( v12 == v14 )
{
if( ((0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v4) << v6) & v13) == 0xFFFFFFFFFFFFFFFFui64 >> (64 - (unsigned __int8)v4) << v6 )
goto LABEL_8;
LABEL_20:
RtlpLogHeapFailure(heap_failure_block_not_busy, HeapAddress, v8, (VOID *)Param1, (VOID *)Param2);
__fastfail(0x32u);
}
for( i = ((-1i64 << v6) & v13) == -1i64 << v6; ; i = *v12 == -1i64 )
{
if( !i )
goto LABEL_20;
if( ++v12 == v14 )
break;
}
if( ((0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v6 + (unsigned __int8)v4 - 1)) & *v12) != 0xFFFFFFFFFFFFFFFFui64 >> ~((unsigned __int8)v6 + (unsigned __int8)v4 - 1) )
{
v16 = 0;
goto LABEL_19;
}
LABEL_8:
RtlClearBitsEx(&BitMapHeader, v6, v4);
if( !v9 )
{
v18 = *((_DWORD *)HeapAddress + 8);
v19 = (unsigned __int64)HeapAddress + 24;
if( v18 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)v19);
__writecr8(v10);
}
else
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v19, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v19);
LODWORD(a3a) = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(v19) == 1 )
SessionId = MmGetSessionIdEx(CurrentThread->Tcb.ApcState.Process);
else
SessionId = -1;
--CurrentThread->Tcb.SpecialApcDisable;
v22 = ++CurrentThread->Tcb.AbAllocationRegionCount;
v23 = ((char)CurrentThread->Tcb.AbEntrySummary | (char)CurrentThread->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
while( 1 )
{
i = !_BitScanReverse((unsigned int *)&v24, v23);
if( i )
goto LABEL_29;
v25 = &CurrentThread->Tcb.LockEntries[v24];
v23 &= ~(1 << v24);
if( (v25->AcquiredByte & 1) != 0
&& (v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == (v19 & 0x7FFFFFFFFFFFFFFCi64)
&& v25->LockState.SessionId == SessionId )
{
v25->AcquiredByte &= ~1u;
if( v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
}
if( !v25 )
{
LABEL_29:
if( (*(&CurrentThread->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, CurrentThread, (PVOID)v19, (PVOID)SessionId, 0i64);
goto LABEL_41;
}
v25->CrossThreadReleasableAndBusyByte |= 2u;
if( v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v25);
LODWORD(a3a) = v25->BoostBitmap.AllFields & 0x1FFFF;
v25->BoostBitmap.AllFields &= 0xFFFE0000;
v25->ThreadLocalFlags &= ~1u;
v25->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v26 = v25 - CurrentThread->Tcb.LockEntries;
if( v22 == 1 )
CurrentThread->Tcb.AbEntrySummary |= 1 << v26;
else
_InterlockedOr8((volatile signed __int8 *)&CurrentThread->Tcb.AbOrphanedEntrySummary, 1 << v26);
LABEL_41:
--CurrentThread->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&CurrentThread->Tcb, (VOID *)v19, &a3a);
i = CurrentThread->Tcb.SpecialApcDisable++ == -1;
if( i
&& ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)CurrentThread->Tcb.ApcState.ApcListHead[0].Flink != &CurrentThread->Tcb.152 )
{
KiCheckForKernelApcDelivery();
}
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
}
}Referenced by:
No references.