StLockTryAcquireExclusive
__int64 __fastcall StLockTryAcquireExclusive(VOID *Lock, unsigned int *a2){
_ETHREAD *CurrentThread;
_ETHREAD *v5;
__int64 v6;
bool v7;
__int64 v9;
char v10;
NTSTATUS SessionId;
unsigned __int8 AbOrphanedEntrySummary;
UINT64 a3;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.SpecialApcDisable;
LODWORD(a3) = 0;
v5 = (_ETHREAD *)KeGetCurrentThread();
--v5->Tcb.SpecialApcDisable;
if( ++v5->Tcb.AbAllocationRegionCount != 1 )
{
v6 = 0i64;
goto LABEL_3;
}
LOBYTE(v9) = v5->Tcb.AbEntrySummary;
if( !(_BYTE)v9 )
{
if( !v5->Tcb.AbOrphanedEntrySummary )
{
v6 = 0i64;
goto LABEL_3;
}
AbOrphanedEntrySummary = v5->Tcb.AbOrphanedEntrySummary;
v5->Tcb.AbOrphanedEntrySummary = 0;
LOBYTE(v9) = v5->Tcb.AbEntrySummary | AbOrphanedEntrySummary;
}
v10 = v9;
_BitScanForward((unsigned int *)&v9, (unsigned __int8)v9);
v5->Tcb.AbEntrySummary = v10 & ~(1 << v9);
v6 = (__int64)&v5->Tcb.LockEntries[v9];
if( !v6 )
{
LABEL_3:
_interlockedbittestandset((volatile signed __int32 *)&v5->Tcb.116 + 1, 0x10u);
goto LABEL_4;
}
if( (unsigned __int64)Lock >= 0xFFFF800000000000ui64
&& *((_BYTE *)&stru_140C4DB30 + (((unsigned __int64)Lock >> 39) & 0x1FF) + 6872) == 1 )
{
SessionId = MmGetSessionIdEx(v5->Tcb.ApcState.Process);
}
else
{
SessionId = -1;
}
*(_DWORD *)(v6 + 40) = SessionId;
*(_QWORD *)(v6 + 32) = (unsigned __int64)Lock & 0x7FFFFFFFFFFFFFFCi64;
LABEL_4:
--v5->Tcb.AbAllocationRegionCount;
KiAbThreadRemoveBoosts(&v5->Tcb, Lock, &a3);
v7 = v5->Tcb.SpecialApcDisable++ == -1;
if( v7 && ($F25F8C4BA33AF922A5F1AF68CD89DDDF *)v5->Tcb.ApcState.ApcListHead[0].Flink != &v5->Tcb.152 )
KiCheckForKernelApcDelivery();
if( _interlockedbittestandset64((volatile signed __int32 *)Lock, 0i64) )
{
if( v6 )
KeAbPostReleaseEx(Lock, (VOID *)v6);
KiLeaveGuardedRegionUnsafe((__int64)KeGetCurrentThread());
return 0i64;
}
else
{
if( v6 )
*(_BYTE *)(v6 + 26) |= 1u;
*a2 = 1;
return 1i64;
}
}Referenced by:
SMKM_STORE_MGR::SmFeAddInitiate