Получение полного пути исполняющих процессов в Windows XP

Поэтому мне нужно получить список процессов, запущенных на компьютере, а затем получить полный путь каждого процесса. (Я ищу папку, из которой запускается каждый процесс). Я использовал QueryFullProcessImageName — http://msdn.microsoft.com/en-us/library/windows/desktop/ms684919(v=vs.85).aspx однако я только что узнал, что этот код должен работать в Windows XP и что минимальным клиентом функций является Vista.

Так кто-нибудь знает другой способ сделать это?

Я пытался использовать GetModuleFileNameEx, но это просто не будет работать. Я передал бы дескриптор Процесса, и все, что я возвратил бы в выходных данных, было «ííííííííííííííííííííííííííííííííííííí».

РЕДАКТИРОВАТЬ: Здесь была моя попытка использовать GetModuleFileNameEx:

HANDLE hProcessSnap;
PROCESSENTRY32 pe32;
string name = procName;

// Take a snapshot of all processes in the system.
hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hProcessSnap == INVALID_HANDLE_VALUE)
{
REPORT_ERROR("CreateToolhelp32Snapshot (of processes): err=%d\n", ::GetLastError());
return false;
}

// Set the size of the structure before using it.
pe32.dwSize = sizeof(pe32);

// Retrieve information about the first process,
// and exit if unsuccessful
if( !Process32First(hProcessSnap, &pe32))
{
REPORT_ERROR("Process32First: err=%d\n", ::GetLastError());  // Show cause of failure
CloseHandle(hProcessSnap);     // Must clean up the snapshot object!
return false;
}
char pName[MAX_PATH];

//iterate through all processes
do {
//Find start of files name
char *szProcessFilename = strchr(pe32.szExeFile, '\\');
if (szProcessFilename == NULL)
szProcessFilename = pe32.szExeFile;
else
szProcessFilename++;    //Skip over last slash

if (_stricmp(procName, szProcessFilename) == 0)
{
HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION, false, pe32.th32ProcessID );
char procLocationChar[MAX_PATH];
DWORD exe_path_size = MAX_PATH;
DWORD s = GetModuleFileNameEx(hProcess, NULL, pName, exe_path_size);

Я делаю еще кое-что после этого, чтобы получить путь, но значение pName просто «ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»

0

Решение

Чтобы получить список процессов, которые вы можете использовать EnumProcesses функция от PSAPI. Использование OpenProcess на полученных PID в свою очередь и GetModuleFileNameEx на их дескрипторы, чтобы получить исполняемое имя. Что-то вроде этого:

const size_t maxPids = 1024;

std::set<std::wstring> processes;

DWORD pids[maxPids] = {};
DWORD bytesReturned = 0;

if (::EnumProcesses(pids, sizeof pids, &bytesReturned))
{
DWORD cProcesses = bytesReturned / sizeof *pids;

// set SeDebug privilege

for (DWORD i = 0; i < cProcesses; i++)
{
DWORD pid = pids[i];

if (HANDLE hProcess = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid))
{
WCHAR filename[MAX_PATH] = {};

if (::GetModuleFileNameEx(hProcess, NULL, filename, MAX_PATH))
{
processes.insert(filename);
}
else
{
// handle error
}

::CloseHandle(hProcess);
}
else
{
// handle error
}
}

// disable SeDebug privilege
}
else
{
// handle error
}

Обратите внимание, что есть некоторые процессы, которые нельзя открыть (системные, незанятые и т. Д.). Вы можете сначала отфильтровать их или просто игнорировать ошибки. Также, в зависимости от системной среды, вам могут потребоваться специальные привилегии для открытия процессов, не созданных вами (SeDebugPrivilege), см. Документацию по функции OpenProcess.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]