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