MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Получить местоположение процесса по его ID"
Answer 774866
Нужно использовать функцию QueryFullProcessImageName. Она позволяет получить расположение файла для всех процессов, в том числе системных или другого пользователя (при наличии привилегий администратора), а также 64-разрядных процессов из 32-разрядного приложения.
#include <stdlib.h> #include <locale.h> #include <stdio.h> #include <tchar.h> #include <windows.h> #include <tlhelp32.h> #include <psapi.h> void ErrorMes(LPTSTR lpszFunction) { // Retrieve the system error message for the last-error code LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); // Display the error message lpDisplayBuf = (LPVOID)LocalAlloc(LMEM_ZEROINIT, (lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) * sizeof(TCHAR)); wprintf(L"%s failed with error %d: %s", lpszFunction, dw, lpMsgBuf); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); } int main() { HANDLE hProcess=NULL; HANDLE hToken; HANDLE snapshot; TCHAR filename[MAX_PATH]; DWORD charsCarried = MAX_PATH; PROCESSENTRY32 process; int count = 0; setlocale(LC_ALL,"Russian"); snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); process.dwSize = sizeof(PROCESSENTRY32); if (snapshot != INVALID_HANDLE_VALUE) { if (Process32First(snapshot, &process)) { do { wprintf(L"PID: %d, Name: %s, CountThreads: %d\n", process.th32ProcessID, process.szExeFile, process.cntThreads); /*get process handle*/ hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, process.th32ProcessID); if(hProcess==NULL){ ErrorMes(L"OpenProcess"); wprintf(L"\n"); continue; } charsCarried=MAX_PATH; /* get executable name*/ if(QueryFullProcessImageName(hProcess,0,filename,&charsCarried)!=FALSE) { wprintf(L"%s\n", filename); } else { ErrorMes(L"QueryFullProcessImageName"); wprintf(L"\n"); } wprintf(L"\n"); CloseHandle(hProcess); hProcess = NULL; } while (Process32Next(snapshot, &process)); } } else { ErrorMes(L"CreateToolhelp32Snapshot"); } if(hProcess!=NULL)CloseHandle(hProcess); CloseHandle(snapshot); system("PAUSE"); return 0; }
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.