PsMakeSiloContextPermanent
INT64 __fastcall PsMakeSiloContextPermanent(_EJOB *Silo, UINT64 ContextSlot){
struct _PSP_STORAGE *Storage;
int StorageArray;
UINT64 v4;
char v5;
UINT64 a3;
__int64 a4;
if( Silo )
Storage = Silo->Storage;
else
Storage = (struct _PSP_STORAGE *)qword_140D23990;
LODWORD(a3) = 0;
a4 = 0i64;
StorageArray = PspGetStorageArray((INT64)Storage, ContextSlot, &a3, &a4);
if( StorageArray >= 0 )
{
v4 = a4 + 16i64 * (unsigned int)a3;
ExAcquirePushLockExclusiveEx(v4, 0i64);
if( (*(_QWORD *)(v4 + 8) & 0xFFFFFFFFFFFFFFFEui64) != 0 )
*(_QWORD *)(v4 + 8) = *(_QWORD *)(v4 + 8) & 0xFFFFFFFFFFFFFFFEui64 | 1;
else
StorageArray = -1073741811;
v5 = _InterlockedExchangeAdd64((volatile signed __int64 *)v4, 0xFFFFFFFFFFFFFFFFui64);
if( (v5 & 2) != 0 && (v5 & 4) == 0 )
ExfTryToWakePushLock((volatile INT64 *)v4);
KeAbPostRelease((PVOID)v4);
}
return(unsigned int)StorageArray;
}Referenced by:
VrpHandleIoctlInitializeJobForVreg