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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: ZwWriteFile в KMD  (Прочитано 8220 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
SergeS
Гость
« : 09-07-2004 22:53 » 

Стоит задача в драйвере Filter вести log Read/Write и при этом сохранять всё из Kernel Mode, без помощи User Mode программы.
Распределение Read/Write я получаю в IRQL==DISPATCH_LEVEL,
копирую всё в буфер, а вот чтобы сохранить буфер при достаточном накоплении мне нужно использовать ZwWriteFile, которая должна вызываться при IRQL==PASSIVE_LEVEL.
Может кто с подобным сталкивался и сможет подсказать оптимальное решение.
Записан
Amun Shu
Гость
« Ответ #1 : 10-07-2004 07:26 » 

Хм... DPC рюхай - он для этого и был придуман если не ошибаюсь...
Записан
SergeS
Гость
« Ответ #2 : 10-07-2004 10:38 » 

Цитата: Amun Shu
Хм... DPC рюхай - он для этого и был придуман если не ошибаюсь...


Я бы порюхал, но если я не ошибаюсь DPC процедуры вызываются когда IRQL падает до DISPATCH_LEVEL, а не до PASSIVE_LEVEL.
Записан
maaaaaad
Гость
« Ответ #3 : 11-07-2004 08:16 » 

поток на PASSIVE, и синхронизация эвентом (к shared ring buffer логгера) DPC и потока на PASSIVE, я уже раза 3 видел что так действительно делают.


maaaad
Записан
maaaaaad
Гость
« Ответ #4 : 11-07-2004 08:19 » new

и никак иначе похоже это больше не решается
Записан
SergeS
Гость
« Ответ #5 : 11-07-2004 19:08 » 

Цитата: maaaaaad
поток на PASSIVE, и синхронизация эвентом (к shared ring buffer логгера) DPC и потока на PASSIVE, я уже раза 3 видел что так действительно делают.


maaaad


Thanks, может так и сделаю, а ещё попробую IoQueueWorkItem. Я так понял, что этой функцией можно поставить в очередь процедуры, которые нужно выполнить в PASSIVE_LEVEL. Получается что-то на подобие DPC. Поскольку Callback routine будет вызвана в отдельном системном контексте, MSDN пишет: "Drivers must not permanently reserve a work item for the driver’s use. Work items are designed for operations that complete quickly".  Ну если quickly тогда я предполагаю, что вызывать ZwWriteFile нужно асинхронно.
Но вот интересно как ZwWriteFile работает,
 если:
1. копирует мой буфер в свой
2. возвращает мне управление
3. сохраняет свой буфер в файл.
Вот так вроде бы и нормально.

Но не может ли быть, что она:
1. берет указатель на мой буфер
2. возвращает мне управление
3. сохраняет мой буфер в файл.
При таком раскладе асинхронное сохранение может породить множество проблем.

Кто знает каким способом работает ZwWriteFile в асинхронном режиме?
Записан
TarasCo
Гость
« Ответ #6 : 13-07-2004 07:06 » 

1)
Нормальным ходом будут создание своего потока, занятого записью лога на диск.  Также понадобитмся некоторый контейнер для данных ("труба") для обмена между процедурой, выполняемой на DISPATHC_LEVEL и вашим потоком. Контейнер придется защитить (с помощью спинлоков).  Использование своего потока по сравнению с системным рабочим кажется мне более предпочтительным.

2)Как работает ZwWriteFile
Все зависит от флагов, с которыми был открыт файл - драйвер может использовать промежуточный буфер, может не использовать (см. FILE_NO_INTERMEDIATE_BUFFERING). В любом случае, ничего делать с буфером до окончания операции  нельзя (неважно синхронно или асинхронно она выполняется). В этой связи, опять же отмечу преимущество отдельного потока - используйте в нем синхронную запись и не партесь Улыбаюсь
Записан
SergeS
Гость
« Ответ #7 : 14-07-2004 18:01 » 

Спасибо за исчерпывающий ответ.
Я уже сделал с использованием системного рабочего потока,
вроде бы всё работает хорошо.
Но если Вы считаете, что использование своего потока более предпочтительно, я сделаю второй вариант драйвера, как Вы советовали.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines