PspStorageRemoveObject

NTSTATUS __stdcall PspStorageRemoveObject(PSP_STORAGE *Storage, UINT64 StorageSlot, UINT8 Force, VOID **RemovedObject){
  NTSTATUS result; 
  int v7; 
  _EX_PUSH_LOCK *v8; 
  unsigned __int64 Value; 
  UINT64 v10; 
  PSP_STORAGE_SLOT *v11; 

  LODWORD(v10) = 0;
  v11 = 0i64;
  result = PspGetStorageArrayIfPossible(Storage, StorageSlot, &v10, &v11);
  v7 = result;
  if( result >= 0 )
  {
    v8 = (_EX_PUSH_LOCK *)&v11[4 * (unsigned int)v10];
    ExAcquirePushLockExclusiveEx(v8, 0i64);
    Value = v8[1].Value;
    if( Value )
    {
      if( Force || (Value & 1) == 0 )
      {
        v8[1]._bf_0 = 0i64;
        Value &= ~1ui64;
      }
      else
      {
        Value = 0i64;
        v7 = -1073741637;
      }
    }
    if( (_InterlockedExchangeAdd64(&v8->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(v8);
    KeAbPostRelease(v8);
    if( v7 >= 0 )
    {
      if( !Value )
        return -1073741275;
      if( RemovedObject )
        *RemovedObject = (VOID *)Value;
      else
        HalPutDmaAdapter((PADAPTER_OBJECT)Value);
    }
    return v7;
  }
  return result;
}

Referenced by:

PsRemoveSiloContext
PsUnregisterSiloMonitor