Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: UserApplication -> Driver (IOCTL)  (Прочитано 10098 раз)
0 Пользователей и 1 Гость смотрят эту тему.
UfologP
Гость
« : 31-03-2004 20:52 » 

Вот не знаю как это можно реализовать. По идее через DeviceIoControl. Второй параметр этой функции - коды IOCTL. Но в ДДК я не нашёл никаких подходящих,- мне надо для NDIS, а там какая-то мура, не более того. Как же это всё таки делать, и можно ли создавать свои IOCTL. Если можно, то как? И что лучше - обращаться приложением к драйверу или драйвером к приложению, если использовать несколько расширенный passthru для фильтрации пакетов?
Записан
Strock
Гость
« Ответ #1 : 10-05-2004 09:28 » 

У меня тот же вопрос... Пишу вот NDIS Intermediate Driver для фильтрации сетевого траффика, надо бы этим самым драйвером как-то рулить... А как?

P.S. Юзаю Numega DriverStudio 3
Записан
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 19-05-2004 14:17 » 

Так можно определить свои IOCONTROL коды:

#define MYDRV_CtlCode( x ) CTL_CODE ( FILE_DEVICE_UNKNOWN, 0x800 + ( x ), METHOD_BUFFERED, FILE_ANY_ACCESS )

Далее

#define MYDRV_CTL_GET_VERSION MYDRV_CtlCode( 0 )
#define MYDRV_CTL_GET_XXXXXX MYDRV_CtlCode( 1 )
....

А насчёт NDIS-вопрос не корректен...
Записан
Strock
Гость
« Ответ #3 : 20-05-2004 18:54 » 

Мда. Согласен, конечно. От NuMeg'и я уже отказался. Теперь у меня вопрос другой: как мне выдать инфу от драйвера приложению? Что-то не получаецца по указателю, который я отдаю в DeviceIoControl чего-нить записать... В чем тонкость?
Записан
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 21-05-2004 15:32 » 

Есть kernel mode, а есть user mode. Между ними простой связи нет.
Один из вариантов решения - создать event в user mode, открыть его (по хандлеру, переданному через IO Control) в driver mode и, по приходу каких-то данных в кернеле, которые нужно передать в приложение, установить event в signalled state. На этом event'е висит в твоём приложении поток, и, когда он срабатывает, через IO Control берёт данные из буфера драйвера.

Пример (исходный текст) есть в Интернете. Скачивал, возможно, с codeguru или codeproject.
Записан
Strock
Гость
« Ответ #5 : 22-05-2004 08:12 » 

Че-та сложновато звучит... Вроде, в ndisprot'е было проще, с передачей указателя на структуру, да и все...
Записан
maa
Участник

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 23-05-2004 05:09 » 

Чтобы драйверу напрямую писать в память процесса, нужно, как минимум, переключить контекст процесса, загрузить селектор, а уж потом писать в память. Но! предположим, что в этот момент происходит прерывание, и другой драйвер делает те же самые вещи, не восстанавливая контекст твоего процесса... - вот один из подводных камней такого метода. А приложению всё равно придётся сообщать через event, что пришли данные - возвращаемся практически к первому методу.

А в ndisprot.h описывается интерфейс __между___драйверами__ протокола и ndis.
Записан
Strock
Гость
« Ответ #7 : 23-05-2004 09:01 » 

Не надо грязи. У меня все получилось. У меня есть структура для возврата, при приходе IOCTL'а с указателем на буфер ввода-вывода я образом RtlCopyBytes копирую в этот буфер содержимое структуры. И всё. Всё работает.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines