Как я могу отправлять произвольные пакеты с драйвером фильтра NDIS?

В настоящее время я пытаюсь отправить свои собственные пакеты с драйвером фильтра NDIS из примеры драйверов Windows.

Я думаю, что мне нужно отправлять пакеты с помощью функции FilterSendNetBufferLists. Но я не знаю, как создавать эти пакеты и следует ли мне добавлять их в существующий NetBufferList или создавать свой собственный.

Нужно ли мне также изменять функцию FilterSendNetBufferListsComplete?


person Gigliotti    schedule 27.07.2020    source источник


Ответы (1)


  1. Когда ваш драйвер запускается (DriverEntry) или когда ваш фильтр подключается к мини-порту (FilterAttach), выделяйте пул NET_BUFFER_LIST (NBL) с помощью NdisAllocateNetBufferListPool. Для типичного использования вам потребуется автоматически получать один NET_BUFFER (NB) с каждым NBL, поэтому установите fAllocateNetBuffer=TRUE. Если вы хотите, чтобы NDIS выделила для вас буферы полезной нагрузки данных, также укажите ненулевое значение DataSize. Если у вас уже есть полезная нагрузка пакета в каком-то другом буфере, вы можете передавать быстрее, указав NB на существующий MDL, но это также более сложно для кодирования.
  2. Чтобы отправить пакет, выделите новый NBL из NdisAllocateNetBufferAndNetBufferList. Поместите свой FilterModuleHandle в NBL->SourceHandle. Назначьте NB-›DataLength и скопируйте данные. Вызовите NdisFSendNetBufferLists на вашем новом NBL. Не прикасайтесь к NBL, пока он не будет возвращен вам.
  3. В конце концов, NDIS вернет вам NBL через FilterSendNetBufferListsComplete. Обратите внимание, что все NBL входят в этот беспорядочный связанный список — как ваши собственные NBL, так и любые NBL, через которые вы только что прошли сверху. Таким образом, вы должны нарезать связанный список на основе NBL->SourceHandle: если SourceHandle ваш, выньте NBL из потока и освободите его через NdisFreeNetBufferList. В противном случае, если NBL не принадлежит вам, продолжайте распространять его, вызывая NdisFSendNetBufferListsComplete.
  4. Не позволяйте FilterPause завершиться, пока все созданные вами NBL не будут возвращены вам. Вы можете сделать это любым удобным для вас способом, но обычный подход заключается в добавлении некоторого подсчета ссылок к путям send и sendcomplete. Вам не нужно беспокоиться о каких-либо NBL, которые вы не создавали.

Когда вы создаете NBL, вы можете использовать !ndiskd.nbl для перепроверки своей работы. Он может обнаруживать различные ошибки. Вероятна проблема с NBL, если ndiskd сообщает о каком-либо поле красным текстом.

person Jeffrey Tippet    schedule 28.07.2020
comment
Я выделил NBL-пул в функции FilterAttach (см. pastebin.com/MJCVHYwv) MyFilterHandle — глобальная переменная типа NDIS_HANDLE (поэтому у меня есть доступ к нему позже). 1. Теперь мне нужно изменить функцию FilterSendNetBufferLists. Вы сказали, что поэтому я должен использовать функцию NdisAllocateNetBufferAndNetBufferList. Я не уверен в параметрах, которые нужно туда вставить. Первый параметр — это NDIS_HANDLE, который я сохранил в глобальной переменной MyFilterHandle. А как насчет MdlChain типа PMDL? У меня еще нет MdlChain. Как его создать? - person Gigliotti; 29.07.2020
comment
2. Почему мне нужно дважды устанавливать NDIS_HANDLE? Я уже передал MyFilterHandle в функцию NdisAllocateNetBufferAndNetBufferList. Почему мне нужно установить SourceHandle возвращенного NBL? - person Gigliotti; 29.07.2020
comment
2. Очевидная избыточность заключается в поддержке более сложных приемов, таких как выделение NBL для одного стека мини-портов, но перенаправление их на другой мини-порт. - person Jeffrey Tippet; 31.07.2020
comment
1. Если вы укажете ненулевое значение DataSize для NANBLP, вы получите MDL бесплатно, поэтому вам не нужно указывать его для NANBANBL. И тогда последний аргумент будет 0. - person Jeffrey Tippet; 31.07.2020
comment
Спасибо за ваш ответ. Я пытался следовать вашим инструкциям, но, к сожалению, у меня все еще есть проблемы в моем коде (pastebin.com/f4RJeyj2) . В настоящее время синий экран появляется во время установки драйвера. Можете ли вы помочь мне с этим? Я хотел протестировать отправку пустых пакетов, как вы можете видеть в коде. Это проблема? Должны ли пакеты иметь содержимое? - person Gigliotti; 02.08.2020
comment
Обновление: я обнаружил, что MyFilterHandle имеет значение NULL, хотя я установил его в функции FilterAttach. Я исправил эту ошибку. Но, к сожалению, отправка по-прежнему не работает, и я попадаю в синий экран (KERNEL_SECURITY_CHECK_FAILURE). - person Gigliotti; 03.08.2020
comment
Вам нужно будет освоиться с отладчиком ядра — это не будет последним синим экраном, который вы получите. Технически незаконна отправка 0-байтового NBL через Ethernet; сетевому адаптеру требуется как минимум заголовок Ethernet, а для Ethernet требуется минимум 64 байта. В лучшем случае сетевая карта игнорирует ваши пакеты, в худшем — дает сбой. Один определенный сбой связан с тем, что вы вызываете NdisFSendNetBufferListsComplete для NetBufferLists, который, возможно, уже был перенаправлен и освобожден. - person Jeffrey Tippet; 04.08.2020