PsMakeSiloContextPermanent

INT64 __fastcall PsMakeSiloContextPermanent(_EJOB *Silo, UINT64 ContextSlot){
  struct _PSP_STORAGE *Storage; 
  int StorageArray; 
  UINT64 v4; 
  char v5; 
  UINT64 a3; 
  __int64 a4; 
  if( Silo )
    Storage = Silo->Storage;
  else
    Storage = (struct _PSP_STORAGE *)qword_140D23990;
  LODWORD(a3) = 0;
  a4 = 0i64;
  StorageArray = PspGetStorageArray((INT64)Storage, ContextSlot, &a3, &a4);
  if( StorageArray >= 0 )
  {
    v4 = a4 + 16i64 * (unsigned int)a3;
    ExAcquirePushLockExclusiveEx(v4, 0i64);
    if( (*(_QWORD *)(v4 + 8) & 0xFFFFFFFFFFFFFFFEui64) != 0 )
      *(_QWORD *)(v4 + 8) = *(_QWORD *)(v4 + 8) & 0xFFFFFFFFFFFFFFFEui64 | 1;
    else
      StorageArray = -1073741811;
    v5 = _InterlockedExchangeAdd64((volatile signed __int64 *)v4, 0xFFFFFFFFFFFFFFFFui64);
    if( (v5 & 2) != 0 && (v5 & 4) == 0 )
      ExfTryToWakePushLock((volatile INT64 *)v4);
    KeAbPostRelease((PVOID)v4);
  }
  return(unsigned int)StorageArray;
}

Referenced by:

VrpHandleIoctlInitializeJobForVreg