ExAcquireCacheAwarePushLockSharedEx
unsigned __int64 *__fastcall ExAcquireCacheAwarePushLockSharedEx(
ULONG_PTR BugCheckParameter2,
ULONG_PTR BugCheckParameter1){
__int64 v2;
_ETHREAD *CurrentThread;
__int64 v5;
char v6;
int SessionId;
bool v8;
UINT64 *v9;
char v11;
unsigned int v12;
v2 = 0i64;
if( (BugCheckParameter1 & 0xFFFFFFFC) != 0 )
KeBugCheckEx(0x152u, (unsigned int)BugCheckParameter1, BugCheckParameter2, 0i64, 0i64);
if( (BugCheckParameter1 & 2) == 0 )
{
v12 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 243);
if( ++*((_BYTE *)CurrentThread + 794) != 1 )
KeBugCheckEx(0x192u, (ULONG_PTR)CurrentThread, BugCheckParameter2, KeGetCurrentIrql(), 0i64);
LOBYTE(v5) = *((_BYTE *)CurrentThread + 792);
if( !(_BYTE)v5 )
{
if( !*((_BYTE *)CurrentThread + 870) )
goto LABEL_21;
v11 = *((_BYTE *)CurrentThread + 870);
*((_BYTE *)CurrentThread + 870) = 0;
LOBYTE(v5) = *((_BYTE *)CurrentThread + 792) | v11;
}
v6 = v5;
_BitScanForward((unsigned int *)&v5, (unsigned __int8)v5);
*((_BYTE *)CurrentThread + 792) = v6 & ~(1 << v5);
v2 = *((_QWORD *)CurrentThread + 100) + 96 * v5;
if( v2 )
{
if( BugCheckParameter2 >= 0xFFFF800000000000ui64
&& *((_BYTE *)&antNameB + ((BugCheckParameter2 >> 39) & 0x1FF) - 256) == 1 )
{
SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
}
else
{
SessionId = -1;
}
*(_DWORD *)(v2 + 40) = SessionId;
*(_QWORD *)(v2 + 32) = BugCheckParameter2 & 0x7FFFFFFFFFFFFFFCi64;
LABEL_10:
--*((_BYTE *)CurrentThread + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, BugCheckParameter2, &v12);
v8 = (*((_WORD *)CurrentThread + 243))++ == 0xFFFF;
if( v8 && *((_ETHREAD **)CurrentThread + 19) != (_ETHREAD *)((char *)CurrentThread + 152) )
KiCheckForKernelApcDelivery();
goto LABEL_11;
}
LABEL_21:
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x10u);
goto LABEL_10;
}
LABEL_11:
v9 = *(UINT64 **)(BugCheckParameter2 + 8i64 * (*((_DWORD *)KeGetPcr() + 105) & 0x1F));
if( _InterlockedCompareExchange64((volatile signed __int64 *)v9, 17i64, 0i64) && !ExfTryAcquirePushLockShared(v9) )
ExfAcquirePushLockSharedEx(v9, (VOID *)v2, (VOID *)BugCheckParameter2);
if( v2 )
*(_BYTE *)(v2 + 26) |= 1u;
return v9;
}Referenced by:
No references.