Я пытаюсь изучить 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) распечатывает:
Code.exe
ntdll.dll
wow64.dll
wow64win.dll
wow64cpu.dll
Если я попробую процесс с PID 6540
(Хром) это распечатывает:
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.
Я могу правильно открывать и собирать информацию обо всех процессах, используя CreateToolhelp32Snapshot
с надстройкой Node, но я не могу собрать информацию о модулях в процессе.
С помощью TH32CS_SNAPMODULE
в процессе x64 (Node.exe) на x86 процесс даст вам только 64-битные модули, используйте TH32CS_SNAPMODULE32
чтобы получить 32-битные модули — TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
для всех модулей.
Других решений пока нет …