Читаем Как писать драйвера полностью

Выделение места под размер полученного пакета (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);

 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);

<p>Группа протокол.</p>

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

PtOpenAdapterComplete

PtCloseAdapterComplete

PtBindAdapter

PtUnbindAdapter

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

PtResetComplete

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

PtRequestComplete

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

PtStatus

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

PtStatusComplete

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

PtSendComplete

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

PtTransferDataComplete

PtReceive

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных