Задача состоит в следующем: обработать (послать дальше или выбросить) NDIS пакет вне пределов MiniportSend и MiniportSendPackets. Пытаюсь решить следующим образом: 1. В MiniportSend и MiniportSendPackets сохраняю пакет (packet) и соответствующий ему адаптер (pAdapt) в списке и возвращаю NDIS_STATUS_PENDING 2. В ДДК нашел что для завершении запроса для которого было возвращено NDIS_STATUS_PENDING нужно вызывать NdisMSendComplete. Следовательно, когда в ходе дальнейшего выполнения принимается решение о том дропнуть пакет либо послать в NIC то реализуется это следующим образом: а) Дроп пакета: VOID DropPacket( .......... ) { PADAPT pAdapt; PNDIS_PACKET pPacket; //..................... // Получаем предварительно сохраненные значения пакета адаптера в pPacket и pAdapt соответственно //..................... NdisMSendComplete( ADAPT_MINIPORT_HANDLE(pAdapt), pPacket, NDIS_STATUS_FAILURE ); } б) Передача пакета в NIC VOID MovePacketAhead( ............ ) { PADAPT pAdapt; PNDIS_PACKET pPacket; NDIS_STATUS status; //..................... // Получаем предварительно сохраненные значения пакета адаптера в pPacket и pAdapt соответственно //..................... NdisSend(&status, pAdapt->BindingHandle, pPacket); if( status != NDIS_STATUS_PENDING ) { NdisMSendComplete( ADAPT_MINIPORT_HANDLE(pAdapt), pPacket, status ); } } Вот здесь то и возникает проблема. При вызове NdisMSendComplete появляется BSOD. Я так подозреваю что ошибка в проектрировании а не в реализации, но вот где именно определить к сожалению не удалось.
Тоесть при вызове DropPacket бсод не появляется, а при вызове MovePacketAhead появляется? Может быть проблема с NdisSend? У меня она тоже часто валилась, пока не догадался глянуть функцию ProtocolSendComplete
Большое спасибо ntcdm. Благодаря тебе проблема решена. Как и сказал ntcdm состояла она в следующем: при вызове NdisSend NDIS дергает ProtocolSendComplete которая, в свою очередь, удаляет передаваемый пакет. Т.е. дальнейший вызов NdisMSendComplete происходит с указателем в никуда что и приводит к BSOD. Для решения нужно в NdisSend передавать указатель на копию пакета, аналогично тому как это делается в MiniportSendPackets.