· ULONG PacketGetAdapterNames (PTSTR pStr, PULONG BufferSize) –получение информации об адаптерах, установленных в системе. Функция опрашивает реестр ОС, производит OID-вызовы драйвера пакетов и записывает имена установленных сетевых адаптеров и их описание в заданный пользователем буфер pStr. BufferSize – размер этого буфера. Формат данных, записываемых в буфер, отличен для версий Windows 95/98 и WindowsNT/2000, из-за разницы в кодировках строк у этих ОС (Windows 95/98 использует кодировку ASCII, Windows NT/2000 – UNICODE). Один ноль ASCII разделяет имена адаптеров, два нуля ASCII – конец списка.
· LPADAPTER PacketOpenAdapter (LPSTR AdapterName) – инициализации адаптера. AdapterName - имя адаптера. Возвращает указатель на структуру ADAPTER открытого адаптера.
· VOID PacketCloseAdapter (LPADAPTER lpAdapter) – высвобождает структуру ADAPTER, связанную с указателем lpAdapter, и закрывает адаптер, связанный с ней.
· LPPACKET PacketAllocatePacket (void) – определяет положение структуры PACKET, инициализированной функцией PacketInitPacket, и возвращает указатель на нее.
· VOID PacketInitPacket (LPPACKET lpPacket, PVOID Buffer, UINT Length) – инициализирует структуру PACKET и имеет следующие аргументы:
o lpPacket – указатель на инициализируемую структуру;
o Buffer – указатель на буфер, задаваемый пользователем и содержащий данные пакета;
o Length – длина буфера – максимальный размер данных, которые могут быть переданы драйвером приложению за один сеанс чтения.
· VOID PacketFreePacket (LPPACKET lpPacket) – высвобождает структуру PAСKET, связанную с указателем lpPacket.
· VOID PacketReceivePacket (lpAdapter AdapterObject, LPPACKET lpPacket, BOOLEAN Sync) – выполняет захват группы пакетов, и имеет следующие аргументы:
o AdapterObject – указатель на структуру ADAPTER, определяющую адаптер, который будет задействован в текущей сессии;
o lpPacket – указатель на структуру PACKET, используемую для записи принятых пакетов;
o Sync – флаг, определяющий режим выполнения операции. Если выбран синхронный режим (True), функция блокирует программу до завершения операции. Если выбран асинхронный режим (False), блокировки не происходит. В последнем случае необходимо использовать функцию PacketWaitPaket для корректного выполнения операции.
Число принятых пакетов зависит от количества пакетов, сохраненных в буфере драйвера, размера этих пакетов и размера буфера, связанного со структурой lpPacket.
Пакеты сохраняются в буфере структуры lpPacket. Каждый пакет состоит из структуры bpf_hdr и содержащий информацию о длине пакета и времени его приема. Поле Padding используется для выравнивания данных в буфере. Поля bf_datalen и bf_hdrlen структуры bpf_hdr используются для извлечения пакетов из буфера
Функция перехватывает пакеты канального уровня. Первые 12 байт поля data – MAC адреса приемника и источника по 6 байт соответсвенно, следующие 2 ба та – идентификатор следующего пакета 0806 – ARP, 0800 – IP, далее располагаются пакеты более высоких уровней. Для анализа IP-пакета рекомендуется использовать следующую структуру:
struct ipHeader{
BYTE mac[14];
BYTE ip_verlen;
BYTE ip_tos;
WORD ip_length;
WORD ip_id;
WORD ip_offset;
BYTE ip_ttl;
BYTE ip_protocol;
WORD ip_xsum;
DWORD ip_src;
DWORD ip_dest;
};
· BOOLEAN PacketWaitPacket (LPADAPTER AdapterObject, LPPACKET lpPacket) – используется для корректного завершения операции ввода/вывода драйвера захвата пакетов. Она является блокирующей в том случае, если драйвер выполняет операцию ввода/вывода. Функция возвращает значение True, если операция завершена успешно, в противном случае – False. Используя функцию GETLASTERROR, можно получить код возникшей ошибки.
· BOOLEAN PacketResetAdapter (LPADAPTER AdapterObject) - сбрасывает адаптер, указанный в качестве аргумента.
· BOOLEAN PacketSetHwFilter (LPADAPTER AdapterObject, ULONG Filter) – устанавливает аппаратный (hardware) фильтр входящих пакетов. Константы, с помощью которых задается фильтр, объявлены в файле ntddndis.h. В качестве аргументов функции задается адаптер, на который устанавливается фильтр, и идентификатор фильтра. Функция возвращает значение True, если операция выполнена успешно. Ниже перечислены наиболее часто используемые фильтры:
o NDIS_PACKET_TYPE_PROMISCUOUS: каждый входящий пакет принимается адаптером;
o NDIS_PACKET_TYPE_DIRECTED: принимаются пакеты, предназначенные для данной рабочей станции;
o NDIS_PACKET_TYPE_BROADCAST: принимаются только широковещательные запросы;
o NDIS_PACKET_TYPE_MULTICAST: принимаются пакеты, предназначенные группе, которой принадлежит рабочая станция;
o NDIS_PACKET_TYPE_ALL_MULTICAST: принимаются пакеты любой группы.
· BOOLEAN PacketRequest (LPADAPTER AdapterObject, BOOLEAN Set, PACKET_OID_DATA OidData) – предназначена для выполнения запроса/установки параметров адаптера AdapterObject. Эта функция используется для получения значений различных параметров сетевого адаптера (размер внутреннего буфера, скорость соединения, значение счетчика пакетов и др.) или их изменения. Второй аргумент определяет тип операции (Set=1 – установка параметра, Set=0 – запрос на получение значения параметра). Третий аргумент – указатель на структуру PACKET_OID_DATA, определяющую параметр адаптера. Функция возвращает True, если операция была выполнена без ошибок.
· BOOLEAN PacketSetBuff (LPADAPTER AdapterObject, int dim) - устанавливает новый размер буфера драйвера, связанного с адаптером AdapterObject. dim – новый размер буфера. Функция возвращает True, если операция была выполнена успешно, False – если для выполнения операции недостаточно памяти. При установке нового размера буфера все данные, находящиеся в нем, стираются.
· BOOLEAN PacketSetBpf (LPADAPTER AdapterObject, struct bpf_program *fp) – связывает новый BPF-фильтр с адаптером AdapterObject. Фильтр, указанный *fp, представляет собой набор инструкций, которые будут выполняться после приема каждого входящего пакета. Функция возвращает значение True, если фильтр установлен успешно, False – если программа-фильтр не принята драйвером.
· BOOLEAN PacketGetStats (LPADAPTER AdapterObject, struct bpf_stat *s) – с помощью этой функции программист может получить значение двух внутренних переменных драйвера:
o число пакетов, принятых адаптером AdapterObject, с момента его открытия при помощи функции PacketOpenAdapter;
o число пакетов, принятых адаптером, но проигнорированных ядром. Пакет игнорируется в том случае, если приложение пользователя не готово принять его и буфер, связанный с адаптером, заполнен.
В структуру bpf_stat драйвер записывает два значения:
· большое значение переменной bs_receive означает, что трафик сети весьма высок. Если приложению нет необходимости принимать все входящие пакеты, рекомендуется установить избирательный фильтр BPF для уменьшения числа обрабатываемых приложением пакетов.
· если значение переменной bs_drop выше нуля, приложение пользователя не успевает обрабатывать входящие пакеты и теряет их. В этом случае рекомендуется увеличить размер буфера при помощи функции PaсketSetBuff, увеличить размер буфера в структуре PACKET либо оптимизировать алгоритм приложения.
· BOOLEAN PacketSetReadTimeout (LPADAPTER AdapterObject, int timeout) – устанавливает время ожидания (аргумент timeout) входящего пакета, по истечении которого все пакеты, сохраненные в буфере, будут переданы приложению.
· BOOLEAN PacketSetMode (LPADAPTER AdapterObject, int mode) - переводит адаптер AdapterObject в режим работы mode, имеющий два возможных значения:
o MODE_CAPT – стандартный режим захвата, устанавливается по умолчанию после вызова функции PacketOpenAdapter;
o MODE_STAT – режим статистики. В этом режиме драйвер не перехватывает пакеты, а производит лишь подсчет принятых пакетов и принятых байт. Эти значения могут быть запрошены приложением путем вызова функции PacketReceivePacket. Приложение имеет возможность получать данную информацию периодически по истечении времени ожидания, которое по умолчанию составляет 1 секунду, но может быть изменено на другое значение с дискретностью 1 мС при помощи функции PacketSetReadTimeout.
Для того, чтобы работать в режиме статистики, приложению необходимо выполнить следующие операции:
o открыть адаптер
o установить режим статистики функцией PacketSetMode
o установить фильтр, определяющий тип подсчитываемых пакетов, функцией PacketSetBpf
o установить необходимое время ожидания при помощи PacketSetReadTimeout
o принять результаты при помощи PacketReceivePacket.
При этом функция PacketReceivePacket возвращает число принятых пакетов и число принятых байт, удовлетворяющих требованиям установленного фильтра, за последний временной интервал. Эти значения являются 64-битными целыми числами, и снабжены заголовком, определяемым структурой bpf_hdr: