【问题标题】:Node addon unable to snapshot (CreateToolhelp32Snapshot) modules节点插件无法快照(CreateToolhelp32Snapshot)模块
【发布时间】:2015-12-02 18:38:26
【问题描述】:

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

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

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 正确打开和收集有关所有进程的信息,但我似乎无法收集有关进程中模块的信息。

【问题讨论】:

  • 你为什么用do ... while而不是while
  • 没有理由,为什么要使用while 而不是do while
  • 我还没有完全理解。您可能在 // check ... 部分中初始化了 mEntry
  • // check 中的 Module32First 看起来像 if (!Module32First(hModuleSnapshot, &amp;mEntry))...throw error
  • 节点在 x64 中运行,您尝试打开的进程可能是 x86。

标签: c++ node.js v8 libv8


【解决方案1】:

在 x86 进程上的 x64 进程 (Node.exe) 中使用 TH32CS_SNAPMODULE 只会为您提供 64 位模块,使用 TH32CS_SNAPMODULE32 获取 32 位模块 - TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32 用于所有模块。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多