NDIS и драйвер минипорта

Я пытаюсь изменить драйвер Ethernet с помощью инструментов WDK, представленных в Visual Studio 2012.

Образцы, представленные в WDK, включают, среди прочего, «адаптер мини-порта» и «облегченный фильтр NDIS». Я все еще в самом начале написания драйверов, и поэтому мне сложно ориентироваться в коде.

Я смог установить адаптер мини-порта после его создания в Visual Studio 2012 [Отображается как «Виртуальный адаптер мини-порта Microsoft» в моем списке сетевых адаптеров.] Я также могу назначить ему IP-адрес и маску подсети. [Я узнал что это не подключается ни к какому физическому устройству на моем ПК].

Я также настроил программное обеспечение «Отладка», чтобы проверять сообщения драйвера от моего адаптера. [Я использовал операторы «DbgPrint» в коде, а затем построил его.] Но сообщения отладки печатаются повторно.

1- Почему сообщения печатаются снова и снова? Сообщения взяты из файла 'datapath.c' программы и из функции 'MPSendNetBufferLists'. ['Net Buffer' определяет данные, отправленные или полученные по сети.]

2- Я настраиваю Wireshark для захвата данных на адаптере, и он показывает, что от него исходят запросы от ARP, HTTP, SSDP, MDNS и т. Д. Я не могу понять, что на самом деле говорит с адаптером? и как я могу остановить его от разговора?

Я могу использовать «ping», чтобы увидеть, есть ли соединение с IP-адресом, который я назначил адаптеру, и он отвечает успешно, сообщая, что все пакеты были отправлены и потери пакетов не было.

Моя цель - отправлять и получать пакеты данных через IP-адрес на этот адаптер Ethernet. т.е. я хочу, чтобы приложение подключалось к IP-адресу, назначенному адаптеру, и разговаривало с ним.

3- Могу ли я сделать это с образцами, представленными в WDK?

Любые другие предложения или советы приветствуются.

PS- я не смог использовать отладчик Windows, встроенный в Visual Studio 2012. Я использовал 2 ПК и смог подключиться и установить драйвер на «целевой» ПК, но ничего не мог сделать с точками останова и т. д. Код и Программа просто ничего не делала после установки драйвера на «целевой» ПК. Любые предложения по этому поводу? Я думал, что смогу также выполнять пошаговую отладку драйверов. [Я знаю, что ошибаюсь].

Спасибо, Адитья.


person Aditya Tantry    schedule 29.06.2012    source источник


Ответы (1)


Драйверы минипорта NDIS, как и многие низкоуровневые драйверы, предназначены для взаимодействия с оборудованием. Ответственность минипорта состоит в том, чтобы принимать отправляемые пакеты от ОС, преобразовывать их в любой формат, требуемый аппаратным обеспечением, и давать указание аппаратному обеспечению отправить пакет по сети.

WDK мог (и фактически имел обыкновение) включать образец реального драйвера, который отправляет пакеты на реальном оборудовании. Но это приводит к некоторой путанице, поскольку реальным драйверам приходится иметь дело с большим количеством специфичных для аппаратного обеспечения деталей, которые отвлекают от основного смысла примера. Если вы начинаете с реального драйвера, первое, что вам нужно сделать, это идентифицировать все биты, специфичные для оборудования, и вырвать их, чтобы вы могли заменить их своими собственными битами, специфичными для оборудования.

Вместо этого образец «netvmini» в WDK является поддельным драйвером. Это означает, что он притворяется, что у него есть настоящее оборудование, но на самом деле все это ложь. Когда ОС отправляет пакеты на netvmini, драйвер netvmini просто передает эти пакеты на любые другие адаптеры мини-порта netvmini, установленные на этом компьютере. (По сути, установка двух адаптеров netvmini на одном компьютере имитирует то, что произошло бы, если бы у вас было два реальных адаптера, подключенных к одному и тому же концентратору Ethernet.) Таким образом, в ASCII-арте это происходит, если вы устанавливаете два адаптера netvmini в одной системе. :

       TCPIP                       TCPIP                      TCPIP
         |                           |                          |
Real physical miniport        Your netvmini #1           Your netvmini #2
         |                           \                          /
   [The Internet]                     [The netvmini virtual hub]

Как мы надеемся, иллюстрирует ASCII-арт, ваши адаптеры netvmini не имеют никакого пути к Интернету. Таким образом, ваш драйвер не получит «настоящий» IP-адрес, который может маршрутизироваться в Интернет, пока вы не добавите информацию о своем оборудовании. До тех пор Windows будет просто пытаться отправлять ARP и HTTP-запросы, которые никуда не уйдут.

Чтобы ответить на ваши конкретные вопросы:

  1. Сообщения из MPSendNetBufferLists печатаются каждый раз, когда ОС пытается отправить пакет. Поскольку ОС считает, что у вас есть реальное сетевое соединение, она предпримет несколько попыток его использовать. В конце концов, это должно немного успокоиться, когда все придут к выводу, что это бесполезная ссылка.

  2. Запросы поступают от TCPIP. Если вы не хотите, чтобы TCPIP отправлял данные, отвяжите его от адаптера.

  3. Вы можете определенно отправить данные на адаптер. На самом деле, вы заметили, что вы уже отправляете случайные HTTP-пакеты и т. д. Но данные на самом деле не попадут в Интернет, пока вы не научите драйвер общаться с вашим реальным оборудованием.

Если вы сидите и думаете: «Но у меня нет оборудования!», то вы можете создать какой-нибудь виртуальный минипорт. Виртуальные мини-порты похожи на netvmini в том смысле, что у них нет реального оборудования, но у них все же есть какой-то способ получить пакеты с машины. Например, мини-порты VPN, работающие на уровне 2 (например, L2TP), обычно устанавливают второй драйвер, драйвер протокола NDIS, который отправляет и получает данные из «настоящего» физического мини-порта. Затем виртуальный минипорт взаимодействует со своим протоколом всякий раз, когда ему нужно получить пакеты от машины. Результат:

        TCPIP
          |
  Your virtual miniport
          |
   Your NDIS protocol
          |
The real physical miniport
          |
     The Internet

Существуют альтернативные архитектуры; например, VPN, работающая на уровне 4 (например, SSTP), может решить открыть сокет WSK вместо реализации драйвера протокола NDIS:

        TCPIP
          |
  Your virtual miniport
          |
      WSK socket
          |
        TCPIP
          |
The real physical miniport
          |
     The Internet
person Jeffrey Tippet    schedule 29.06.2012
comment
Дорогой Джеффри. Похоже, мне нужно много читать! Спасибо за прояснение некоторых вещей. Любые учебные пособия, на которые я могу ссылаться при создании драйверов Ethernet? В настоящее время просматриваю документы msdn и документы osronline. - person Aditya Tantry; 30.06.2012
comment
Я полагаю, это зависит от вашего стиля обучения. Лично я учусь, делая (обычно неправильно, по крайней мере, первые несколько раз...). Netvmini и примеры ndislwf — отличная отправная точка для экспериментов. Если вы предпочитаете книги, есть пара хороших книг по WDF, и книга по TCPIP никогда не помешает. Наконец, в MSDN есть тонны информации о NDIS; вам просто нужно быть достаточно методичным, чтобы найти все это. - person Jeffrey Tippet; 30.06.2012
comment
Еще раз спасибо за руководство. Я концентрировался на этих двух водителях почти неделю. Надеясь охватить больше земли и использовать ее в ближайшее время. - person Aditya Tantry; 30.06.2012
comment
старая тема, но отличное объяснение :) - person Dan; 02.10.2014