Show / Hide Table of Contents

MSDN.WhiteKnight - Stack Overflow answers

Ответ на "Получить местоположение процесса по его ID"

Answer 774866

Link

Нужно использовать функцию 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.

Back to top Stack Overflow answers (published from sources in GitHub repository). Copyright (c) 2020, MSDN.WhiteKnight. Content licensed under BSD 3-Clause License.
Generated by DocFX