RtlpHpVsSubsegmentCommitPages
NTSTATUS __stdcall RtlpHpVsSubsegmentCommitPages(INT64 a1, INT64 a2, UINT64 r8_0, UINT64 a4, INT64 a5){
unsigned __int64 v6;
unsigned __int64 v7;
unsigned __int64 v9;
volatile signed __int64 *v10;
unsigned int v11;
__int64 v12;
INT64 v13;
UINT8 CurrentIrql;
UINT8 v15;
INT64 v16;
unsigned __int64 v17;
NTSTATUS v18;
_ETHREAD *v20;
unsigned int SessionId;
unsigned __int8 v22;
int v23;
bool v24;
__int64 v25;
_KLOCK_ENTRY *v26;
__int64 v27;
_ETHREAD *CurrentThread;
int v29;
UINT8 v30;
UINT64 a3;
v6 = (unsigned int)a4;
_BitScanForward64(&v7, r8_0);
_BitScanReverse64(&v9, r8_0);
v10 = (volatile signed __int64 *)(a2 + 24);
v29 = v9 - v7 + 1;
v11 = v29 << 12;
v12 = ((1i64 << v29) - 1) << v7;
v13 = a2 + (unsigned int)((_DWORD)v7 << 12);
if( *(_DWORD *)(a1 + 8) )
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
ExpAcquireSpinLockExclusive((INT64 *)(a2 + 24), CurrentIrql);
v15 = CurrentIrql;
v11 = v29 << 12;
v30 = v15;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v30 = 0;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(a2 + 24), 0i64);
}
v16 = a1 ^ *(_QWORD *)(a1 + 128);
if( !(_DWORD)a5 )
{
((void(__fastcall *)(INT64, INT64, _QWORD))(a1 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(a1 + 160)))(v16, v13, v11);
*(_QWORD *)(a2 + 16) &= ~v12;
v17 = -(int)v6;
LABEL_5:
_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 48), v17);
v18 = 0;
goto LABEL_6;
}
v18 = ((__int64(__fastcall *)(INT64, INT64, _QWORD))(a1 ^ RtlpHpHeapGlobals ^ *(_QWORD *)(a1 + 152)))(v16, v13, v11);
if( v18 >= 0 )
{
*(_QWORD *)(a2 + 16) |= v12;
v17 = v6;
goto LABEL_5;
}
LABEL_6:
if( *(_DWORD *)(a1 + 8) )
{
*(_DWORD *)v10 = 0;
__writecr8(v30);
}
else
{
if( (_InterlockedExchangeAdd64(v10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)(a2 + 24));
LODWORD(a3) = 0;
v20 = (_ETHREAD *)KeGetCurrentThread();
if( MiGetSystemRegionType(a2 + 24) == 1 )
SessionId = MmGetSessionIdEx(v20->Tcb.ApcState.Process);
else
SessionId = -1;
--v20->Tcb.SpecialApcDisable;
v22 = ++v20->Tcb.AbAllocationRegionCount;
v23 = ((char)v20->Tcb.AbEntrySummary | (char)v20->Tcb.AbOrphanedEntrySummary) ^ 0x3F;
v24 = !_BitScanReverse((unsigned int *)&v25, v23);
if( v24 )
goto LABEL_31;
while( 1 )
{
v26 = &v20->Tcb.LockEntries[v25];
v23 &= ~(1 << v25);
if( (v26->AcquiredByte & 1) != 0
&& (v26->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 1) == 0
&& (v26->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 & 0x7FFFFFFFFFFFFFFCi64) == ((unsigned __int64)v10 & 0x7FFFFFFFFFFFFFFCi64)
&& v26->LockState.SessionId == SessionId )
{
v26->AcquiredByte &= ~1u;
if( v26->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 )
break;
}
v24 = !_BitScanReverse((unsigned int *)&v25, v23);
if( v24 )
goto LABEL_31;
}
if( !v26 )
{
LABEL_31:
if( (*(&v20->Tcb.MiscFlags + 1) & 0x10000) == 0 )
KeBugCheckEx(0x162u, v20, (PVOID)(a2 + 24), (PVOID)SessionId, 0i64);
}
else
{
v26->CrossThreadReleasableAndBusyByte |= 2u;
if( v26->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 < 0 )
KiAbEntryRemoveFromTree(v26);
LODWORD(a3) = v26->BoostBitmap.AllFields & 0x1FFFF;
v26->BoostBitmap.AllFields &= 0xFFFE0000;
v26->ThreadLocalFlags &= ~1u;
v26->LockState.$E8276A2CF8B819ED32D1B6FEB35D730A::_bf_0 = 0i64;
v27 = v26 - v20->Tcb.LockEntries;
if( v22 == 1 )
v20->Tcb.AbEntrySummary |= 1 << v27;
else
_InterlockedOr8((volatile signed __int8 *)&v20->Tcb.AbOrphanedEntrySummary, 1 << v27);
}
--v20->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v20->Tcb, (VOID *)(a2 + 24), &a3);
v24 = v20->Tcb.SpecialApcDisable++ == -1;
if( v24 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v20->Tcb.ApcState.ApcListHead[0].Flink != &v20->Tcb.152 )
KiCheckForKernelApcDelivery();
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
}
return v18;
}Referenced by:
RtlpHpVsChunkDecommit
RtlpHpVsChunkSplit
RtlpHpVsContextFree