PspStorageAllocSlot
INT64 __stdcall PspStorageAllocSlot(UINT64 ReturnedStorageSlot){
int v2;
ULONG ClearBitsAndSet;
char v4;
v2 = 0;
ExAcquirePushLockExclusiveEx((UINT64)&PspStorageBitmapLock, 0i64);
ClearBitsAndSet = RtlFindClearBitsAndSet(&PspStorageBitmap, 1u, 0);
if( ClearBitsAndSet == -1 )
{
ClearBitsAndSet = RtlFindClearBitsAndSet((PRTL_BITMAP)PspStorageExpansionBitmap, 1u, 0);
if( ClearBitsAndSet == -1 )
v2 = -1073741670;
else
ClearBitsAndSet += 32;
}
v4 = _InterlockedExchangeAdd64((volatile signed __int64 *)&PspStorageBitmapLock, 0xFFFFFFFFFFFFFFFFui64);
if( (v4 & 2) != 0 && (v4 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)&PspStorageBitmapLock);
KeAbPostRelease(&PspStorageBitmapLock);
if( v2 >= 0 )
*(_DWORD *)ReturnedStorageSlot = ClearBitsAndSet;
return(unsigned int)v2;
}Referenced by:
CmpInitSiloSupport
PsAllocSiloContextSlot
PsRegisterSiloMonitor
PspInitializeSiloStructures
VRegSetup