PspStorageGetObject

NTSTATUS __stdcall PspStorageGetObject(PSP_STORAGE *Storage, UINT64 StorageSlot, VOID **ReturnedObject){
  _EX_PUSH_LOCK *v4; 
  VOID *v5; 

  if( (unsigned int)StorageSlot < 0x20 )
    goto LABEL_2;
  LODWORD(StorageSlot) = StorageSlot - 32;
  if( (unsigned int)StorageSlot < 0x100 )
  {
    Storage = (PSP_STORAGE *)*((_QWORD *)Storage + 64);
    if( !Storage )
      return -1073741275;
LABEL_2:
    v4 = (_EX_PUSH_LOCK *)&Storage[4 * (unsigned int)StorageSlot];
    ExAcquirePushLockSharedEx(v4, 0i64);
    v5 = (VOID *)(v4[1]._bf_0 & 0xFFFFFFFFFFFFFFFEui64);
    if( v5 )
      ObfReferenceObjectWithTag((VOID *)(v4[1]._bf_0 & 0xFFFFFFFFFFFFFFFEui64), 0x746C6644ui64);
    if( _InterlockedCompareExchange64(&v4->_bf_0, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared(v4);
    KeAbPostRelease(v4);
    if( v5 )
    {
      *ReturnedObject = v5;
      return 0;
    }
    return -1073741275;
  }
  return -1073741811;
}

Referenced by:

PsFreeSiloContextSlot
PsGetSiloContext