Шаг 34 - Сканируем модули

Продолжаем изучать возможности ToolHelp.Dll. Мы так же работаем с проектом, который создавали ранее. Наша задача теперь просмотреть модули загруженные в память. Создаем ScanModule кнопку на форме. Вот как это будет выглядеть:

34.gif (6086 b)

А вот и код функции:

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);.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 10.11.2000