EnumProcessModulesEx не удается вернуть код ошибки 299 (ERROR_PARTIAL_COPY)
Я вызываю функцию EnumProcessModulesEx
и это не удается. Я работаю на 64-битной машине. Вот код ниже:
wchar_t* dest = new wchar_t[100];
int index = SendMessage(processes, LB_GETCURSEL, 0, 0);
SendMessage(processes, LB_GETTEXT, index, (LPARAM)dest);
HMODULE module;
unsigned long cbneeded;
EnableTokenPrivilege(hWnd, SE_DEBUG_NAME);
HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, _wtoi(dest));
int errorcode = GetLastError();
BOOL ret = EnumProcessModulesEx(h, &module, sizeof module, &cbneeded, LIST_MODULES_ALL);
int err = GetLastError();
wchar_t* name = new wchar_t[MAX_PATH];
GetModuleBaseName(h, module, name, sizeof name);
MessageBox(hWnd, name, L"Process Name", 0);
delete dest;
delete name;
3 ответа
BOOL ret = EnumProcessModulesEx(h, &module, sizeof module, &cbneeded, LIST_MODULES_ALL);
Предполагается, что третьим аргументом будет размер массива HMODULES, который вы передаете во втором аргументе. Вы только проходите 1, не достаточно большой. Обратите внимание на lpcbNeeded, он говорит вам, насколько большим должен быть массив, чтобы не получить ошибку.
Скорее всего, вы пытаетесь открыть 32-битный процесс из 64-битного приложения или наоборот. Вы можете работать только с процессами одного типа.
Если целевая платформа - x86, вы можете попробовать изменить ее на x64.
Вы можете прочитать документ: https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocessmodules
Если эта функция вызывается из 32-битного приложения, работающего на WOW64, она может только перечислять модули 32-битного процесса. Если процесс является 64-битным, эта функция не работает, и последний код ошибки - ERROR_PARTIAL_COPY (299).
Ну что же GetLastError
вернуть? РЕДАКТИРОВАТЬ: мой плохой, я не смог сильно..
Проверьте ошибки и убедитесь, что это не так SendMessage
, EnableTokenPrivilege
, или же OpenProcess
это дает вам ошибку.