2medicus: Лучше вспомни, как почти вся Европа с 1939 по 1945 была товарищем по оружию для германского вермахта: шла в Ваффен СС, устраивала холокост, пекла снаряды для Третьего рейха. А с 1933 по 39 и позже англосаксонские корпорации вкладывали в индустрию Третьего рейха, "Форд" и "Дженерал Моторс" ставили там свои заводы. А 17 сентября 1939, когда советские войска вошли в Зап.Белоруссию и Зап.Украину (которые, между прочим, были ранее захвачены Польшей
подробнее ...
в 1920), польское правительство уже сбежало из страны. И что, по мнению комментатора, эти земли надо было вручить Третьему Рейху? Товарищи по оружию были вермахт и польские войска в 1938, когда вместе делили Чехословакию
cit anno:
"Но чтобы смертельные враги — бойцы Рабоче — Крестьянской Красной Армии и солдаты германского вермахта стали товарищами по оружию, должно случиться что — то из ряда вон выходящее"
Как в 39-м, когда они уже были товарищами по оружию?
Дочитал до строчки:"...а Пиррова победа комбату совсем не требовалась, это плохо отразится в резюме." Афтырь очередной щегол-недоносок с антисоветским говнищем в башке. ДЭбил, в СА у офицеров было личное дело, а резюме у недоносков вроде тебя.
Первый признак псевдонаучного бреда на физмат темы - отсутствие формул (или наличие тривиальных, на уровне школьной арифметики) - имеется :)
Отсутствие ссылок на чужие работы - тоже.
Да эти все формальные критерии и ни к чему, и так видно, что автор в физике остановился на уровне учебника 6-7 класса. Даже на советскую "Детскую энциклопедию" не тянет.
Чего их всех так тянет именно в физику? писали б что-то юридически-экономическое
подробнее ...
:)
Впрочем, глядя на то, что творят власть имущие, там слишком жесткая конкуренция бредологов...
драйвера, что вызывает обращение именно к этой группе.
В данной функции, код которой идет следом мы увидим параметры в которых нам передадут контекст операции 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);
Группа протокол.
Протокольные функции несколько отличаются от функций минипорта, но имеют схожую функциональную нагрузку, обратную функциям минипорта по направлению передачи пакетов.
PtOpenAdapterCompletePtCloseAdapterCompletePtBindAdapterPtUnbindAdapter
Функции работы с адаптером – в нашем случае адаптером является драйвер модема или сетевой карты. Адаптер соответственно при запуске надо открыть и при окончании работы – закрыть. При обращении к нему привязать (bind) адаптер, захватить ресурс. В конце работы – освободить.
PtResetComplete
Абсолютно пустая функция – она должна быть но мы сюда не приходим.
PtRequestComplete
Функция вызываемая из PtPnPNetEventSetPower.
PtStatus
Функция отвечающая за проверку статуса нижестоящего адаптера, вернее статуса взаимодействия с ним нашего уровня.
PtStatusComplete
Завершение в случае невозможности быстрого ответа, примерно как и в случае MPSend.
PtSendComplete
Описана в секции минипорт
PtTransferDataCompletePtReceivePtReceiveCompletePtReceivePacket
Функции работы с данными – аналогичны функциям минипорта. Одну из функций мы уже разбирали. Функции остальных – чуть позже.
PtUnload
Функция заведующая выгрузкой драйвера при выходе.
PtPNPHandlerPtPnPNetEventReconfigurePtPnPNetEventSetPower
Работа с 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);
break;
}
} while(FALSE);
return Status;
Выход с статусом завершения.
Некоторое пояснение.
Когда тип адаптера и сети специфичен и отличается от стандарта LAN, нам нужно сообщить о пакете и его отправке соответствующей части сервиса NDIS. Именно в связи с этим и появляется выбор типа адаптера. При получении возможно наличие одновременного запроса на прием пакета с разных адаптеров.
В случае с операцией Send этого не происходит, так как NDIS сама по контексту определяет к какому адаптеру предназначен пакет.
Оставшиеся функции аналогичны по назначению с группой функций минипорта.
Как писать драйвера (часть 5)
Итак, мы возвращаемся к драйверам.
Справедливости ради, стоит отметить, что на сайте эта тема – одна из самых популярных, так что, кому нужны более глубокие знания, может обращаться к нам на форум, там обсуждаются конкретные проблемы.
Сегодня мы поговорим о коммуникации программы с драйвером.
В одной из предыдущих статей описаны были функции типа Filter:
Вот они:
extern NTSTATUS FilterOpen(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
extern NTSTATUS FilterClose(IN
Последние комментарии
7 часов 34 минут назад
21 часов 28 минут назад
23 часов 1 минута назад
1 день 2 часов назад
1 день 2 часов назад
1 день 8 часов назад