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