Выбор языка программирования, среды разработки
ВВЕДЕНИЕ
В рамках данного курсового проекта необходимо реализовать usb сниффер для операционной системы Windows. Usb сниффер – это программа, предназначенная для копирования файлов с флэшек и внешних жестких дисков, которые подключены и/или подключаются к компьютеру во время работы данной программы.
ОБЗОР И ВЫБОР МЕТОДОВ РЕШЕНИЯ ПОСТАВЛЕННОЙ ЗАДАЧИ
Основными проблемами при написании usb сниффера являются:
1. Отлавливание события подключения флэшки.
2. Копирование целого дерева каталогов с вложенными файлами.
Для решения первой проблемы существует несколько методов. Это получение сообщений о подключении внешних устройств от системы и проверка томов с определением подключено ли какое-либо устройство. В данном примере был рассмотрен второй случай, а именно проверка на ошибки при обращении к определенной директории с помощью функций SetCurrentDirectory(),GetCurrentDirectory() и GetLastError().
При рассмотрении второй проблемы было найдено также 2 пути ее решения:
1. Рекурсивный поиск в каталогах с помощью функций FindFirstFile() и FindNextFile(), создание директорий с такими же именами функцией CreateDirectory() и последующее копирование функцией CopyFile().
2. Копирование сразу всего дерева каталогов с вложенными файлами с помощью структуры типа SHFILEOPSTRUCT и функции SHFileOperation() с указанием флага функции FO_COPY.
В данном случае был выбран и реализован второй вариант.
Для решения поставленной задачи будет использован язык C++, а так же все необходимые функции WINAPI.
ВЫБОР ЯЗЫКА ПРОГРАММИРОВАНИЯ, СРЕДЫ РАЗРАБОТКИ
C++ — чрезвычайно мощный язык, содержащий средства создания эффективных программ практически любого назначения, от низкоуровневых утилит и драйверов до сложных программных комплексов самого различного назначения. В частности:
Поддерживаются различные стили и технологии программирования, включая традиционное директивное программирование, ООП, обобщённое программирование, метапрограммирование (шаблоны, макросы).
Автоматический вызов деструкторов объектов при их уничтожении, причём в порядке, обратном вызову конструкторов. Это упрощает (достаточно объявить переменную) и делает более надёжным освобождение ресурсов (память, файлы, семафоры и т. п.), а также позволяет гарантированно выполнять переходы состояний программы, не обязательно связанные с освобождением ресурсов (например, запись в журнал).
Пользовательские функции-операторы позволяют кратко и ёмко записывать выражения над пользовательскими типами в естественной алгебраической форме.
Язык поддерживает понятия физической (const) и логической (mutable) константности. Это делает программу надёжнее, так как позволяет компилятору, например, диагностировать ошибочные попытки изменения значения переменной. Объявление константности даёт программисту, читающему текст программы дополнительное представление о правильном использовании классов и функций, а также может являться подсказкой для оптимизации. Перегрузка функций-членов по признаку константности позволяет определять изнутри объекта цели вызова метода (константный для чтения, неконстантный для изменения). Объявление mutable позволяет сохранять логическую константность при использовании кэшей и ленивых вычислений.
Используя шаблоны, возможно создавать обобщённые контейнеры и алгоритмы для разных типов данных, а также специализировать и вычислять на этапе компиляции.
Возможность имитации расширения языка для поддержки парадигм, которые не поддерживаются компиляторами напрямую. Например, библиотека Boost.Bind позволяет связывать аргументы функций.
Возможность создания встроенных предметно-ориентированных языков программирования. Такой подход использует, например библиотека Boost.Spirit, позволяющая задавать EBNF-грамматику парсеров прямо в коде C++.
Используя шаблоны и множественное наследование можно имитировать классы-примеси и комбинаторную параметризацию библиотек. Такой подход применён в библиотеке Loki, класс SmartPtr которой позволяет, управляя всего несколькими параметрами времени компиляции, сгенерировать около 300 видов «умных указателей» для управления ресурсами.
Кроссплатформенность: стандарт языка накладывает минимальные требования на ЭВМ для запуска скомпилированных программ. Для определения реальных свойств системы выполнения в стандартной библиотеке присутствуют соответствующие возможности (например, std::numeric_limits <T>). Доступны компиляторы для большого количества платформ, на языке C++ разрабатывают программы для самых различных платформ и систем.
Эффективность. Язык спроектирован так, чтобы дать программисту максимальный контроль над всеми аспектами структуры и порядка исполнения программы. Ни одна из языковых возможностей, приводящая к дополнительным накладным расходам, не является обязательной для использования — при необходимости язык позволяет обеспечить максимальную эффективность программы.
Имеется возможность работы на низком уровне с памятью, адресами.
Высокая совместимость с языком C, позволяющая использовать весь существующий C-код (код на C может быть с минимальными переделками скомпилирован компилятором C++; библиотеки, написанные на C, обычно могут быть вызваны из C++ непосредственно без каких-либо дополнительных затрат, в том числе и на уровне функций обратного вызова, позволяя библиотекам, написанным на C, вызывать код, написанный на С++)