为什么EnumProcessModules返回FALSE值和299代码错误?

时间:2019-02-26 03:29:26

标签: c++ winapi

我浏览了类似的问题,但没有找到解决问题的方法。

异常类:

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是处理过程的有效值

此代码在64位进程中执行以枚举64位进程中的模块

2 个答案:

答案 0 :(得分:0)

当将以下代码作为64位进程运行时,我可以重现ERROR_PARTIAL_COPY(299)错误。

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位进程。

因此,当使用EnumProcessModulesEx时,似乎需要使用LIST_MODULES_64BIT来枚举64位进程的模块。

或者您可以使用EnumProcessModules:

EnumProcessModules(handle, hModules, sizeof(hModules), &bNeeded);

答案 1 :(得分:-1)

我解决了我的问题: CreateProcess是返回的,无需等待创建过程

我的错是我没有让社区了解程序的真实上下文,而是只提供了与问题无关的一小段代码。谢谢大家的评论,我将尝试提出更详细的问题