Завершение отложенного пакета в NDIS IM

Тема в разделе "WASM.NETWORKS", создана пользователем lotos_od, 21 май 2007.

  1. lotos_od

    lotos_od New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Задача состоит в следующем: обработать (послать дальше или выбросить) 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. Я так подозреваю что ошибка в проектрировании а не в реализации, но вот где именно определить к сожалению не удалось.
     
  2. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Может стоит скопировать не только поинтер на пакет но и сам пакет с внутренностями ?
     
  3. lotos_od

    lotos_od New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Создаю копию пакета (в MiniportSendPackets) и сохраняю указатель на неё. История повторяется. %)
     
  4. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Тоесть при вызове DropPacket бсод не появляется, а при вызове MovePacketAhead появляется? Может быть проблема с NdisSend? У меня она тоже часто валилась, пока не догадался глянуть функцию ProtocolSendComplete :)
     
  5. lotos_od

    lotos_od New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    29
    Адрес:
    Ukraine
    Большое спасибо ntcdm. Благодаря тебе проблема решена.

    Как и сказал ntcdm состояла она в следующем: при вызове NdisSend NDIS дергает ProtocolSendComplete которая, в свою очередь, удаляет передаваемый пакет. Т.е. дальнейший вызов NdisMSendComplete происходит с указателем в никуда что и приводит к BSOD.

    Для решения нужно в NdisSend передавать указатель на копию пакета, аналогично тому как это делается в MiniportSendPackets.