DbgkSendSystemDllMessages
VOID __fastcall DbgkSendSystemDllMessages(PVOID a1, _KEVENT *a2, _DWORD *a3){
_ETHREAD *v4;
INT64 v5;
_DWORD *v6;
int i;
INT64 *SystemDllInfo;
INT64 *v9;
void *v10;
IMAGE_NT_HEADERS *v11;
_ETHREAD *CurrentThread;
int v13;
char v14;
__int64 v15;
INT64 *v17;
_KAPC_STATE ApcState;
v4 = (_ETHREAD *)a1;
memset(&ApcState, 0, sizeof(ApcState));
if( a1 )
v5 = *((_QWORD *)a1 + 68);
else
v5 = *((_QWORD *)KeGetCurrentThread() + 23);
v6 = a3 + 12;
for( i = 0; i < 6; ++i )
{
SystemDllInfo = PsQuerySystemDllInfo(i);
v9 = SystemDllInfo;
v17 = SystemDllInfo;
if( SystemDllInfo
&& (i <= 0
|| *((_WORD *)SystemDllInfo + 1) && *(_QWORD *)(v5 + 1408) && i == (unsigned int)PsWow64GetProcessNtdllType(v5)) )
{
*(_OWORD *)v6 = 0i64;
*((_OWORD *)v6 + 1) = 0i64;
v15 = 0i64;
v10 = (void *)v9[3];
*((_QWORD *)v6 + 1) = v10;
if( v4 && i )
{
v14 = 1;
KiStackAttachProcess((_KPROCESS *)v5, 0i64, &ApcState);
}
else
{
v14 = 0;
}
v11 = RtlImageNtHeader(v10);
if( v11 )
{
v6[4] = v11->FileHeader.PointerToSymbolTable;
v6[5] = v11->FileHeader.NumberOfSymbols;
}
if( !v4 )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
if( (*((_DWORD *)CurrentThread + 29) & 0x400) != 0 || *((_BYTE *)CurrentThread + 586) == 1 )
v15 = 0i64;
else
v15 = *((_QWORD *)CurrentThread + 30);
if( v15 )
{
RtlStringCbCopyW((PWCHAR)(v15 + 4712), 0x20Aui64, (PWCHAR)v17[5]);
*(_QWORD *)(v15 + 40) = v15 + 4712;
*((_QWORD *)v6 + 3) = v15 + 40;
v4 = (_ETHREAD *)a1;
}
}
if( v14 )
KiUnstackDetachProcess(&ApcState, 0i64);
if( ZwOpenFile((UNICODE_STRING *)v6, (PWCHAR)0x80100000i64) < 0 )
*(_QWORD *)v6 = 0i64;
*a3 = 5242920;
a3[1] = 8;
a3[10] = 5;
if( v4 )
{
DbgkpQueueMessage((_EPROCESS *)v5, v4);
if( v13 < 0 && *(_QWORD *)v6 )
ObCloseHandle(*(PVOID *)v6, 0);
}
else
{
DbgkpSendApiMessage((PVOID)v5, 3, (__int64)a3);
if( *(_QWORD *)v6 )
ObCloseHandle(*(PVOID *)v6, 0);
if( v15 )
*(_QWORD *)(v15 + 40) = 0i64;
}
}
}
}Referenced by:
DbgkCreateThread
DbgkpPostFakeThreadMessages