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