Группа минипорт.
Группа минипорт.
Функции этой группы занимаются обработкой потока данных и событий, происходящих в верхнем уровне драйвера, и вызываемых обращением к 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);
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);
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Группа
Группа Группу также нельзя отнести к "настоящим" элементам управления. Она объединяет несколько элементов управления, имеющих сходное назначение. Визуально группа представляет собой рамку, окружающую элементы управления и, возможно, имеющую заголовок, расположенный
«Притертая» группа
«Притертая» группа Группы формируются не сразу. Между участниками постепенно налаживаются отношения. Они учатся работать друг с другом, узнают странности, сильные и слабые стороны своих коллег. Со временем участники «притираются» друг к другу.В «притертой» группе есть
Группа активизации ILE
Группа активизации ILE Группа активизации содержит целиком или только ссылки на некоторые компоненты со странными, на первый взгляд, именами и аббревиатурами. Давайте сначала разберемся, что это за компоненты.Блок управления активизацией программы PACB (Program Activation Control Block)
Группа
Группа Группу также нельзя отнести к "настоящим" элементам управления. Она объединяет несколько элементов управления, имеющих сходное назначение. Визуально группа представляет собой рамку, окружающую элементы управления и, возможно, имеющую заголовок, расположенный
Домашняя группа
Домашняя группа Новый механизм, появившийся в Windows 7, с помощью которого вы можете легко создать домашнюю группу и управлять подключением новых пользователей к данной группе. Это позволяет создать сеть между всеми подключенными к группе компьютерами и организовать
Домашняя группа
Домашняя группа Домашняя группа – это новый механизм, реализованный в системе Windows 7. Смысл его состоит в том, чтобы предоставить общий доступ к файлам и папкам, а также устройствам всем пользователям, включенным в домашнюю группу. Например, можно объединить в домашнюю
1-я ценовая группа
1-я ценовая группа Около 5 % в каждой категории товаров (самое ходовое) нужно сделать очень дешевыми (с низкой маржой) или выделить несколько высококонкурентных товаров с минимальной наценкой. За счет этих товаров-локомотивов вы привлечете дополнительных клиентов,
2-я ценовая группа
2-я ценовая группа Вторая группа товаров в каждой категории должна иметь среднюю маржу, чуть выше, чем у конкурентов, – на 5-10 %. Таких товаров должно быть около 85–90 % от общего
3-я ценовая группа
3-я ценовая группа Наконец, третья ценовая группа, не очень большая, предназначена для премиум-сегмента. Туда входят товары с очень большой маржой, цена на которые должна быть значительно выше других аналогичных товаров в вашем интернет-магазине.Не продавая дорогие
Группа
Группа Представляет собой совокупность отделов, менеджеров и сотрудников, которые несут ответственность за набор задач или операций. Состав группы может варьироваться от одного или нескольких совместителей из различных отделов до нескольких сотрудников, занятых этой
Группа разработки ПО
Группа разработки ПО Представляет собой коллектив сотрудников (руководителей и технических специалистов), которые несут ответственность за проектные операции по разработке и сопровождению ПО (т. е. анализ требований, проектирование, кодирование и тестирование).В
Группа обучения
Группа обучения Состоит из сотрудников (руководителей и технических специалистов), отвечающих за координацию и проведение учебных мероприятий организации. Эта группа обычно готовит и проводит большинство учебных курсов и координирует использование других средств
Группа протокол.
Группа протокол. Протокольные функции несколько отличаются от функций минипорта, но имеют схожую функциональную нагрузку, обратную функциям минипорта по направлению передачи пакетов.PtOpenAdapterCompletePtCloseAdapterCompletePtBindAdapterPtUnbindAdapterФункции работы с адаптером – в нашем случае
Группа Шрифт ленты
Группа Шрифт ленты На вкладке Главная ленты расположена группа Шрифт, которая содержит инструменты форматирования для изменения шрифта и его атрибутов. Кроме того, в этой группе находится кнопка для выбора цвета заливки ячейки и кнопка выбора границ ячейки.
Группа Выравнивание ленты
Группа Выравнивание ленты В группе Выравнивание вкладки Главная ленты расположены кнопки для установки выравнивания данных в ячейке или выделенном диапазоне. В нижней части группы Выравнивание вы видите кнопки, знакомые вам по текстовым редакторам. Это кнопки