ExTryAcquirePushLockExclusiveEx
CHAR __fastcall ExTryAcquirePushLockExclusiveEx(UINT64 P2, UINT64 P1){
__int64 v2;
_ETHREAD *CurrentThread;
bool v5;
__int64 v7;
char v8;
int SessionId;
unsigned int v10;
v2 = 0i64;
if( (P1 & 0xFFFFFFFC) != 0 )
KeBugCheckEx(0x152u, (unsigned int)P1, P2, 0i64, 0i64);
if( (P1 & 2) == 0 )
{
v10 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
if( ++*((_BYTE *)CurrentThread + 794) != 1 )
goto LABEL_4;
LOBYTE(v7) = *((_BYTE *)CurrentThread + 792);
if( !(_BYTE)v7 )
{
if( !*((_BYTE *)CurrentThread + 870) )
{
LABEL_14:
if( v2 )
{
if( P2 >= 0xFFFF800000000000ui64 && *((_BYTE *)&antNameB + ((P2 >> 39) & 0x1FF) - 256) == 1 )
SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
else
SessionId = -1;
*(_DWORD *)(v2 + 40) = SessionId;
*(_QWORD *)(v2 + 32) = P2 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_5:
--*((_BYTE *)CurrentThread + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, P2, &v10);
v5 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
if( v5 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
KiCheckForKernelApcDelivery();
goto LABEL_8;
}
LABEL_4:
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
goto LABEL_5;
}
v7 = *((unsigned __int8 *)CurrentThread + 870);
*((_BYTE *)CurrentThread + 870) = 0;
LOBYTE(v7) = *((_BYTE *)CurrentThread + 792) | v7;
}
v8 = v7;
_BitScanForward((unsigned int *)&v7, (unsigned __int8)v7);
*((_BYTE *)CurrentThread + 792) = v8 & ~(1 << v7);
v2 = *((_QWORD *)CurrentThread + 100) + 96 * v7;
goto LABEL_14;
}
LABEL_8:
if( _interlockedbittestandset64((volatile signed __int32 *)P2, 0i64) )
{
if( v2 )
KeAbPostReleaseEx((PVOID)P2, (PVOID)v2);
return 0;
}
else
{
if( v2 )
*(_BYTE *)(v2 + 26) |= 1u;
return 1;
}
}Referenced by:
No references.