NtTerminateProcess
NTSTATUS __stdcall NtTerminateProcess(VOID *ProcessHandle, NTSTATUS ExitStatus){
_ETHREAD *CurrentThread;
unsigned int v3;
INT64 v5;
INT8 PreviousMode;
NTSTATUS result;
_EPROCESS *v8;
unsigned int UniqueProcessId;
unsigned int v10;
signed __int32 v11;
signed __int32 v12;
UINT64 Tag;
_EPROCESS *Process;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = 0;
Process = 0i64;
v5 = (INT64)CurrentThread->Tcb.ApcState.Process;
PreviousMode = CurrentThread->Tcb.PreviousMode;
if( ProcessHandle )
{
LODWORD(Tag) = 1700033360;
result = ObReferenceObjectByHandleWithTag(
ProcessHandle,
1ui64,
(_OBJECT_TYPE *)PsProcessType,
PreviousMode,
Tag,
(VOID **)&Process,
0i64);
if( result < 0 )
return result;
if( !PreviousMode && (*(_BYTE *)(v5 + 992) & 1) == 0 )
v3 = 1;
v8 = Process;
}
else
{
Process = CurrentThread->Tcb.ApcState.Process;
v8 = (_EPROCESS *)v5;
if( PreviousMode != 1 && (*(_BYTE *)(v5 + 992) & 1) == 0 || (*(_DWORD *)(v5 + 2172) & 1) != 0 )
return -1073741637;
if( (CurrentThread->Tcb.gap0[3] & 0x40) == 0 )
{
PspLockProcessExclusive((_EPROCESS *)v5, CurrentThread);
_m_prefetchw((const void *)(v5 + 1124));
v11 = *(_DWORD *)(v5 + 1124);
do
{
v12 = v11;
v11 = _InterlockedCompareExchange((volatile signed __int32 *)(v5 + 1124), v11 | 0x40000000, v11);
}
while( v12 != v11 );
if( (v11 & 0x40000008) != 0 )
{
PspUnlockProcessExclusive((_EPROCESS *)v5, CurrentThread);
PspTerminateThreadByPointer(CurrentThread, (unsigned int)ExitStatus, 1u);
return 0;
}
CurrentThread->SameThreadPassiveFlags |= 0x40u;
if( *(_DWORD *)(v5 + 2004) == 259 )
*(_DWORD *)(v5 + 2004) = ExitStatus;
PspUnlockProcessExclusiveUnsafe(v5);
v10 = PspTerminateAllThreads(v5, (ULONG_PTR)CurrentThread, (unsigned int)ExitStatus, 0i64);
goto LABEL_17;
}
ObfReferenceObjectWithTag((VOID *)v5, 0x65547350ui64);
}
UniqueProcessId = (unsigned int)v8->UniqueProcessId;
--CurrentThread->Tcb.KernelApcDisable;
v10 = PspTerminateProcess(v8, CurrentThread, (unsigned int)ExitStatus, v3);
ObfDereferenceObjectWithTag(v8, 0x65547350ui64);
if( v8 == (_EPROCESS *)v5 )
{
if( PreviousMode == 1 || (*(_BYTE *)(v5 + 992) & 1) != 0 )
{
_InterlockedOr((volatile signed __int32 *)&CurrentThread->1296, 1u);
KeForceResumeThread(CurrentThread);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
PspExitThread((unsigned int)ExitStatus);
__debugbreak();
}
}
else
{
PspLogAuditTerminateRemoteProcessEvent(UniqueProcessId, v10);
}
LABEL_17:
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
return v10;
}Referenced by:
No references.