SmcCacheAdd
INT64 __fastcall SmcCacheAdd(INT64 a1, INT64 *a2, INT64 *a3){
unsigned int v3;
unsigned int v5;
INT64 v8;
_ETHREAD *CurrentThread;
int v10;
int v11;
v3 = 0;
v5 = 0;
while( 1 )
{
v8 = a1 + 32i64 * v5;
if( !*(_QWORD *)v8 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(v8 + 16, 0i64);
if( !*(_QWORD *)v8 )
{
*(_QWORD *)v8 = a2;
do
{
v10 = *(_DWORD *)(v8 + 24) ^ (*(_DWORD *)(v8 + 24) ^ (*(_DWORD *)(v8 + 24) + 1)) & 0xFFF;
*(_DWORD *)(v8 + 24) = v10;
v11 = v5 | (16 * (v10 & 0xFFF));
*(_DWORD *)a2 = v11;
}
while( v11 == -1 );
*(_DWORD *)a3 = v11;
a2 = 0i64;
_InterlockedExchange64((volatile __int64 *)(v8 + 8), 0i64);
ExAcquireRundownProtection((PEX_RUNDOWN_REF)(v8 + 8));
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(v8 + 16), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(v8 + 16));
KeAbPostRelease((PVOID)(v8 + 16));
KeLeaveCriticalRegion();
if( !a2 )
break;
}
if( ++v5 >= 0x10 )
return(unsigned int)-1073741671;
}
KeSetEvent(*(PRKEVENT *)(a1 + 552), 0);
return v3;
}Referenced by:
SmcProcessCreateRequest