"Гром. Как писать драйвера (fb2) " - читать интересную книгу автораГруппа минипорт.Функции этой группы занимаются обработкой потока данных и событий, происходящих в верхнем уровне драйвера, и вызываемых обращением к 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 пакету. Для этого сначала пакет надо захватить, перекопировать содержимое пакета в свою память и переслать его далее, после чего освободить пакет. Вот как будет это выглядеть в коде:
Контекст адаптера приходящий в качестве параметра. Присвоим его своему типизированному указателю. Возвращаемый статус. Наш пакет – пока только указатель. Резервный указатель. Тип адаптера с которым будем работать. Размер типа адаптера.
Проверка наличия второго сетевого адаптера. Вверху я говорил, что его наличие необходимо предусматривать.
Проверка наличия и состояния.
Выделение места под размер полученного пакета (Pool) данных.
Собственно копирование всей служебной информации
Установка ее в наш внутренний буфер.
Перенос данных в сам пакет.
Копирование служебных данных по пересылке пакета. Копирование данных о типе адаптера, куда пересылать данные.
Собственно пересылка имеющихся данных в NDIS, что вызовет нормальное прохождение пакета далее по цепочке драйверов.
Если нет задержки на отсылке освободить пакет.
Это говорит об отсутствии пакета в системе – ничего не надо делать.
Возврат значения SUCCESS или код ошибки. Стоит остановиться еще на одном моменте. Когда система ответила, что посылка данных закончена кодом задержки пакета – NDIS_STATUS_PENDING. В этом случае мы пакет не освободим, блокировав таким образом всю систему NDIS по пересылке данных. Такое случается при посылке по медленной сети большого числа пакетов. Как нам освободить пакет? Система предусматривает такое и при освобождении ресурса после освобождению пакета вызовет функцию из группы протокола PtSendComplete. Смена на протокольную группу вызвана тем, что система получит сообщение от низлежащего драйвера, что вызывает обращение именно к этой группе. В данной функции, код которой идет следом мы увидим параметры в которых нам передадут контекст операции Send и адаптера, в результате чего мы получим возможность вызвать функцию NdisMSendComplete после NdisDprFreePacket и освободить NDIS для передачи нам следующих пакетов.
|
|
|