SmcStoreSlotReserve
_SMC_STORE_ENTRY *__stdcall SmcStoreSlotReserve(_SMC_CACHE *Cache, UINT64 RegionIndex, UINT64 RegionCount){
unsigned __int64 v4;
unsigned int v5;
_SMC_STORE_ENTRY *v6;
_PRIVILEGE_SET *v7;
_PRIVILEGE_SET *v8;
_PRIVILEGE_SET *p_Control;
_ETHREAD *CurrentThread;
_SMC_CACHE *v11;
_SMC_CACHE v12;
v4 = ((unsigned __int64)(unsigned int)Cache[2] + 31) >> 5;
v5 = RegionCount;
v6 = 0i64;
LODWORD(v7) = SSHSupportAllocateNonPaged(4 * v4, 0x72436D73u);
v8 = v7;
if( !v7 )
return v6;
p_Control = v7;
if( v4 )
{
if( ((unsigned __int8)v7 & 4) != 0 )
{
v7->PrivilegeCount = -1;
if( !--v4 )
goto LABEL_8;
p_Control = (_PRIVILEGE_SET *)&v7->Control;
}
memset(p_Control, 0xFFu, 8 * (v4 >> 1));
if( (v4 & 1) != 0 )
*((_DWORD *)p_Control + v4 - 1) = -1;
}
LABEL_8:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = Cache + 42;
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Cache + 20, 0i64);
while( v11 < Cache + 138 )
{
if( *v11 == -1 )
{
v12 = v11[1];
if( (v12 & 4) == 0 )
{
*((_QWORD *)v11 + 1) = v8;
v11[1] = v12 | 4;
v8 = 0i64;
if( SmcStorePlacementGet(Cache, v5, v11) >= 0 )
{
v6 = v11;
v11 = 0i64;
}
if( v11 )
{
SmcStoreSlotAbort(Cache, v11, 1ui64);
return v6;
}
break;
}
}
v11 += 6;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Cache + 20, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)Cache + 20);
KeAbPostRelease(Cache + 40);
KeLeaveCriticalRegion();
if( v8 )
CmSiFreeMemory(v8);
return v6;
}Referenced by:
SmcStoreCreate