SmcStoreSlotReserve
unsigned __int64 __fastcall SmcStoreSlotReserve(__int64 a1, __int64 a2, ULONG a3){
unsigned __int64 v4;
unsigned __int64 v6;
INT64 NonPaged;
struct _PRIVILEGE_SET *v8;
void *v9;
_ETHREAD *CurrentThread;
unsigned __int64 v11;
int v12;
v4 = ((unsigned __int64)*(unsigned int *)(a1 + 8) + 31) >> 5;
v6 = 0i64;
NonPaged = SSHSupportAllocateNonPaged(4 * v4, 0x72436D73u);
v8 = (struct _PRIVILEGE_SET *)NonPaged;
if( !NonPaged )
return v6;
v9 = (void *)NonPaged;
if( v4 )
{
if( (NonPaged & 4) != 0 )
{
*(_DWORD *)NonPaged = -1;
if( !--v4 )
goto LABEL_8;
v9 = (void *)(NonPaged + 4);
}
memset(v9, 0xFFu, 8 * (v4 >> 1));
if( (v4 & 1) != 0 )
*((_DWORD *)v9 + v4 - 1) = -1;
}
LABEL_8:
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v11 = a1 + 168;
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx(a1 + 160, 0i64);
while( v11 < a1 + 552 )
{
if( *(_DWORD *)v11 == -1 )
{
v12 = *(_DWORD *)(v11 + 4);
if( (v12 & 4) == 0 )
{
*(_QWORD *)(v11 + 8) = v8;
*(_DWORD *)(v11 + 4) = v12 | 4;
v8 = 0i64;
if( (int)SmcStorePlacementGet(a1, a3, v11) >= 0 )
{
v6 = v11;
v11 = 0i64;
}
if( v11 )
{
SmcStoreSlotAbort(a1, v11, 1);
return v6;
}
break;
}
}
v11 += 24i64;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 160), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(a1 + 160));
KeAbPostRelease((PVOID)(a1 + 160));
KeLeaveCriticalRegion();
if( v8 )
CmSiFreeMemory(v8);
return v6;
}Referenced by:
SmcStoreCreate