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

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

> NdisFreePacket(MyPacket);

>}

Если нет задержки на отсылке освободить пакет.

>} else {

Это говорит об отсутствии пакета в системе – ничего не надо делать.

>}

>return(Status);

Возврат значения SUCCESS или код ошибки.

Стоит остановиться еще на одном моменте. Когда система ответила, что посылка данных закончена кодом задержки пакета – NDIS_STATUS_PENDING.

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

Как нам освободить пакет? Система предусматривает такое и при освобождении ресурса после освобождению пакета вызовет функцию из группы протокола PtSendComplete. Смена на протокольную группу вызвана тем, что система получит сообщение от низлежащего драйвера, что вызывает обращение именно к этой группе.

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

>{

> PADAPT pAdapt =(PADAPT)ProtocolBindingContext;

> PNDIS_PACKET Pkt;

> PRSVD Rsvd;

> pAdapt = pAdapt->pPrimaryAdapt;

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

> Pkt = Rsvd->OriginalPkt;

> NdisIMCopySendCompletePerPacketInfo(Pkt, Packet);

> NdisDprFreePacket(Packet);

> NdisMSendComplete(pAdapt->MiniportHandle, Pkt, Status);

Группа протокол.

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

PtOpenAdapterComplete

PtCloseAdapterComplete

PtBindAdapter

PtUnbindAdapter

Функции работы с адаптером – в нашем случае адаптером является драйвер модема или сетевой карты. Адаптер соответственно при запуске надо открыть и при окончании работы – закрыть. При обращении к нему привязать (bind) адаптер, захватить ресурс. В конце работы – освободить.

PtResetComplete

Абсолютно пустая функция – она должна быть но мы сюда не приходим.

PtRequestComplete

Функция вызываемая из PtPnPNetEventSetPower.

PtStatus

Функция отвечающая за проверку статуса нижестоящего адаптера, вернее статуса взаимодействия с ним нашего уровня.

PtStatusComplete

Завершение в случае невозможности быстрого ответа, примерно как и в случае MPSend.

PtSendComplete

Описана в секции минипорт

PtTransferDataComplete

PtReceive

PtReceiveComplete

PtReceivePacket

Функции работы с данными – аналогичны функциям минипорта. Одну из функций мы уже разбирали. Функции остальных – чуть позже.

PtUnload

Функция заведующая выгрузкой драйвера при выходе.

PtPNPHandler

PtPnPNetEventReconfigure

PtPnPNetEventSetPower

Работа с PnP.

Вновь обратим внимание на симметричную функцию PtReceive.

>PADAPT pAdapt =(PADAPT)ProtocolBindingContext;

Контекст адаптера

>PNDIS_PACKET MyPacket, Packet; Пакеты.

>NDIS_STATUS Status = NDIS_STATUS_SUCCESS;

Статус

>if (!pAdapt->MiniportHandle) {

> Status = NDIS_STATUS_FAILURE;

>} else do {

> Эта часть работает при наличии второго адаптера :)

> if (pAdapt->isSecondary) {

>  DBGPRINT("PASSTHRU GETTING RECIEVES ON SECONDARY\n");

>  ASSERT(0);

> }

Забираем указатель на пакет в NDIS.

>Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);

Если пакета нет то мы выходим иначе продолжаем как и в случае с отправкой.

>if (Packet != NULL) {

Резервируем пакет для себя.

>NdisDprAllocatePacket(&Status, &MyPacket, pAdapt->RecvPacketPoolHandle);

>if (Status == NDIS_STATUS_SUCCESS) {

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

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

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

>NDIS_SET_ORIGINAL_PACKET(MyPacket, NDIS_GET_ORIGINAL_PACKET(Packet));

>NDIS_SET_PACKET_HEADER_SIZE(MyPacket, HeaderBufferSize);

>NdisGetPacketFlags(MyPacket) = NdisGetPacketFlags(Packet);

>NDIS_SET_PACKET_STATUS(MyPacket, NDIS_STATUS_RESOURCES);

В этом случае мы не посылаем пакет как при отправке, а просто указываем NDIS что MyPacket готов к передаче наверх.

>NdisMIndicateReceivePacket(pAdapt->MiniportHandle, &MyPacket, 1);

>ASSERT(NDIS_GET_PACKET_STATUS(MyPacket) == NDIS_STATUS_RESOURCES);

Освобождение пакета при нормальной передаче.

>  NdisDprFreePacket(MyPacket);

>  break;

> }

>}

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

>pAdapt->IndicateRcvComplete = TRUE;

>switch (pAdapt->Medium) {

>case NdisMedium802_3:

> NdisMEthIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize);

> break;

>case NdisMedium802_5:

> NdisMTrIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize);

> break;

>case NdisMediumFddi:

> NdisMFddiIndicateReceive(pAdapt->MiniportHandle, MacReceiveContext, HeaderBuffer, HeaderBufferSize, LookAheadBuffer, LookAheadBufferSize, PacketSize);

> break;

>default:

Это в случае если тип сети неизвестен.

> ASSERT(0);


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

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


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

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


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

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


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

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


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

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


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, необходимые для построения объектно-ориентированной модели системы с использованием графической нотации. Изложение сопровождается примерами разработки отдельных диаграмм, которые необходимы для представления информационной модели системы.