DbgkpPostFakeThreadMessages
NTSTATUS __stdcall DbgkpPostFakeThreadMessages(
_EPROCESS *Process,
_KEVENT *DebugObject,
_EX_RUNDOWN_REF *StartThread,
_EX_RUNDOWN_REF **pFirstThread,
_EX_RUNDOWN_REF **pLastThread){
_ETHREAD *NextProcessThread;
_EX_RUNDOWN_REF *v8;
_EX_RUNDOWN_REF *v9;
NTSTATUS v10;
bool v11;
char v12;
char v13;
void *SectionObject;
__int64 v15;
int v16;
bool v18;
_ETHREAD *CurrentThread;
_DBGKM_APIMSG DbgMsg[68];
_KAPC_STATE ApcState;
NextProcessThread = (_ETHREAD *)StartThread;
memset(&ApcState, 0, sizeof(ApcState));
memset(DbgMsg, 0i64, sizeof(DbgMsg));
v8 = 0i64;
v9 = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v10 = -1073741823;
if( NextProcessThread )
{
v8 = (_EX_RUNDOWN_REF *)NextProcessThread;
ObfReferenceObjectWithTag(NextProcessThread, 0x4F676244ui64);
}
else
{
NextProcessThread = (_ETHREAD *)PsGetNextProcessThread(Process, 0i64);
}
v11 = StartThread == 0i64;
v18 = StartThread == 0i64;
while( NextProcessThread )
{
if( v9 )
ObfDereferenceObjectWithTag(v9, 0x4F676244ui64);
v9 = (_EX_RUNDOWN_REF *)NextProcessThread;
ObfReferenceObjectWithTag(NextProcessThread, 0x4F676244ui64);
if( (NextProcessThread->Tcb._bf_0 & 0x400) == 0 )
{
if( (NextProcessThread->CrossThreadFlags & 2) != 0
|| (PsSynchronizeWithThreadInsertion(NextProcessThread, CurrentThread),
(NextProcessThread->CrossThreadFlags & 2) != 0) )
{
if( ExAcquireRundownProtection(&NextProcessThread->RundownProtect) )
{
v12 = 10;
if( PsSuspendThread(NextProcessThread, 0i64) >= 0 )
v12 = 42;
}
else
{
v12 = 18;
}
memset(DbgMsg, 0i64, sizeof(DbgMsg));
if( !v11 || (v12 & 0x10) != 0 )
{
v13 = 0;
DbgMsg[10] = 1;
*(_QWORD *)&DbgMsg[14] = NextProcessThread->Win32StartAddress;
}
else
{
v13 = 1;
DbgMsg[10] = 2;
SectionObject = Process->SectionObject;
if( SectionObject )
*(_QWORD *)&DbgMsg[14] = DbgkpSectionToFileHandle(SectionObject);
else
*(_QWORD *)&DbgMsg[14] = 0i64;
*(_QWORD *)&DbgMsg[16] = Process->SectionBaseAddress;
KeStackAttachProcess(&Process->Pcb, &ApcState);
LODWORD(v15) = RtlImageNtHeader((UINT64)Process->SectionBaseAddress);
if( v15 )
{
*(_QWORD *)&DbgMsg[22] = 0i64;
DbgMsg[18] = *(_DWORD *)(v15 + 12);
DbgMsg[19] = *(_DWORD *)(v15 + 16);
}
KeUnstackDetachProcess(&ApcState);
}
DbgkpQueueMessage(Process, NextProcessThread);
v10 = v16;
if( v16 < 0 )
{
if( (v12 & 0x20) != 0 )
PsResumeThread(NextProcessThread, 0i64);
if( (v12 & 8) != 0 )
ExReleaseRundownProtection(&NextProcessThread->RundownProtect);
if( DbgMsg[10] == 2 && *(_QWORD *)&DbgMsg[14] )
ObCloseHandle(*(VOID **)&DbgMsg[14], 0);
PsQuitNextProcessThread(NextProcessThread);
break;
}
if( v13 )
{
v11 = 0;
v18 = 0;
ObfReferenceObjectWithTag(NextProcessThread, 0x4F676244ui64);
v8 = (_EX_RUNDOWN_REF *)NextProcessThread;
DbgkSendSystemDllMessages(NextProcessThread, DebugObject, DbgMsg);
}
else
{
v11 = v18;
}
}
}
NextProcessThread = (_ETHREAD *)PsGetNextProcessThread(Process, NextProcessThread);
}
if( v10 >= 0 )
{
if( v8 )
{
*pFirstThread = v8;
*pLastThread = v9;
}
else
{
if( v9 )
ObfDereferenceObjectWithTag(v9, 0x4F676244ui64);
return -1073741823;
}
}
else
{
if( v8 )
ObfDereferenceObjectWithTag(v8, 0x4F676244ui64);
if( v9 )
ObfDereferenceObjectWithTag(v9, 0x4F676244ui64);
}
return v10;
}Referenced by:
DbgkpPostFakeProcessCreateMessages
DbgkpSetProcessDebugObject