【问题标题】:EnumProcessModulesEx fails returning error code 299 (ERROR_PARTIAL_COPY)EnumProcessModulesEx 无法返回错误代码 299 (ERROR_PARTIAL_COPY)
【发布时间】:2011-10-21 04:47:03
【问题描述】:

我正在调用函数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;

【问题讨论】:

    标签: c++ winapi windows-7 64-bit getlasterror


    【解决方案1】:

    那么,GetLastError 返回什么?编辑:我的错,我失败了..

    进行错误检查并确保不是SendMessageEnableTokenPrivilegeOpenProcess 导致您出现错误。

    【讨论】:

      【解决方案2】:

      您很可能正在尝试从 64 位应用程序打开 32 位进程,反之亦然。您只能使用相同类型的进程。

      【讨论】:

        【解决方案3】:

        BOOL ret = EnumProcessModulesEx(h, &module, sizeof module, &cbneeded, LIST_MODULES_ALL);

        第三个参数应该是您在第二个参数中传递的 HMODULES 的 array 的大小。你只通过1,不够大。注意 lpcbNeeded,它告诉你数组需要多大才不会出错。

        【讨论】:

          【解决方案4】:

          如果目标平台是x86,那你可以试试改成x64。

          您可以阅读文档:https://docs.microsoft.com/en-us/windows/win32/api/psapi/nf-psapi-enumprocessmodules

          如果这个函数是从运行在 WOW64 上的 32 位应用程序调用的,它只能枚举 32 位进程的模块。如果进程是 64 位进程,则此函数失败,最后一个错误代码为 ERROR_PARTIAL_COPY (299)。

          【讨论】:

            猜你喜欢
            • 2011-04-17
            • 1970-01-01
            • 2021-01-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-04
            相关资源
            最近更新 更多