PspStorageInsertObject
NTSTATUS __stdcall PspStorageInsertObject(
PSP_STORAGE *Storage,
UINT64 StorageSlot,
UINT8 MakeSlotReadOnly,
VOID *Object){
NTSTATUS result;
_EX_PUSH_LOCK *v7;
signed __int64 v8;
signed __int64 v9;
UINT64 v10;
PSP_STORAGE_SLOT *v11;
LODWORD(v10) = 0;
v11 = 0i64;
result = PspGetStorageArray(Storage, StorageSlot, &v10, &v11);
if( result >= 0 )
{
ObfReferenceObject(Object);
v7 = (_EX_PUSH_LOCK *)&v11[4 * (unsigned int)v10];
ExAcquirePushLockSharedEx(v7, 0i64);
v8 = (unsigned __int64)Object | 1;
if( !MakeSlotReadOnly )
v8 = (signed __int64)Object;
v9 = _InterlockedCompareExchange64(&v7[1]._bf_0, v8, 0i64);
if( _InterlockedCompareExchange64(&v7->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(v7);
KeAbPostRelease(v7);
if( v9 )
{
HalPutDmaAdapter((PADAPTER_OBJECT)Object);
return -1073741637;
}
else
{
return 0;
}
}
return result;
}Referenced by:
PsInsertPermanentSiloContextEx
PsInsertSiloContext