windows-nt/Source/XPSP1/NT/sdktools/debuggers/rtlist/rtlist.cpp

171 lines
3.7 KiB
C++
Raw Normal View History

2020-09-26 03:20:57 -05:00
//----------------------------------------------------------------------------
//
// Simple process list through the debug engine interface
// process enumeration methods.
//
// Copyright (C) Microsoft Corporation, 2000.
//
//----------------------------------------------------------------------------
#include <stdio.h>
#include <dbgeng.h>
PDEBUG_CLIENT g_Client;
PSTR g_ProcName;
void DECLSPEC_NORETURN
Panic(HRESULT Status, char* Format, ...)
{
va_list Args;
fprintf(stderr, "Error 0x%08X: ", Status);
va_start(Args, Format);
vfprintf(stderr, Format, Args);
va_end(Args);
exit(1);
}
void DECLSPEC_NORETURN
UsageExit(void)
{
printf("Usage: rtlist <Options>\n");
printf("Options are:\n");
printf(" -premote <Options> - Connect to process server\n");
printf(" -pn <Name> - Look for process name\n");
exit(2);
}
#define MAX_IDS 16384
void
List(ULONG64 Server)
{
HRESULT Status;
ULONG Ids[MAX_IDS];
ULONG IdCount;
ULONG i;
if (g_ProcName != NULL)
{
if ((Status = g_Client->
GetRunningProcessSystemIdByExecutableName
(Server, g_ProcName, DEBUG_GET_PROC_ONLY_MATCH, &Ids[0])) != S_OK)
{
Panic(Status, "GetRunningProcessSystemIdByExecutableName\n");
}
IdCount = 1;
}
else
{
if ((Status = g_Client->
GetRunningProcessSystemIds(Server, Ids, MAX_IDS,
&IdCount)) != S_OK)
{
Panic(Status, "GetRunningProcessSystemIds\n");
}
if (IdCount > MAX_IDS)
{
fprintf(stderr, "Process list missing %d processes\n",
IdCount - MAX_IDS);
IdCount = MAX_IDS;
}
}
for (i = 0; i < IdCount; i++)
{
char ExeName[MAX_PATH];
if ((Status = g_Client->
GetRunningProcessDescription(Server, Ids[i],
DEBUG_PROC_DESC_DEFAULT,
ExeName, sizeof(ExeName), NULL,
NULL, 0, NULL)) != S_OK)
{
sprintf(ExeName, "Error 0x%08X", Status);
}
if (Ids[i] >= 0x80000000)
{
printf("0x%x %s\n", Ids[i], ExeName);
}
else
{
printf("0n%d %s\n", Ids[i], ExeName);
}
}
}
void __cdecl
main(int Argc, char** Argv)
{
HRESULT Status;
if ((Status = DebugCreate(__uuidof(IDebugClient),
(void**)&g_Client)) != S_OK)
{
Panic(Status, "DebugCreate\n");
}
BOOL Usage = FALSE;
ULONG64 Server = 0;
while (--Argc > 0)
{
Argv++;
if (!strcmp(*Argv, "-premote"))
{
if (Argc < 2 || Server != 0)
{
Usage = TRUE;
}
else
{
Argc--;
Argv++;
if ((Status = g_Client->
ConnectProcessServer(*Argv, &Server)) != S_OK)
{
Panic(Status, "ConnectProcessServer\n");
}
}
}
else if (!strcmp(*Argv, "-pn"))
{
if (Argc < 2)
{
Usage = 2;
}
else
{
Argc--;
Argv++;
g_ProcName = *Argv;
}
}
else
{
Usage = TRUE;
break;
}
}
if (Usage)
{
UsageExit();
}
List(Server);
if (Server != 0)
{
g_Client->DisconnectProcessServer(Server);
}
g_Client->Release();
}