Класс для получения последних посещённых Internet – страниц и даты их посещения. Над списком результатов возможны все операции, реализованные в CSearchWindow. Поэтому рассмотрим лишь отдельные методы этого класса:
Название функции | Описание |
AddToList(CIEUrl &url) | Добавление в список. Класс передаваемого по ссылке объекта описан в файле IEHistory. h и будет рассмотрен подробнее. |
ShowHistory() | Получение History |
CInternetFavorites
Назначение методов этого класса – поиск и обработка избранных Интернет – адресов пользователя (Favorites). На системном разделе производится поиск папок “Избранное” и ”Favorites”. Функции обработки списка (при отсутствии сортировки) полностью аналогичны предыдущим двум классам, поэтому нет смысла останавливаться на них. Возможно открытие окна собственно Internet Explorer.
CBrowse
Инициализируется структура TreeView для построения дерева директорий компьютера. После получения управления от объекта CSearchWindow и выбора пользователем директории поиска объект класса запоминает её путь и передаёт его объекту CSearchWindow, если же директория поиска не была выбрана, выдаёт соответствующее предупреждение.
CExtension
Данный класс соответствует окну, в котором вводится расширение файлов, которые необходимо найти. Оно запоминается и передаётся в объект класса CSearchWindow.
СPage1
Первая вкладка главного окна. Содержит в качестве ActiveX-компонента фоновый рисунок, приветствие и кнопку “Поиск файлов”, при нажатии на которую управление передаётся объекту CSearchWindow.
СPage2
Вторая вкладка главного окна. Содержит кнопки “Internet History” и “Internet Favorites”, при нажатии на которые управление передаётся объектам CHistoryDisplay и CInternetFavorites соответственно.
СPage3
Третья вкладка главного окна. Содержит кнопки “Информация о версии ОС Windows”(полностью, включая спецификатор и номер сборки), “Информация об аппаратном обеспечении”, “Системная информация Windows” и “Основные системные директории”. Для получения данной информации были использованы функции Win32API GetComputerName(), GetUserName(), GetSystemDirectory(), GetWindowsDirectory(), ExpandEnvironmentStrings() (переменные окружения), GetSystemInfo(), SHGetSpecialFolderPath(), RegOpenKeyEx(), структуры MEMORYSTATUS, SYSTEM_INFO, OSVERSIONINFOEX, OSVERSIONINFO и другое.
CSplashScreen
Отображение при загрузке программы окна Splash Screen.
Разработка основных алгоритмов программы
При рассмотрении основных алгоритмов программы следует определить, какие из них можно отнести к этой категории. Выбор представляется очевидным:
ü организация поиска файлов
ü копирование в буфер обмена
ü сортировка
ü получение адресов Internet History
Этот выбор легко обосновать. Первый пункт имеет огромное значение в связи с тем, что является одним из центральных алгоритмов в программе. Второй весьма важен, так как связан с работой буфера обмена Windows, и в случае неправильных действий возможен крах операционной системы. Сортировка должна быть быстрой и не подвешивать программу даже при десятках тысяч сортируемых элементов. Алгоритм получения History из Internet Explorer интересен сам по себе.
Рассмотрим функцию поиска на примере каркаса функции FindHidden:
void CSearchWindow::FindHidden(LPCTSTR pstr)
{
CFileFind finder;
CString str;
CString strWildcard(pstr);
strWildcard += _T("\\*.*"); //добавление маски *.* для просмотра всех файлов
BOOL bWorking = finder. FindFile(strWildcard);
while (bWorking) // продолжаем, пока есть файлы
{
bWorking = finder. FindNextFile();
if (finder. IsDots()) continue; // пропуск. и.. файлов
if (finder. IsHidden()&&DatePass(finder)&&TypePass(finder))
{
DisplayItem(finder); // функция DisplayItem реализована отдельно
UpdateWindow();
}
else UpdateWindow();
if (finder. IsDirectory())
{
CString str = finder. GetFilePath(); // рекурсивный проход директорий
FindHidden(str);
}
}
finder. Close();
}
В этой функции вызваны также упоминавшийся ранее цикл обработки сообщений
WaitLoop() и проверка, не была ли нажата кнопка “Stop” для остановки поиска. Данный алгоритм весьма компактен и удобен, а возможность реализовать остановку поиска и вовсе ставит его вне конкуренции.
Рассмотрим фрагмент алгоритма копирования в буфер обмена:
CString Message, Text;
int ItemCount, i;
HGLOBAL hGlobal;
CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_FoundFiles); //поучение указателя на список
ASSERT(pListCtrl!= NULL);
Text ="Имя\tПуть\t\tДата последнего просмотра\t\tДата модификации\t\tДата создания\r\n";
ItemCount = m_FileList. GetItemCount();
if (ItemCount == 0) { AfxMessageBox("Список пуст!");return; }
POSITION pos = m_FileList. GetFirstSelectedItemPosition(); // ищем выделенный элемент
if (pos==0) //если выделенных нет, копируем весь список
{
for (i=0; i<ItemCount; ++i) // помещаем информацию в CString
{ Text += m_FileList. GetItemText(i, 0) + '\t';
Text += m_FileList. GetItemText(i, 1) + '\t';
Text += m_FileList. GetItemText(i, 2) + '\t';
Text += m_FileList. GetItemText(i, 3) + '\t';
Text += m_FileList. GetItemText(i, 4) + "\r\n";
}
if (!OpenClipboard()) // откроем буфер
{
MessageBox("The clipboard is temporarily unavailable");
return;
}
if (!EmptyClipboard()) // очистить буфер
{
CloseClipboard();
MessageBox("The clipboard cannot be emptied");
return;
}
hGlobal = GlobalAlloc(GMEM_MOVEABLE, Text. GetLength()+1);
if (!hGlobal) // выделение памяти
{
CloseClipboard();
MessageBox(CString("Memory allocation error: "));
return;
}
strcpy((char *)GlobalLock(hGlobal), Text);
GlobalUnlock(hGlobal);
if (!SetClipboardData(CF_TEXT, hGlobal)) // непосредственное помещение в буфер
{
MessageBox(CString("Error setting clipboard"));
}
CloseClipboard();
}//if
else {… // аналогично, но обрабатываем выделенные позиции }
Реализация алгоритма сортировки является ключевой при разработке задачи. Крайне важно быстродействие сортировки. После написания нескольких собственных функций самыми быстрыми известными мне методами пришлось признать, что результат функции SortItems класса CListCtrl (10 000 элементов сортируются за 4 секунды) недосягаем, и данная функция была признана лучшей для разрабатываемого программного продукта и реализована, несмотря на небольшую ошибку в MSDN Library при описании параметров функции сравнения, локализованную лишь после непосредственного обращения в службу технической поддержки корпорации Microsoft. Подробнее рассмотрим функцию SortItems:
BOOL SortItems( PFNLVCOMPARE pfnCompare, DWORD dwData );
Первый параметр – функция сравнения следующего вида
static int CALLBACK CompareEdit(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort) (возвращает значение>0, если необходимо поменять элементы местами, <0 – если нет и 0, если элементы эквивалентны).
Второй параметр – указатель на CListCtrl
К сожалению, вопрос о том, каким образом элементы меняются местами и как именно они сравниваются, остаётся загадкой.
Подтверждением хорошего взаимодействия между продуктами Microsoft служит простота алгоритма получения History из Internet Explorer:
// Returns only URL paths
BOOL GetHistory(CStringList & list)
{
STATURL url;
CString strUrl;
ULONG uFetched;
IUrlHistoryStg2Ptr history;
IEnumSTATURLPtr enumPtr;
if(FAILED(CoCreateInstance(CLSID_CUrlHistory, NULL, CLSCTX_INPROC_SERVER, IID_IUrlHistoryStg2,(void**)&history)))
{
return false;
}
if(FAILED(history->EnumUrls(&enumPtr)))
return false;
while(SUCCEEDED(enumPtr->Next(1,&url,&uFetched)))
{
if(uFetched==0)
break;
strUrl = url. pwcsUrl;
list. AddTail(strUrl);
}
return true;
}
Данный алгоритм не является сложным для понимания и обладает высокой эффективностью.
Заключение
В ходе курсовой работы выполнены следующие задачи:
ü Изучены возможности библиотеки классов MFC, а также некоторые особенности языка C++ и среды Microsoft Visual C++;
ü Изучены теоретические основы сущности компьютерно-технической экспертизы;
ü Исследованы алгоритмы сортировки, поиска файлов, копирования в буфер, получения системной информации Windows, посещённых Internet – адресов.
ü Разработана автоматизированная система, позволяющая производить компьютерно - техническую экспертизу по ряду параметров, оговоренных целями выполнения курсовой работы.
Литература
1. Jamie Morris. Forensics on the Windows Platform, Part One. Security Focus Journal, January 28, 2003.
2. Р., И. Судебная компьютерно-техническая экспертиза. - М.: Право и закон, 2001. - 416 с.
3. http://www. crime-research. org/
4. Дэвид Дж. Круглински, Скотт Уингоу, Джордж Шеферд. “Программирование на Visual C++ 6.0 для профессионалов”. Санкт-Петербург, издательство «Питер», 2001 г.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 |
Основные порталы (построено редакторами)
