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