Продолжаем изучать возможности ToolHelp.Dll. Мы так же работаем с проектом, который создавали ранее. Наша задача теперь просмотреть модули загруженные в память. Создаем ScanModule кнопку на форме. Вот как это будет выглядеть:
А вот и код функции:
void CScanProcessDlg::OnScanModule() { m_List1.ResetContent(); HANDLE hSnap; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, 0); if (hSnap == NULL) { AfxMessageBox("Error Load ToolHelp"); } else { MODULEENTRY32 mod; if (Module32First(hSnap, &mod)) { m_List1.AddString(mod.szExePath); while (Module32Next(hSnap, &mod)) { m_List1.AddString(mod.szExePath); } } CloseHandle(hSnap); } }
Как видите существенных изменений в логике нет. Поменяли флаг TH32CS_SNAPMODULE и стали использовать новые функции Module32First() и Module32Next() связанные со структурой MODULEENTRY32. Вообще-то модули привязаны к процессам. Но пока мы просто их поискали. Давайте изменим код для того, чтобы найти модули связанные с определенным процессом. ВНИМАНИЕ код написан для демонстрации идеи на данный момент. То есть многие вещи надо было бы выделить в отдельные процедуры, например, SearсhProcess. Идея такая. Как зная процесс найти связанные с ним DLL ?
void CScanProcessDlg::OnScanModule() { int inIndex; inIndex=m_List1.GetCurSel(); if (inIndex!=LB_ERR) { CString csExName; m_List1.GetText(inIndex,csExName); HANDLE hSnap1; hSnap1 = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnap1 == NULL) { AfxMessageBox("Error Load ToolHelp"); } else { PROCESSENTRY32 proc; if (Process32First(hSnap1, &proc)) { while (Process32Next(hSnap1, &proc)) { if (csExName==proc.szExeFile) { m_List1.ResetContent(); HANDLE hSnap; hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, proc.th32ProcessID); if (hSnap == NULL) { AfxMessageBox("Error Load ToolHelp"); } else { MODULEENTRY32 mod; if (Module32First(hSnap, &mod)) { m_List1.AddString(mod.szExePath); while (Module32Next(hSnap, &mod)) { m_List1.AddString(mod.szExePath ); } } CloseHandle(hSnap); } } } } CloseHandle(hSnap1); } } else AfxMessageBox("Select Process"); }
Можно передать ID процесса и найти связанные с ним модули hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, proc.th32ProcessID);.