HELP! Как из драйвера вызвать функцию dll?
От: Andrew__S Россия  
Дата: 02.01.02 15:31
Оценка:
Подскажите, пожалуйста, как можно из драйвера под NT (.sys, kernel mode)
вызвать функцию dll (user mode) при уже загруженных виндах?
Если где-нибудь есть исходники программки-фильтра, буду очень признателен
за ссылку.
Спасибо.
Re: HELP! Как из драйвера вызвать функцию dll?
От: Alex Fedotov США  
Дата: 02.01.02 18:47
Оценка: 2 (1)
Здравствуйте Andrew__S, Вы писали:

AS>Подскажите, пожалуйста, как можно из драйвера под NT (.sys, kernel mode)

AS>вызвать функцию dll (user mode) при уже загруженных виндах?

Правильный ответ: никак. Нельзя из kernel-mode вызывать user-mode код.

Если ты хочешь из драйвера сообщить user-mode программе о каком-то событии, то у тебя есть выбор из двух вариантов:

1) Иметь объект события, доступный как в драйвере, так и в приложении. При возникновении события, драйвер переводит объект в signaled state, а приложение, соответственно, ждет на этом объекте.

Смотри также:

Q176415 Event.exe Shows How to Share and Signal an Event Object
http://support.microsoft.com/support/kb/articles/Q176/4/15.asp

2) Приложение посылает в драйвер ioctl посредством DeviceIoControl, который драйвер возвращает со статусом STATUS_PENDING. Когда происходит событие, драйвер завершает этот ioctl. Со стороны приложения это выглядит как длительная операция ввода/вывода.
-- Alex Fedotov
Re[2]: HELP! Как из драйвера вызвать функцию dll?
От: Andrew__S Россия  
Дата: 03.01.02 08:50
Оценка:
Поправьте, если ошибаюсь, скорее подходит первый вариант, т.к.
вызов должен быть именно из драйвера, и драйвер же должен дожидаться
возврата от приложения.

AF>Q176415 Event.exe Shows How to Share and Signal an Event Object

AF>http://support.microsoft.com/support/kb/articles/Q176/4/15.asp
Посмотрел.
Если и разберусь, то с трудом...
Если подскажите где лежит волшебный пример попроще, буду очень
признателен.



AF>1) Иметь объект события, доступный как в драйвере, так и в приложении. При возникновении события, драйвер переводит объект в signaled state, а приложение, соответственно, ждет на этом объекте.


AF>2) Приложение посылает в драйвер ioctl посредством DeviceIoControl, который драйвер возвращает со статусом STATUS_PENDING. Когда происходит событие, драйвер завершает этот ioctl. Со стороны приложения это выглядит как длительная операция ввода/вывода.
Re[2]: HELP! Как из драйвера вызвать функцию dll?
От: Andrew__S Россия  
Дата: 03.01.02 10:10
Оценка:
Забыл спросить:
как в драйвере в том же 'device control' дожидаться возврата от приложения?
Т.е. задача такая: послать буфер в приложение и, подождав пока приложение этот
буфер обработает, получить его обратно...

Спасибо.
Re: HELP! Как из драйвера вызвать функцию dll?
От: Andrew__S Россия  
Дата: 03.01.02 13:17
Оценка:
Здравствуйте Andrew__S, Вы писали:

AS>Подскажите, пожалуйста, как можно из драйвера под NT (.sys, kernel mode)

AS>вызвать функцию dll (user mode) при уже загруженных виндах?
AS>Если где-нибудь есть исходники программки-фильтра, буду очень признателен
AS>за ссылку.
AS>Спасибо.
Re[3]: HELP! Как из драйвера вызвать функцию dll?
От: Кривенко Антон Владимирович  
Дата: 03.01.02 14:28
Оценка: 6 (2)
Здравствуйте Andrew__S, Вы писали:

AS>Забыл спросить:

AS>как в драйвере в том же 'device control' дожидаться возврата от приложения?
AS>Т.е. задача такая: послать буфер в приложение и, подождав пока приложение этот
AS>буфер обработает, получить его обратно...

Например:

1. Драйвер выставил событие (общее для драйвера и приложения) в сигнальное состояние и заблокировал свое выполнение через внутреннее событие (KeWaitForSingleObject) — лучше не до беконечности ждать, т.к. приложение может и упасть, а прикинуть по максимуму, сколько приложению надо на ответ (например, 30 сек).

2. Приложение увидело событие и запросило у драйвера данные по событию (через IOCTL).

3. Драйвер получил запрос, обработал его (т.е. буфер ушел в приложение).

4. Приложение получило данные от драйвера, поменяло там что-то и отправило еще один запрос в драйвера.

5. Драйвер получил новые данные и выставил внутреннее событие в сигнальное состояние.

6. Поток, заблокированный в п.1 — разблокировался.

7. Если приложение упало, то через 30 сек все и так разблокируется.

Связано это с тем, что:

1. Драйвер не может ничего послать в приложение. Только наоборот или через shared memory, что ИМХО не лучший способ.

2. Обработчики IRP вполне реентерабельны (если сам драйвер их не блокирует).

Но это вариант "сходу". Т.е. требует двух IOCTL и т.п. Можно сделать пару событий и один IOCTL и синхронизовываться по ним. Можно один IOCTL, а в его обработчике считать вхождения. На каждое второе — разблокировать поток. Ну и т.п. Варианты есть. Возмодно где-то я ошибся, но в целом логика такая.
Re[4]: HELP! Как из драйвера вызвать функцию dll?
От: Andrew__S Россия  
Дата: 03.01.02 16:30
Оценка:
Спасибо.
Буду перебирать варианты:)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.