MiLockAddressSpaceToo
VOID __stdcall MiLockAddressSpaceToo(_EPROCESS *Process, _MMVAD_SHORT *LockedVad){
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *p_AddressCreationLock;
_ETHREAD *v5;
unsigned __int8 AbEntrySummary;
__int64 v7;
__int64 v8;
NTSTATUS SessionId;
bool v10;
__int64 AbOrphanedEntrySummary;
UINT64 a3;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
LODWORD(a3) = 0;
p_AddressCreationLock = &Process->AddressCreationLock;
v5 = (_ETHREAD *)KeGetCurrentThread();
--v5->Tcb.SpecialApcDisable;
if( ++v5->Tcb.AbAllocationRegionCount != 1 )
{
v8 = 0i64;
goto LABEL_9;
}
AbEntrySummary = v5->Tcb.AbEntrySummary;
if( !AbEntrySummary )
{
if( !v5->Tcb.AbOrphanedEntrySummary )
{
v8 = 0i64;
goto LABEL_9;
}
AbOrphanedEntrySummary = v5->Tcb.AbOrphanedEntrySummary;
v5->Tcb.AbOrphanedEntrySummary = 0;
AbEntrySummary = AbOrphanedEntrySummary | v5->Tcb.AbEntrySummary;
}
_BitScanForward((unsigned int *)&v7, AbEntrySummary);
v5->Tcb.AbEntrySummary = AbEntrySummary & ~(1 << v7);
v8 = (__int64)&v5->Tcb.LockEntries[v7];
if( !v8 )
{
LABEL_9:
_interlockedbittestandset((volatile signed __int32 *)&v5->Tcb.116 + 1, 0x10u);
goto LABEL_10;
}
if( (unsigned __int64)p_AddressCreationLock >= 0xFFFF800000000000ui64
&& *((_BYTE *)&stru_140C4DB30 + (((unsigned __int64)p_AddressCreationLock >> 39) & 0x1FF) + 6872) == 1 )
{
SessionId = MmGetSessionIdEx(v5->Tcb.ApcState.Process);
}
else
{
SessionId = -1;
}
*(_DWORD *)(v8 + 40) = SessionId;
*(_QWORD *)(v8 + 32) = (unsigned __int64)p_AddressCreationLock & 0x7FFFFFFFFFFFFFFCi64;
LABEL_10:
--v5->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v5->Tcb, p_AddressCreationLock, &a3);
v10 = v5->Tcb.SpecialApcDisable++ == -1;
if( v10 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v5->Tcb.ApcState.ApcListHead[0].Flink != &v5->Tcb.152 )
KiCheckForKernelApcDelivery();
if( _interlockedbittestandset64((volatile signed __int32 *)p_AddressCreationLock, 0i64) )
{
if( v8 )
KeAbPostReleaseEx(p_AddressCreationLock, (VOID *)v8);
MiUnlockVad(CurrentThread, LockedVad);
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(p_AddressCreationLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 1u;
--CurrentThread->Tcb.SpecialApcDisable;
ExAcquirePushLockExclusiveEx(&LockedVad->PushLock, 0i64);
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 0x80u;
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
else
{
if( v8 )
*(_BYTE *)(v8 + 26) |= 1u;
CurrentThread->$84F33738BEE95ACDF5C5BF1C8FDC7C8C::_bf_0 |= 1u;
}
}Referenced by:
MiPrepareVadDelete