DbgkpSetProcessDebugObject
INT64 DbgkpSetProcessDebugObject(_EPROCESS *Process, KEVENT *Event, INT64 a3, ...){
_ETHREAD *CurrentThread;
int v4;
EX_RUNDOWN_REF *v7;
EX_RUNDOWN_REF *NextProcessThread;
KEVENT *Flink;
__int64 v10;
int v11;
__int64 v12;
__int64 v13;
_QWORD *v14;
KEVENT **v15;
_QWORD *v16;
int v17;
OBJECT_ATTRIBUTES *v18;
UINT64 v19;
PVOID *v20;
__int64 v21;
PVOID Object;
_ETHREAD *v24;
PKGUARDED_MUTEX Mutex;
PVOID P;
PVOID *p_P;
char v28;
char v29;
EX_RUNDOWN_REF *v30;
va_list va1;
va_list va;
va_start(va1, a3);
va_start(va, a3);
v30 = va_arg(va1, EX_RUNDOWN_REF *);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
Object = 0i64;
p_P = &P;
P = &P;
v4 = a3;
v24 = CurrentThread;
v28 = 1;
v29 = 0;
if( (int)a3 >= 0 )
{
v7 = v30;
v4 = 0;
}
else
{
v7 = 0i64;
v30 = 0i64;
}
if( v4 >= 0 )
{
ExAcquireFastMutex(&DbgkpProcessDebugPortMutex);
while( 1 )
{
if( *((_QWORD *)Process + 175) )
{
v4 = -1073741752;
v29 = 1;
goto LABEL_11;
}
*((_QWORD *)Process + 175) = Event;
ObfReferenceObjectWithTag(v7, 0x4F676244u);
v29 = 1;
NextProcessThread = (EX_RUNDOWN_REF *)PsGetNextProcessThread((__int64)Process, v7);
if( !NextProcessThread )
goto LABEL_11;
*((_QWORD *)Process + 175) = 0i64;
KeReleaseGuardedMutex(&DbgkpProcessDebugPortMutex);
v29 = 0;
ObfDereferenceObjectWithTag(v7, 0x4F676244ui64);
v4 = DbgkpPostFakeThreadMessages(
(INT64)Process,
Event,
NextProcessThread,
(EX_RUNDOWN_REF **)&Object,
(EX_RUNDOWN_REF **)va);
if( v4 < 0 )
break;
ObfDereferenceObjectWithTag(Object, 0x4F676244ui64);
ExAcquireFastMutex(&DbgkpProcessDebugPortMutex);
v7 = v30;
}
v7 = 0i64;
v30 = 0i64;
}
LABEL_11:
Mutex = (PKGUARDED_MUTEX)&Event[1];
ExAcquireFastMutex((FAST_MUTEX *)&Event[1]);
if( v4 >= 0 )
{
if( (Event[4].Header.LockNV & 1) != 0 )
{
*((_QWORD *)Process + 175) = 0i64;
v4 = -1073740972;
}
else
{
_InterlockedOr((volatile signed __int32 *)Process + 281, 3u);
ObfReferenceObject(Event);
v7 = v30;
}
}
Flink = (KEVENT *)Event[3].Header.WaitListHead.Flink;
if( Flink == (KEVENT *)&Event[3].Header.WaitListHead )
goto LABEL_37;
do
{
v10 = (__int64)Flink;
Flink = *(KEVENT **)&Flink->Header.Lock;
v11 = *(_DWORD *)(v10 + 76);
if( (v11 & 4) == 0 || *(_ETHREAD **)(v10 + 80) != CurrentThread )
continue;
v12 = *(_QWORD *)(v10 + 64);
if( v4 < 0 )
{
if( Flink->Header.WaitListHead.Flink != (_LIST_ENTRY *)v10
|| (v15 = *(KEVENT ***)(v10 + 8), *v15 != (KEVENT *)v10) )
{
LABEL_45:
__fastfail(3u);
}
*v15 = Flink;
Flink->Header.WaitListHead.Flink = (_LIST_ENTRY *)v15;
goto LABEL_30;
}
if( (v11 & 0x10) != 0 )
{
_InterlockedOr((volatile signed __int32 *)(v12 + 1296), 0x80u);
v13 = *(_QWORD *)v10;
if( *(_QWORD *)(*(_QWORD *)v10 + 8i64) != v10 )
goto LABEL_45;
v14 = *(_QWORD **)(v10 + 8);
if( *v14 != v10 )
goto LABEL_45;
*v14 = v13;
*(_QWORD *)(v13 + 8) = v14;
LABEL_30:
v16 = p_P;
if( *p_P != &P )
goto LABEL_45;
*(_QWORD *)v10 = &P;
*(_QWORD *)(v10 + 8) = v16;
*v16 = v10;
p_P = (PVOID *)v10;
goto LABEL_32;
}
if( v28 )
{
*(_DWORD *)(v10 + 76) = v11 & 0xFFFFFFFB;
KeSetEvent(Event, 0);
v28 = 0;
}
*(_QWORD *)(v10 + 80) = 0i64;
_InterlockedOr((volatile signed __int32 *)(v12 + 1296), 0x40u);
LABEL_32:
v17 = *(_DWORD *)(v10 + 76);
if( (v17 & 8) != 0 )
{
*(_DWORD *)(v10 + 76) = v17 & 0xFFFFFFF7;
ExReleaseRundownProtection((PEX_RUNDOWN_REF)(v12 + 1272));
}
CurrentThread = v24;
}
while( Flink != (KEVENT *)&Event[3].Header.WaitListHead );
v7 = v30;
LABEL_37:
KeReleaseGuardedMutex(Mutex);
if( v29 )
KeReleaseGuardedMutex(&DbgkpProcessDebugPortMutex);
if( v7 )
ObfDereferenceObjectWithTag(v7, 0x4F676244ui64);
while( 1 )
{
v20 = (PVOID *)P;
if( P == &P )
break;
if( *((PVOID **)P + 1) != &P )
goto LABEL_45;
v21 = *(_QWORD *)P;
if( *(PVOID *)(*(_QWORD *)P + 8i64) != P )
goto LABEL_45;
P = *(PVOID *)P;
*(_QWORD *)(v21 + 8) = &P;
DbgkpWakeTarget(v20, (UINT64)&P, v18, v19);
}
if( v4 >= 0 )
DbgkpMarkProcessPeb((PEPROCESS)Process);
return(unsigned int)v4;
}Referenced by:
NtDebugActiveProcess