Здравствуйте!
В продолжение темы драйвера 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. Стал вызывать так:
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.
Куда дальше копать - не знаю. С моими спинлоками должно быть всё в порядке. Помогите...