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
|
|
« Ответ #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
|
|
« Ответ #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
|
|
« Ответ #6 : 23-05-2004 05:09 » |
|
Чтобы драйверу напрямую писать в память процесса, нужно, как минимум, переключить контекст процесса, загрузить селектор, а уж потом писать в память. Но! предположим, что в этот момент происходит прерывание, и другой драйвер делает те же самые вещи, не восстанавливая контекст твоего процесса... - вот один из подводных камней такого метода. А приложению всё равно придётся сообщать через event, что пришли данные - возвращаемся практически к первому методу.
А в ndisprot.h описывается интерфейс __между___драйверами__ протокола и ndis.
|
|
|
Записан
|
|
|
|
Strock
Гость
|
|
« Ответ #7 : 23-05-2004 09:01 » |
|
Не надо грязи. У меня все получилось. У меня есть структура для возврата, при приходе IOCTL'а с указателем на буфер ввода-вывода я образом RtlCopyBytes копирую в этот буфер содержимое структуры. И всё. Всё работает.
|
|
|
Записан
|
|
|
|
|