Windows Enum Обрабатывает некоторые имена процессов как <unknown> - PullRequest
0 голосов
/ 17 февраля 2019

Здравствуйте, у меня есть этот пример кода, который использует x для печати processNames и PIDS всех запущенных в данный момент процессов.Только некоторые из них отображают действительное имя, а другие отображают как (как видно из моего выходного изображения ниже)

enter image description here

Мне было интересно, было ли этоожидаемое поведение, и что не все процессы имеют имя (я мог видеть, что это имеет место в случае минимальных фоновых процессов), или если я использовал функцию EnumProcesses неправильно.

Мой код:

#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <psapi.h>
#include <tlhelp32.h>
#include <tchar.h>


//https://docs.microsoft.com/en-us/windows/desktop/psapi/enumerating-all-processes
void PrintProcessNameAndID( DWORD processID ){
    TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>");
    // Get a handle to the process.
    HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
    // Get the process name.
    if (NULL != hProcess ){
        HMODULE hMod;
        DWORD cbNeeded;
        if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ){
            GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
        }
    }
    // Print the process name and identifier.
    _tprintf( TEXT("%s  (PID: %u)\n"), szProcessName, processID );
    // Release the handle to the process.
    CloseHandle( hProcess );
}

//https://docs.microsoft.com/en-us/windows/desktop/psapi/enumerating-all-processes
int main( void ){
    // Get the list of process identifiers.
    DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i;
    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ){
        return 1;
    }
    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);
    // Print the name and process identifier for each process.
    //for ( i = 0; i < cProcesses; i++ ){
    for ( i = 0; i < 3; i++ ){
        if( aProcesses[i] != 0 )        {
            _tprintf( TEXT("aProcesses[%u] = %u (process ID)\n"), i, aProcesses[i] );
            PrintProcessNameAndID( aProcesses[i] );
            ListProcessThreads( aProcesses[i] );
        }
    }
    return 0;
}

1 Ответ

0 голосов
/ 17 февраля 2019

Как указано в документации , OpenProcess завершается ошибкой для процессов в режиме ожидания и CSRSS.

Если указанный процесс является процессом Idle или одним из процессов CSRSS, эта функция завершается ошибкой, а последний код ошибки равен ERROR_ACCESS_DENIED, поскольку их ограничения доступа не позволяют открывать код уровня пользователя.

Вы должны включить SeDebugPrivilege (а также запустить приложение с правами администратора).Более того, если ваше приложение скомпилировано как 32-битное, оно не может получить доступ к 64-битным процессам с помощью OpenProcess

Если вы просто хотите получить список запущенных процессов, используйте CreateToolhelp32Snapshot для просмотра списка запущенных процессов.

#define UNICODE
#include <Windows.h>
#include <stdio.h>
#include <psapi.h>
#include <tlhelp32.h>

int main()
{
    wprintf(L"Start:\n");
    HANDLE hndl = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS | TH32CS_SNAPMODULE, 0);
    if(hndl)
    {
        PROCESSENTRY32  process = { sizeof(PROCESSENTRY32) };
        Process32First(hndl, &process);
        do
        {
            wprintf(L"%8u, %s\n", process.th32ProcessID, process.szExeFile);
        } while(Process32Next(hndl, &process));

        CloseHandle(hndl);
    }
}

Примечание: рекомендуется компилировать программу в формате Unicode.Избегайте _txxx макросов, таких как _tprintf и т. Д.

...