Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Обработка пакета  (Прочитано 5277 раз)
0 Пользователей и 1 Гость смотрят эту тему.
ppp
Гость
« : 30-11-2005 19:24 » 

Как после перехвата NdisRegisterProtocol и подмены ReceiveHandler получить весь пакет в новом обработчике newReceiveHandler?
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #1 : 01-12-2005 08:43 » 

так ты его и получишь целиком в своей функции PPRecieve (ProtocolRecieve или как ты там ее еще обозвал)  в виде:
INT PPReceivePacket
                     (
                        IN NDIS_HANDLE  ProtocolBindingContext,
                        IN PNDIS_PACKET  Packet
                     )

так вот параметр "IN PNDIS_PACKET  Packet" -- это и есть пакет!  Ага
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
ppp
Гость
« Ответ #2 : 01-12-2005 11:24 » 

Нет, в перехваченном NdisRegisterProtocol подменяется protocolCharacteristics->ReceiveHandler, этот ReceiveHandler получает параметры:
NDIS_HANDLE protocolBindingContext,
NDIS_HANDLE macReceiveContext,
PVOID pHeader,
UINT headerSize,
PVOID lookAheadBuffer,
UINT lookAheadBufferSize,
UINT packetSize.
Но этот ReceiveHandler может получить пакет не полностью (если lookAheadBufferSize > packetSize), вот тогда и надо как-то достать весь этот пакет. А как, я не знаю.
Записан
Kife
Помогающий

by
Offline Offline

« Ответ #3 : 01-12-2005 13:04 » 

АА, все, понял. смотри как я делаю:
NDIS_STATUS PPReceive
(
 IN NDIS_HANDLE ProtocolBindingContext,
 IN NDIS_HANDLE MacReceiveContext,
 IN PVOID HeaderBuffer,
 IN UINT HeaderBufferSize,
 IN PVOID LookAheadBuffer,
 IN UINT LookAheadBufferSize,
 IN UINT PacketSize
 )
{
    PADAPT            pAdapt = (PADAPT)ProtocolBindingContext;
    PNDIS_PACKET      MyPacket, Packet;
    NDIS_STATUS       Status = NDIS_STATUS_SUCCESS;
   BOOLEAN           bDecision;   
   /* Новые переменные  */
   BOOLEAN             Remaining;
   ULONG            MACAddrComp;
   ULONG            EncPayloadl;
   ULONG            UnEncPayloadl;
#define            szPayloadCopy   ETH_MAX_PACKET_SIZE
   char            PayloadCopy[szPayloadCopy];
   pEthHdr             pETH;
   PUCHAR            pUnencPayload   =   NULL;
   PUCHAR            pNewIPPayload = NULL;
   
   
   /*  Новый код*/
#ifdef DBG
   DbgPrint("TCR-VPN: >>>>>PPReceive \n");
#endif
   
    if ((!pAdapt->MiniportHandle) || (pAdapt->MiniportDeviceState > NdisDeviceStateD0))
    {
        Status = NDIS_STATUS_FAILURE;
    }
    else do
    {
        // Получим пакет
        Packet = NdisGetReceivedPacket(pAdapt->BindingHandle, MacReceiveContext);
        if (Packet != NULL)
        {
// РРР,  ВОТ ТУТ ВСЕГДА (ИМХО) ЦЕЛЫЙ ПАКЕТ!!! (ПО КРАЙНЕЙ МЕРЕ У МЕНЯ ВСЕ РАБОТАЕТ)
            //Приняли пакет. Получим данные:
         GetPktPayload(Packet,PayloadCopy,szPayloadCopy,&EncPayloadl);
         pETH = (pEthHdr)PayloadCopy;                      // Point to ethernet header.
         ETH_COMPARE_NETWORK_ADDRESSES_EQ(pETH->SrcMAC, pAdapt->MACAddress, &MACAddrComp);
И Т.Д.
Записан

_______
Да поможет нам F1,  и да сохранит нас F2 ...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines