Как писать драйвера - [4]

Шрифт
Интервал

>MajorFunctions[IRP_MJ_CREATE] = FilterOpen;

>MajorFunctions[IRP_MJ_CLOSE] = FilterClose;

>MajorFunctions[IRP_MJ_READ] = FilterRead;

>MajorFunctions[IRP_MJ_WRITE] = FilterWrite;

>MajorFunctions[IRP_MJ_DEVICE_CONTROL] = FilterIoControl;

>//Регистрируем их

>Status = NdisMRegisterDevice(WrapperHandle, &ntDeviceName, &win32DeviceName, MajorFunctions, &deviceObject, &GlobalData.NdisDeviceHandle );

>// проверяем статус

>if (Status != NDIS_STATUS_SUCCESS ) {

> if (GlobalData.ProtHandle) NdisDeregisterProtocol(&Status, GlobalData.ProtHandle);

> if (GlobalData.NdisDeviceHandle) NdisMDeregisterDevice(GlobalData.NdisDeviceHandle);

> if (WrapperHandle) NdisTerminateWrapper(WrapperHandle, NULL);

> return (Status);

>}

>// set access method into deviceObject ( received from NdisMRegisterDevice() )

>// объявление буферизации для связывающих операций

>deviceObject->Flags |= DO_BUFFERED_IO;

>// все.

Тела функций, типа Filter, объявите сразу после тела функции DriverEntry и оставьте пока пустыми, добавив, только возвращение значения

>return NDIS_STATUS_SUCCESS;

Как писать драйвера (часть 4)

В прошлый раз мы заготовили списки необходимых функций, зарегистрировали их, а сегодня рассмотрим их поподробнее.

Группа минипорт.

Функции этой группы занимаются обработкой потока данных и событий, происходящих в верхнем уровне драйвера, и вызываемых обращением к NDIS TCP/IP стека.

Если посмотреть на схемы из второй части, то видно, что в нижней части находятся функции протокола, а в верхней минипорта. Почему? Каждый драйвер выступает в двух ипостасях. Общаясь с верхним уровнем драйверов он становиться для него драйвером минипорта, а для нижнего уровня, драйвером протокола.

Список функций минипорт:

MPInitialize – инициализация группы.

MPSend

MPSendPackets

MPTransferData

MPReturnPacket

Функции отвечающие за пересылку пакетов данных.

MPQueryInformation

MPSetInformation

MPQueryPNPCapbilities

MPIsSendOID

MPProcessSetPowerOid

Функции работы с питанием состоянием системы и системой PlagNPlay. Сказать особенно нечего. Стандартное отслеживание внутренних событий системы прописанное Microsoft.

MPHalt – отработка выгрузки и де регистрации драйвера при аварийном.

MPReset – как написано у Microsoft – мы не должны ничего делать :)

Работа с системой – необходимость отрабатывать события важные для сервиса корректно.

MPSetMiniportSecondary

MPPromoteSecondary

MPBundleSearchAndSetSecondary

В системе может быть не один адаптер и соответственно не один драйвер к которому приходится обращаться. В случае такого используются эти функции.

В нашем случае основными функциями из этой группы – являются функции пересылки данных. Все остальные мы можем не рассматривать, их назначение – обслуживать правильно системные связи, вся основная часть которых написана Microsoft.

MPSend

Основная функция вызываемая всегда, при прохождении данных. По правилам работы с данными в NDIS необходимо написать (что в примере и сделано) re-wrap пакету.

Для этого сначала пакет надо захватить, перекопировать содержимое пакета в свою память и переслать его далее, после чего освободить пакет. Вот как будет это выглядеть в коде:

>PADAPT pAdapt = (PADAPT)MiniportAdapterContext;

Контекст адаптера приходящий в качестве параметра. Присвоим его своему типизированному указателю.

>NDIS_STATUS Status;

Возвращаемый статус.

>PNDIS_PACKET MyPacket;

Наш пакет – пока только указатель.

>PRSVD Rsvd;

Резервный указатель.

>PVOID MediaSpecificInfo = NULL;

Тип адаптера с которым будем работать.

>ULONG MediaSpecificInfoSize = 0;

Размер типа адаптера.

>ASSERT (pAdapt->pSecondaryAdapt);

>pAdapt = pAdapt->pSecondaryAdapt;

Проверка наличия второго сетевого адаптера. Вверху я говорил, что его наличие необходимо предусматривать.

