PsMakeSiloContextPermanent
NTSTATUS __stdcall PsMakeSiloContextPermanent(_EJOB *Silo, UINT64 ContextSlot){
PSP_STORAGE *v2;
int StorageArray;
_EX_PUSH_LOCK *v4;
char v5;
UINT64 Index;
PSP_STORAGE_SLOT *Array;
if( Silo )
v2 = (PSP_STORAGE *)*((_QWORD *)Silo + 163);
else
v2 = Storage;
LODWORD(Index) = 0;
Array = 0i64;
StorageArray = PspGetStorageArray(v2, ContextSlot, &Index, &Array);
if( StorageArray >= 0 )
{
v4 = (_EX_PUSH_LOCK *)&Array[4 * (unsigned int)Index];
ExAcquirePushLockExclusiveEx(v4, 0i64);
if( (v4[1]._bf_0 & 0xFFFFFFFFFFFFFFFEui64) != 0 )
v4[1]._bf_0 = v4[1]._bf_0 & 0xFFFFFFFFFFFFFFFEui64 | 1;
else
StorageArray = -1073741811;
v5 = _InterlockedExchangeAdd64(&v4->_bf_0, 0xFFFFFFFFFFFFFFFFui64);
if( (v5 & 2) != 0 && (v5 & 4) == 0 )
ExfTryToWakePushLock(v4);
KeAbPostRelease(v4);
}
return StorageArray;
}Referenced by:
VrpHandleIoctlInitializeJobForVreg