|
Шаг 34 - Сканируем модули.
Продолжаем изучать возможности 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);.
Предыдущий Шаг | Следующий Шаг | Оглавление By Artem.
Используются технологии uCoz
|