节点加载项无法快照(CreateToolhelp32Snapshot)模块

Node addon unable to snapshot (CreateToolhelp32Snapshot) modules

本文关键字:CreateToolhelp32Snapshot 模块 快照 加载项 节点      更新时间:2023-10-16

我正在尝试学习C++,但不太明白为什么当我尝试通过Node插件快照模块时,当我在桌面上通过VS运行程序时,会返回不同的结果。

使用MSDN中的这个来源,我可以列出一个进程中的所有模块:

void fm(LPSTR name) {
    HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 5844);
    MODULEENTRY32 mEntry;
    // check invalid handle value...
    // check module32first...
    mEntry.dwSize = sizeof(mEntry);
    do {
        if (!strcmp(mEntry.szModule, name)) {
            CloseHandle(hModuleSnapshot);
            cout << mEntry.szModule << endl;
        }
    } while (Module32Next(hModuleSnapshot, &mEntry));
}

这按预期工作,并将查找/打印模块信息(省略错误检查)-然而,当我尝试将此功能移植到Node插件时,它并没有列出与上面代码相同的模块(代码几乎相同,我不知道为什么尝试在自定义Node插件内实现该功能会影响结果):

void fm() { 
    HANDLE hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 5844);
    MODULEENTRY32 mEntry;
    // check invalid handle value...
    // check module32first...
    mEntry.dwSize = sizeof(mEntry);
    do {
        cout << mEntry.szModule << endl;
    } while (Module32Next(hModuleSnapshot, &mEntry));
    CloseHandle(hModuleSnapshot);
}

在使用node-gyp编译插件之后,我可以成功地调用它(在需要之后,它只需运行一个调用fm的函数)。

如果我试图用PID 5844(VS代码)来快照进程,它会打印出来:

Code.exe ntdll.dll wow64.dll wow64win.dll wow64cpu.dll

如果我用PID 6540(Chrome)尝试这个过程,它会打印出来:

chrome.exe ntdll.dll wow64.dll wow64win.dll wow64cpu.dll

这显然是不正确的,即使PID(硬编码)不同,它也会打印出相同的模块。

如果我使用第一块代码并用VS运行它,我会得到:

chrome.exe ntdll.dll KERNEL32.DLL KERNELBASE.dll apphelp.dll ADVAPI32.dll msvcrt.dll sechost.dll RPCRT4.dll SspiCli.dll CRYPTBASE.dll...还有更多的模块,但您可以看到这是第二块代码应该打印的内容。

我不知道为什么通过自定义Node插件运行代码会影响结果,除非我缺少或不了解Node插件。

我可以使用带有Node插件的CreateToolhelp32Snapshot正确打开和收集有关所有进程的信息,但我似乎无法收集有关进程中模块的信息。

在x86进程上的x64进程(Node.exe)中使用TH32CS_SNAPMODULE将只提供64位模块,使用TH32CS_SNAPMODULE32获得32位模块-所有模块的TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32

相关文章:
  • 没有找到相关文章