>if (IsIMDeviceStateOn (pAdapt) == FALSE) {

> return NDIS_STATUS_FAILURE;

>}

Проверка наличия и состояния.

>NdisAllocatePacket(&Status, &MyPacket, pAdapt->SendPacketPoolHandle);

Выделение места под размер полученного пакета (Pool) данных.

>if (Status == NDIS_STATUS_SUCCESS) {

> PNDIS_PACKET_EXTENSION Old, New;

> Rsvd = (PRSVD)(MyPacket->ProtocolReserved);

> Rsvd->OriginalPkt = Packet;

> MyPacket->Private.Flags = Flags;

> MyPacket->Private.Head = Packet->Private.Head;

> MyPacket->Private.Tail = Packet->Private.Tail;

Собственно копирование всей служебной информации

>NdisSetPacketFlags(MyPacket, NDIS_FLAGS_DONT_LOOPBACK);

Установка ее в наш внутренний буфер.

>NdisMoveMemory(NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA));

Перенос данных в сам пакет.

>NdisIMCopySendPerPacketInfo(MyPacket, Packet);

Копирование служебных данных по пересылке пакета.

Копирование данных о типе адаптера, куда пересылать данные.

>NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO(Packet, &MediaSpecificInfo, &MediaSpecificInfoSize);

>if (MediaSpecificInfo || MediaSpecificInfoSize) {

> NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO(MyPacket, MediaSpecificInfo, MediaSpecificInfoSize);

>}

Собственно пересылка имеющихся данных в NDIS, что вызовет нормальное прохождение пакета далее по цепочке драйверов.

>NdisSend(&Status, pAdapt->BindingHandle, MyPacket);

>if (Status != NDIS_STATUS_PENDING) {

> NdisIMCopySendCompletePerPacketInfo (Packet, MyPacket);


Еще от автора Неизвестный Автор
Галчонок

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Сборник рассказов о порке

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Саньтии Веды Перуна

Саньтии Веды Перуна (Книга Мудрости Перуна) одно из древнейших Славяно-Арийских Священных Преданий, сохраненных Жрецами-хранителями Древнерусской Инглиистической церкви Православных Староверов-Инглингов.


Призраки ночи

В книге собраны предания и поверья о призраках ночи — колдунах и ведьмах, оборотнях и вампирах, один вид которых вызывал неподдельный страх, леденивший даже мужественное сердце.


Закат  вечности

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


mmmavro.org | День 131, Победа

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Рекомендуем почитать
Язык PL/SQL

В учебно-методическом пособии рассматриваются основы языка программирования PL/SQL, реализованного в системе управления базами данных Oracle Database Server. Приводятся сведения о поддерживаемых типах данных, структуре программ PL/SQL и выполнении SQL-предложений в них. Отдельно рассмотрено создание хранимых в базах данных Oracle программ PL/SQL – процедур, функций, пакетов и триггеров.


Пишем драйвер Windows на ассемблере

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Язык программирования С# 2005 и платформа .NET 2.0.

В этой книге содержится описание базовых принципов функционирования платформы .NET, системы типов .NET и различных инструментальных средств разработки, используемых при создании приложений .NET. Представлены базовые возможности языка программирования C# 2005, включая новые синтаксические конструкции, появившиеся с выходом .NET 2.0, а также синтаксис и семантика языка CIL. В книге рассматривается формат сборок .NET, библиотеки базовых классов .NET. файловый ввод-вывод, возможности удаленного доступа, конструкция приложений Windows Forms, доступ к базам данных с помощью ADO.NET, создание Web-приложений ASP.NET и Web-служб XML.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Информационная технология. Руководство по управлению документированием программного обеспечения

ГОСУДАРСТВЕННЫЙ СТАНДАРТ РОССИЙСКОЙ ФЕДЕРАЦИИИнформационная технологияРУКОВОДСТВО ПО УПРАВЛЕНИЮ ДОКУМЕНТИРОВАНИЕМ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯInformation technology. Guidelines for the management of software documentationИздание официальноеДата введения 1994-07-01ГОССТАНДАРТ РОССИИ Москва© Издательство стандартов, 1994.


Самоучитель UML

Самоучитель UMLПервое издание.В книге рассматриваются основы UML – унифицированного языка моделирования для описания, визуализации и документирования объектно-ориентированных систем и бизнес-процессов в ходе разработки программных приложений. Подробно описываются базовые понятия UML, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.