PsTerminateMinimalProcess
NTSTATUS __stdcall PsTerminateMinimalProcess(ULONG_PTR BugCheckParameter1){
int v1;
_ETHREAD *CurrentThread;
int v3;
_EPROCESS *v4;
unsigned int v5;
_EX_PUSH_LOCK *v6;
signed __int32 v7;
NTSTATUS result;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = v1;
v4 = *(_EPROCESS **)&BugCheckParameter1;
v5 = 8;
--CurrentThread->Tcb.KernelApcDisable;
v6 = (_EX_PUSH_LOCK *)(*(_QWORD *)&BugCheckParameter1 + 1080i64);
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)(*(_QWORD *)&BugCheckParameter1 + 1080i64), 0i64);
if( !v4->ActiveThreads )
{
v5 = 33554440;
if( v4->ExitStatus == 259 )
v4->ExitStatus = v3;
}
_m_prefetchw(&v4->1124);
v7 = _InterlockedOr((volatile signed __int32 *)&v4->1124, v5);
if( (_InterlockedExchangeAdd64(&v6->_bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v6);
KeAbPostRelease(v6);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
LOBYTE(result) = (v5 & 0x2000000) != 0;
if( (((v7 & 0x2000000) == 0) & (unsigned __int8)result) != 0 )
LOBYTE(result) = PspRundownSingleProcess(v4, 1u);
return result;
}Referenced by:
PspTeardownPartition
VmTerminateMemoryProcess