Невозможно использовать функции, связанные с NDIS, из пустого шаблона драйвера WDM Visual Studio.

Я пытался написать драйвер мини-порта NDIS и создал новый проект в своей установке VS2019, выбрав пустой драйвер WDM в качестве начального шаблона. Я могу включить ndis.h, но многие функции недоступны, включая такие важные вещи, как NDIS_MINIPORT_DRIVER_CHARACTERISTICS и NdisMRegisterMiniportDriver, которые нельзя использовать. Быстрый поиск их в реальном файле ndis.h показывает, что они выделены серым цветом в соответствии с директивой препроцессора #if NDIS_SUPPORT_NDIS6

У меня есть клонированный репозиторий образцов драйверов, и образец драйвера минипорта работает нормально, ничего не требует и использует ту же установку WDK. Глядя на конфигурацию между моим проектом и примерами, параметры в разделе «Настройки драйвера» совершенно разные. Я все еще довольно новичок во всем этом, поэтому я предполагаю, что это какая-то неправильная конфигурация с моей стороны. Есть ли что-то еще, что мне нужно отредактировать в конфигурации моего проекта? Единственное изменение, которое я пока сделал, убедившись, что компоновщик связывается с библиотекой NDIS. Возможно, шаблон драйвера WDM — это не то, что мне нужно для этого типа драйвера, хотя в этом случае я не уверен, как правильно настроить свой проект. В VS есть только один шаблон NDIS, предназначенный для драйверов фильтров.


person an earwig    schedule 07.08.2020    source источник
comment
Посмотрите вверху ndis.h, чтобы увидеть, какие определения препроцессора вам нужно установить.   -  person Luke    schedule 08.08.2020


Ответы (1)


Чтобы отображались все эти API, вам нужно установить версию NDIS, на которую вы ориентируетесь. Например, если вы нацелены на Windows 7 и более поздние версии, это будет NDIS 6.20, поэтому вы должны поместить это где-нибудь перед включением ndis.h:

#define NDIS620_MINIPORT 1

Это все, что вам нужно определить; ndis.h автоматически заполнит другие макросы управления версиями от вашего имени.

Чтобы увидеть список всех версий NDIS, посмотрите вверху файла ndis.h.

В общем, можно стучать по шаблону WDM или даже совершенно пустому файлу .C, пока он не станет драйвером NDIS. Если вы начинаете с нуля, убедитесь, что вы:

  • определить макрос версии NDIS, например /DNDIS620_MINIPORT=1 выше
  • скомпилировать с флагом /kernel
  • скомпилируйте с рекомендуемым набором флагов безопасности (который в настоящее время включает /GS /guard:cf /Qspectre, но, похоже, часто меняется, поэтому считайте, что этот ответ уже устарел)
  • ссылка на ndis.lib
  • добавить DriverEntry, который не касается DRIVER_OBJECT напрямую; пусть NdisMRegisterMiniportDriver сделает это вместо этого

Если вы используете общий шаблон WDM, обратите внимание, что вам придется заменить любой DriverUnload (у NDIS есть своя разновидность этого) и удалить любой AddDevice (NDIS обрабатывает это от вашего имени). Вы, вероятно, захотите удалить все, что упоминает IRP. Хотя NDIS позволяет вам обрабатывать IRP_MJ_DEVICE_CONTROL с помощью объекта управляющего устройства (CDO), созданного с помощью NdisRegisterDeviceEx, это не является строго необходимым, и многие мини-порты реального мира вообще не используют IRP.

Как только вы заполните все обратные вызовы, требуемые NdisMRegisterMiniportDriver, у вас будет скелет драйвера минипорта NDIS. Это ценное образовательное упражнение, и я рекомендую создавать драйвер с нуля, чтобы вы увидели, как все части складываются воедино. Но вам не обязательно делать это самостоятельно, если вы спешите. У нас есть образец минипорта здесь .

person Jeffrey Tippet    schedule 08.08.2020