ExReleaseCacheAwarePushLockSharedEx
VOID __fastcall ExReleaseCacheAwarePushLockSharedEx(INT64 *P2, UINT64 P1){
char v2;
INT64 v4;
_ETHREAD *CurrentThread;
int SessionId;
char v7;
__int64 v8;
unsigned int v9;
__int64 v10;
int v11;
unsigned int v12;
__int64 v13;
int v14;
v2 = P1;
if( (P1 & 0xFFFFFFFC) != 0 )
KeBugCheckEx(0x152u, (unsigned int)P1, (ULONG_PTR)P2, 0i64, 0i64);
if( _InterlockedCompareExchange64(P2, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(P2);
if( (v2 & 2) == 0 )
{
v4 = P2[2];
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v14 = 0;
if( (unsigned int)MiGetSystemRegionType(v4) == 1 )
SessionId = MmGetSessionIdEx(*((_QWORD *)CurrentThread + 23));
else
SessionId = -1;
--*((_WORD *)CurrentThread + 243);
v7 = ++*((_BYTE *)CurrentThread + 794);
v8 = KiAbThreadClearAcquiredLockEntry((__int64)CurrentThread, v4, SessionId);
v10 = v8;
if( v8 )
{
*(_BYTE *)(v8 + 32) |= 2u;
if( *(__int64 *)(v8 + 32) < 0 )
KiAbEntryRemoveFromTree(v8);
v11 = *(_DWORD *)(v10 + 88) & 0x1FFFF;
v12 = *(_DWORD *)(v10 + 88) & 0xFFFE0000;
*(_BYTE *)(v10 + 25) &= ~1u;
v14 = v11;
*(_DWORD *)(v10 + 88) = v12;
*(_QWORD *)(v10 + 32) = 0i64;
v13 = (v10 - *((_QWORD *)CurrentThread + 100)) / 96;
if( v7 == 1 )
*((_BYTE *)CurrentThread + 792) |= 1 << v13;
else
_InterlockedOr8((volatile signed __int8 *)CurrentThread + 870, 1 << v13);
}
else if( (*((_DWORD *)CurrentThread + 30) & 0x10000) == 0 )
{
KeBugCheckEx(0x162u, (ULONG_PTR)CurrentThread, v4, v9, 0i64);
}
--*((_BYTE *)CurrentThread + 794);
KiAbThreadRemoveBoosts((ULONG_PTR)CurrentThread, v4, (unsigned int *)&v14);
KiLeaveGuardedRegionUnsafe((__int64)CurrentThread);
}
}Referenced by:
No references.