PsUnregisterSiloMonitor
void __fastcall PsUnregisterSiloMonitor(PVOID P){
_ETHREAD *CurrentThread;
PVOID *v3;
_EJOB *i;
_EJOB *NextSilo;
_EJOB *v6;
INT64 v7;
PVOID *v8;
INT64 HostSiloStorage;
int v10;
_KAPC_STATE ApcState;
memset(&ApcState, 0, sizeof(ApcState));
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--*((_WORD *)CurrentThread + 242);
ExAcquirePushLockExclusiveEx((UINT64)&PspSiloMonitorLock, 0i64);
v3 = *(PVOID **)P;
if( *(_OWORD *)P != 0i64 )
{
if( *((_QWORD *)P + 4) )
{
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
for( i = 0i64; ; i = v6 )
{
NextSilo = PspGetNextSilo(i, 1u);
v6 = NextSilo;
if( !NextSilo )
break;
if( (unsigned int)(*(_DWORD *)PspGetServerSiloStatePointer((INT64)NextSilo) - 1) <= 2 )
(*((void(__fastcall **)(_EJOB *))P + 4))(v6);
}
if( *((_BYTE *)P + 16) )
{
v7 = HalSystemVectorDispatchEntry();
(*((void(__fastcall **)(INT64))P + 4))(v7);
}
KiUnstackDetachProcess(&ApcState, 0i64);
v3 = *(PVOID **)P;
}
if( v3[1] != P || (v8 = (PVOID *)*((_QWORD *)P + 1), *v8 != P) )
__fastfail(3u);
*v8 = v3;
v3[1] = v8;
*(_QWORD *)P = 0i64;
*((_QWORD *)P + 1) = 0i64;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&PspSiloMonitorLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&PspSiloMonitorLock);
KeAbPostRelease(&PspSiloMonitorLock);
KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
if( *((_BYTE *)P + 16) )
{
KiStackAttachProcess(PsInitialSystemProcess, 0i64, &ApcState);
HostSiloStorage = PspGetHostSiloStorage();
v10 = PspStorageRemoveObject(HostSiloStorage, *((unsigned int *)P + 5), 1, 0i64);
KiUnstackDetachProcess(&ApcState, 0i64);
if( v10 )
{
if( v10 != -1073741275 )
NT_ASSERT("Status == ((NTSTATUS)0x00000000L) || Status == ((NTSTATUS)0xC0000225L)");
}
}
PspStorageFreeSlot(*((unsigned int *)P + 5));
ExFreePoolWithTag(P, 0x4D6C6953u);
}Referenced by:
No references.