PsMakeSiloContextPermanent

NTSTATUS __stdcall PsMakeSiloContextPermanent(_EJOB *Silo, UINT64 ContextSlot){
  PSP_STORAGE *v2; 
  int StorageArray; 
  _EX_PUSH_LOCK *v4; 
  char v5; 
  UINT64 Index; 
  PSP_STORAGE_SLOT *Array; 

  if( Silo )
    v2 = (PSP_STORAGE *)*((_QWORD *)Silo + 163);
  else
    v2 = Storage;
  LODWORD(Index) = 0;
  Array = 0i64;
  StorageArray = PspGetStorageArray(v2, ContextSlot, &Index, &Array);
  if( StorageArray >= 0 )
  {
    v4 = (_EX_PUSH_LOCK *)&Array[4 * (unsigned int)Index];
    ExAcquirePushLockExclusiveEx(v4, 0i64);
    if( (v4[1]._bf_0 & 0xFFFFFFFFFFFFFFFEui64) != 0 )
      v4[1]._bf_0 = v4[1]._bf_0 & 0xFFFFFFFFFFFFFFFEui64 | 1;
    else
      StorageArray = -1073741811;
    v5 = _InterlockedExchangeAdd64(&v4->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
    if( (v5 & 2) != 0 && (v5 & 4) == 0 )
      ExfTryToWakePushLock(v4);
    KeAbPostRelease(v4);
  }
  return StorageArray;
}

Referenced by:

VrpHandleIoctlInitializeJobForVreg