ExTryAcquireAutoExpandPushLockExclusive
INT64 __fastcall ExTryAcquireAutoExpandPushLockExclusive(
_CM_KEY_BODY *OrigKeyBody,
_CM_KEY_BODY *VirtualKeyBody,
_KEY_VALUE_ENTRY *ValueEntries,
UINT64 EntryCount,
VOID *ValueBuffer,
UINT64 *BufferLength,
UINT64 *ResultLength){
_BYTE *v7;
INT64 result;
int KeyControlBlock;
UINT8 v11;
UINT64 StatsValue;
v7 = 0i64;
if( ((unsigned int)VirtualKeyBody & 0xFFFFFFFC) != 0 )
KeBugCheckEx(0x152u, (unsigned int)VirtualKeyBody, (ULONG_PTR)OrigKeyBody, 0i64, 0i64);
if( ((unsigned __int8)VirtualKeyBody & 2) == 0 )
{
LODWORD(result) = KeAbPreAcquire(OrigKeyBody, 0i64, 1ui64);
v7 = (_BYTE *)result;
}
if( _interlockedbittestandset64((volatile signed __int32 *)OrigKeyBody, 0i64) )
{
LODWORD(StatsValue) = HIDWORD(OrigKeyBody->KeyControlBlock);
v11 = 0;
if( ExpAeUpdateStatsForExclusiveRelease(&StatsValue) )
{
result = (unsigned int)StatsValue;
HIDWORD(OrigKeyBody->KeyControlBlock) = StatsValue;
}
}
else
{
KeyControlBlock = (int)OrigKeyBody->KeyControlBlock;
v11 = 1;
if( (KeyControlBlock & 1) != 0 )
{
v11 = ExpTryAcquireFannedOutPushLockExclusive((PVOID)(KeyControlBlock & 0xFFFFFFF8));
if( !v11 && (_InterlockedExchangeAdd64((volatile signed __int64 *)OrigKeyBody, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)OrigKeyBody);
}
}
if( v7 )
{
if( v11 )
v7[26] |= 1u;
else
KeAbPostReleaseEx(OrigKeyBody, v7);
}
LOBYTE(result) = v11;
return result;
}Referenced by:
No references.