Code:
#include <stdio.h>
#include <dbgeng.h>
IDebugClient2* g_Client2 = NULL;
IDebugControl* g_Control = NULL;
HRESULT Status = NULL;
void Exit(int Code, PCSTR Format, ...)
{
if (g_Control != NULL)
{
g_Control->Release();
g_Control = NULL;
}
if (g_Client2 != NULL)
{
g_Client2->EndSession(DEBUG_END_PASSIVE);
g_Client2->Release();
g_Client2 = NULL;
}
if (Format != NULL)
{
va_list Args;
va_start(Args, Format);
vfprintf(stderr, Format, Args);
va_end(Args);
}
exit(Code);
};
class StdioOutputCallbacks : public IDebugOutputCallbacks
{
public:
STDMETHOD(QueryInterface)( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface );
STDMETHOD_(ULONG, AddRef)( THIS );
STDMETHOD_(ULONG, Release)(THIS );
STDMETHOD(Output)( THIS_ IN ULONG Mask, IN PCSTR Text );
};
STDMETHODIMP StdioOutputCallbacks::QueryInterface( THIS_ IN REFIID InterfaceId, OUT PVOID* Interface )
{
*Interface = NULL;
if (IsEqualIID(InterfaceId, __uuidof(IUnknown)) ||
IsEqualIID(InterfaceId, __uuidof(IDebugOutputCallbacks)))
{
*Interface = (IDebugOutputCallbacks *)this;
AddRef();
return S_OK;
}
else
{
return E_NOINTERFACE;
}
}
STDMETHODIMP_(ULONG) StdioOutputCallbacks::AddRef( THIS )
{
return 1;
}
STDMETHODIMP_(ULONG) StdioOutputCallbacks::Release( THIS )
{
return 0;
}
STDMETHODIMP StdioOutputCallbacks::Output( THIS_ IN ULONG Mask, IN PCSTR Text )
{
UNREFERENCED_PARAMETER(Mask);
fputs(Text, stdout);
return S_OK;
}
StdioOutputCallbacks g_OutputCb;
void CreateInterfaces (void)
{
if ((Status = DebugCreate(__uuidof(IDebugClient), (void**)&g_Client2)) != S_OK)
{
Exit(1, "DebugCreate failed, 0x%X\n", Status);
}
if ((Status = g_Client2->QueryInterface(__uuidof(IDebugControl), (void**)&g_Control)) != S_OK )
{
Exit(1, "g_Client2->QueryInterface(__uuidof(IDebugControl) failed, 0x%X\n", Status);
}
return ;
}
void __cdecl main(int Argc, char* Argv[])
{
ULONG Ids[0x100];
char Exename[0x100];
ULONG ActualCount = 0;
ULONG64 Handle = 0;
BOOL IsAttached =FALSE;
memset(&Ids,0,sizeof(Ids));
memset(&Exename,0,sizeof(Exename));
CreateInterfaces();
if ((Status = g_Client2->GetRunningProcessSystemIds(NULL,
Ids,_countof(Ids),&ActualCount) ) != S_OK)
{
Exit(1,"g_Client2->GetRunningProcessSystemIds failed, 0x%X\n", Status);
}
printf ("No of Running Process is 0n%d\n\nSRNo\tPID\tProcessName\n\n", ActualCount);
for (ULONG i = 0; i < ActualCount;i++)
{
if (( g_Client2->GetRunningProcessDescription(
NULL, Ids[i],
DEBUG_PROC_DESC_NO_PATHS | DEBUG_PROC_DESC_NO_SERVICES |
DEBUG_PROC_DESC_NO_MTS_PACKAGES | DEBUG_PROC_DESC_NO_COMMAND_LINE,
Exename, sizeof(Exename),NULL,NULL,NULL,NULL ) ) != S_OK)
{
Exit(1,"g_Client2->GetRunningProcessDescription Failed, 0x%X\n", Status);
}
printf("%02d\t0n%04d\t%s\n",i+1,Ids[i],Exename);
if( Ids[i] == 0)
{
continue;
}
if (IsAttached == TRUE)
{
if ((Status = g_Client2->SetOutputCallbacks (&g_OutputCb)) != S_OK)
{
Exit(1,"g_Client2->SetOutputCallbacks failed, 0x%X\n", Status);
}
char *HandArg = (char *) malloc(0x40);
sprintf_s(HandArg,0x40,"%d %d %X",0,3,Ids[i]);
if (( Status = g_Control->CallExtension(Handle,"handle",HandArg)) != S_OK)
{
Exit(1,"g_Control->CallExtension failed,0x%X\n",Status);
}
free(HandArg);
if ((Status = g_Client2->SetOutputCallbacks (0)) != S_OK)
{
Exit(1,"g_Client2->SetOutputCallbacks failed, 0x%X\n", Status);
}
continue;
}
if (( Status = g_Client2->AttachKernel(DEBUG_ATTACH_LOCAL_KERNEL,NULL )) != S_OK)
{
Exit(1,"g_Client2->AttachKernel Failed, 0x%X\n", Status);
}
if (( Status = g_Control->WaitForEvent(DEBUG_WAIT_DEFAULT, INFINITE))!=S_OK)
{
Exit(1,"g_Control->WaitForEvent Failed, 0x%X\n", Status);
}
if (( Status = g_Control->AddExtension("kdexts.dll",0,&Handle)) != S_OK)
{
Exit(1,"g_Control->AddExtension failed,0x%X\n",Status);
}
if ((Status = g_Client2->SetOutputCallbacks (&g_OutputCb)) != S_OK)
{
Exit(1,"g_Client2->SetOutputCallbacks failed, 0x%X\n", Status);
}
char *HandArg = (char *) malloc(0x40);
sprintf_s(HandArg,0x40,"%d %d %x",0,3,Ids[i]);
if (( Status = g_Control->CallExtension(Handle,"handle",HandArg)) != S_OK)
{
Exit(1,"g_Control->CallExtension failed,0x%X\n",Status);
}
free(HandArg);
if ((Status = g_Client2->SetOutputCallbacks (0)) != S_OK)
{
Exit(1,"g_Client2->SetOutputCallbacks failed, 0x%X\n", Status);
}
IsAttached = TRUE;
}
Exit(0, "Finished Debugging Quitting\n");
}