Что это за обработчик IRP, который передает полученные пакеты пользовательскому процессу в Windows?

#windows #winapi #device-driver

#Windows #winapi #драйвер устройства

Вопрос:

Как мы знаем, ядро Windows управляется IRP (пакетом запроса ввода-вывода),

когда мы запрашиваем веб-страницу (или что-либо еще), сетевой адаптер получает IRP, что это за IRP на самом деле?

Комментарии:

1. Это зависит. В запросе веб-страницы задействовано множество драйверов. Вы наложены поверх afd.sys, tcpip.sys, ndis.sys ? Каждый из них получает свой набор IRP. Что вы пытаетесь сделать?

2. Я пытаюсь разобраться во всех деталях этого процесса.

Ответ №1:

Смотрите страницу Компоненты стека TCP / IPWindows для получения списка компонентов, которые участвуют в таком запросе.

Модель драйвера NDIS скрывает IRP, который передается по кругу, и предоставляет компонентам функции обратного вызова для проверки / пересылки / изменения содержимого запросов отправки / получения.

Комментарии:

1. Как изменить содержимое с помощью обратного вызова NDIS?

2. Например, вызывается ваша функция FilterReceiveNetBufferLists , и теперь вы можете изменить содержимое NET_BUFFER или создать новый NET_BUFFR и передать это следующему уровню.

3. есть ли какое-нибудь руководство о том, как изменить содержимое в FilterReceiveNetBufferLists ?

4. Вы должны посмотреть образцы в WDK. Я действительно не могу сказать вам, что делать, когда у вас нет реальной цели. Вы хотите изменить содержимое полученных пакетов? Вы хотите добавлять / удалять пакеты. (Брандмауэр? Минипорт? …) Это ссылка на страницу msdn.

5. Я хочу изменить содержимое полученных пакетов, но не могу найти рабочий пример того, как изменить содержимое в FilterReceiveNetBufferLists

Ответ №2:

Сетевой накопитель — это платформа NDIS, которая не получает IRP от драйвера протокола (Tcpip.sys ); вместо этого он экспортирует указатели на функции для вызова драйвера протокола.

Пожалуйста, обратитесь к MSDN, посвященному инициализации драйвера минипорта и стеку драйверов NDIS.

В XP / 2k3 / 2000: IRPs происходит на более высоком сетевом уровне с использованием платформы TDI; а именно AFD.SYS отправляет TDI IoControl в Tcpip.sys. AFD — это клиент TDI, который реализует Winsock, отправляя IRP на Tcpip.sys.

В Vista и более поздних версиях: TDI устарел, и, если я правильно догадываюсь, AFD.SYS использует ядро WinSock для связи с Tcpip.sys. Нет IRP.

Хотя TDI в Vista не рекомендуется, если вы установите клиент или фильтр TDI, TDX.SYS будет загружен и эмулирует для вас платформу TDI (также через ядро WinSock). В этом случае мы по-прежнему видим IRP-запросы TDI от TDI-client —(TDI)—> TDX —(WSK)—> TCPIP.