SmcCacheAdd
NTSTATUS __stdcall SmcCacheAdd(_SMC_CACHE_MANAGER *CacheMgr, _SMC_CACHE *NewCache, UINT64 *CacheIdOut){
NTSTATUS v3;
int v5;
_SMC_CACHE_MANAGER *v8;
_ETHREAD *CurrentThread;
int v10;
int v11;
v3 = 0;
v5 = 0;
while( 1 )
{
v8 = &CacheMgr[8 * v5];
if( !*(_QWORD *)v8 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)v8 + 2, 0i64);
if( !*(_QWORD *)v8 )
{
*(_QWORD *)v8 = NewCache;
do
{
v10 = v8[6] ^ (v8[6] ^ (v8[6] + 1)) & 0xFFF;
v8[6] = v10;
v11 = v5 | (16 * (v10 & 0xFFF));
*NewCache = v11;
}
while( v11 == -1 );
*(_DWORD *)CacheIdOut = v11;
NewCache = 0i64;
_InterlockedExchange64((volatile __int64 *)v8 + 1, 0i64);
ExAcquireRundownProtection((_EX_RUNDOWN_REF *)v8 + 1);
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)v8 + 2, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)v8 + 2);
KeAbPostRelease(v8 + 4);
KeLeaveCriticalRegion();
if( !NewCache )
break;
}
if( (unsigned int)++v5 >= 0x10 )
return -1073741671;
}
KeSetEvent(*((PRKEVENT *)CacheMgr + 69), 0, 0);
return v3;
}Referenced by:
SmcProcessCreateRequest