Почему EnumProcessModules возвращает значение FALSE и код ошибки 299? - PullRequest
0 голосов
/ 26 февраля 2019

Я просматривал похожие вопросы, но не нашел решения своей проблемы.

Класс исключения:

class Exception{
    public:
        Exception(LPCWSTR text){
            QMessageBox::information(0, "Catch",
                                     QString::fromWCharArray(text) + ", Code: " +
                                     QString::number(GetLastError())); 
                     //EnumModules is return FALSE in function getHinstance, Code: 299
        }
}

И основной код:

    HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, TRUE, 7068); //PID of opened calculator
    if(handle == INVALID_HANDLE_VALUE)
        throw Exception(L"invalid handle in function getHinstance");

    int hNeeded = 1024;
    HINSTANCE hModules[hNeeded];
    DWORD bNeeded = 0;
    PWSTR fileName = new WCHAR[512];
    if(!EnumProcessModulesEx(handle, hModules, sizeof(hModules), &bNeeded, LIST_MODULES_ALL))
        throw Exception(L"EnumModules is return FALSE in function getHinstance");

    for(int i = 0; i < bNeeded / sizeof(HINSTANCE); ++i){
        GetModuleBaseNameW(handle, hModules[i], fileName, sizeof(WCHAR) * 512);
        if(lstrcmpW(fileName, moduleName) == 0){
            delete [] fileName;
            return hModules[i];
        }
    }

handle является допустимым значением процесса handle

Этот код выполняется в 64-битном процессе для перечисления модулей в 64-битном процессе

Ответы [ 2 ]

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

Я могу воспроизвести ошибку ERROR_PARTIAL_COPY (299) при выполнении следующего кода как 64-битный процесс.

HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 17152); //PID of opened notepad.exe
DWORD errCode = GetLastError();

HMODULE hModules[100];
DWORD bNeeded = 0;
EnumProcessModulesEx(handle, hModules, sizeof(hModules), &bNeeded, LIST_MODULES_ALL);
errCode = GetLastError();

И устранить ошибку при использовании LIST_MODULES_64BIT вместо LIST_MODULES_ALL.

Мой notepad.exe - это 64-битный процесс.

Так что, похоже, вам нужно использовать LIST_MODULES_64BIT для перечисления модулей 64-битного процесса при использовании EnumProcessModulesEx.

Или вы можетеиспользовать EnumProcessModules:

EnumProcessModules(handle, hModules, sizeof(hModules), &bNeeded);
0 голосов
/ 27 февраля 2019

Я решаю свою проблему: CreateProcess возвращается, не дожидаясь процесса создания

Моя вина в том, что я не дал сообществу понять реальный контекст программы, а предоставил только небольшой фрагмент кода, которыйне было связано с проблемой.Спасибо всем за комментарии, постараюсь задать более подробные вопросы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...