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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: NDIS Filter драйвер и отложенная обработка буферов, pppoe (wan)  (Прочитано 9470 раз)
0 Пользователей и 1 Гость смотрят эту тему.
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« : 11-01-2018 02:48 » 

Здравствуйте!
В продолжение темы драйвера RusRoute из репозитария на основе NDIS LightWeight Filter, пишу сетевой NDIS Filter драйвер для перехвата пакетов (сейчас это называется сетевые буфера), генерации своих сетевых буферов, их отправка или индикация приёма для Windows 8-10.
Пример NDIS LightWeight Filter из WDK ничего с пакетами не делает, поэтому работает.
Мне потребовалось организовать отложенную обработку пакетов поскольку обработка связана с перекладыванием пакетов между интерфейсами (routing+NAT) и для разгрузки CPU win32 приложения, вызывающего отправку пакетов. Для этого создал 2 системных потока уровня ядра - для очереди отправки и приёма.
Всё работает нормально на Ethernet'е.
Но, когда стал тестировать с pppoe подключением (разновидность wan) - система стала падать со статусом unexpected irq level в драйвере wan Майкрософт в NdisFIndicateReceiveNetBufferLists.
Системные потоки работают на PASSIVE_LEVEL. Ладно, думаю, повысю irql. Стал вызывать так:
Код: (C++)
                        KIRQL Old = KeGetCurrentIrql();
                        if (DISPATCH_LEVEL > Old)
                        {
                                KIRQL tmp, disp = DISPATCH_LEVEL;
                                //KfRaiseIrql(DISPATCH_LEVEL);
                                KeRaiseIrql(disp, &tmp);
                        }
                        RecvFlags = NDIS_RECEIVE_FLAGS_DISPATCH_LEVEL;

                        NdisFIndicateReceiveNetBufferLists(pInfo->m_pAdapt->FilterHandle, pnbl, NDIS_DEFAULT_PORT_NUMBER, N, RecvFlags);

                        KIRQL Irql = KeGetCurrentIrql();
                        if (Old < Irql)
                        {
                                KeLowerIrql(Old);
                        }
Заработало, но не долго. Ставлю Firefox'ом тесты на http://www.speedtest.net/ru - когда на первом запуске, когда - на третьем система виснет намертво. под отладчиком отобразил callstack:

- виснет в wanarp. В Интернете нашёл, что у многих проблемы с драйвером wan.
Куда дальше копать - не знаю. С моими спинлоками должно быть всё в порядке. Помогите...

* wanarp hangup.png (39.64 Кб - загружено 1174 раз.)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines