![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Draeden |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Требуется написать драйвер со следующей функциональностью:
1. Запись в файл времени начала работы системы, а также момента её выключения. 2. Показывать текущее время с момента запуска системы по нажатию определённой комбинации клавиш. Возникает пара вопросов: 1. Код
вызывает #PF, видимо здесь элементарная ошибка, но я её не вижу. 2. Как решить вторую задачу ? В WinAPI это делалось через RegisterHotKey, а в режиме ядра ? |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 1 Всего: 32 |
А что такое "#PF" ? Это сишное AV ? В "обычном" приложении код работает ? P.S. Кстати, по нему (приведенному коду) ничего не понять, ибо его просто нет |
|||
|
||||
| Draeden |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
( #PF - Page Fault ( этакий аналог Access Violation в юзерском режиме ) )
Исправляюсь
Здесь уже не используется ZwQueryInformationFile а вызывается сразу ZwWriteFile с целью записать данные в конец файла. Однако последний возвращает STATUS_INVALID_PARAMETER. Кстати говоря, открытый драйвером файл нельзя открыть ещё раз ( например в explorer ): выдаёт сообщение, что файл занят другим процессом, хотя при открытии я указал атрибут FILE_SHARE_READ. |
|||
|
||||
| Draeden |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
DDK говорит, что "The driver's IoTimer routine is called at IRQL = DISPATCH_LEVEL", при этом "Callers of ZwWriteFile must be running at IRQL = PASSIVE_LEVEL".
Походу дело глухо... Мне надо записывать в файл из обработчика таймера с чрезмерно высоким IRQL :( P.S. Любопытно, но в DOS примерно та же борода: при IRQ 0 блокируется APIC 0 и невозможно писать на диск Это сообщение отредактировал(а) Draeden - 8.7.2008, 10:08 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Угу, смотри в сторону DPC (IoInitializeDpcRequest, IoRequestDpc) |
|||
|
||||
| Riply |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Комодератор Сообщений: 572 Регистрация: 27.3.2007 Где: St. Petersburg Репутация: 1 Всего: 32 |
Предупреждаю сразу: я с драйверами "на Вы" (ни одного не написала), но попробовала бы открывать файл с такими параметрами: ZwCreateFile(..., FILE_WRITE_DATA or FILE_WRITE_ATTRIBUTES or SYNCHRONIZE, ..., FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ, FILE_OPEN_IF, FILE_NON_DIRECTORY_FILE or FILE_SYNCHRONOUS_IO_NONALERT, ...); |
|||
|
||||
| Draeden |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
С этими флагами код работает ровно до того же момента: момента вызова ZwWriteFile из функции обработки таймера и соответсвенно #PF.
Кстати, хотя ZwCreateFile завершается успешно, он выдаёт интересный дескриптор файла: 0x80000718, какой то он неправильный...
Разве это решит проблему ? Ведь моя процедура DPC всё равно будет вызвана при IRQL = DISPATCH_LEVEL, т.е. на том же уровне, что и процедура обработки таймера... |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Ну тогда KeInsertQueueDpc:
|
||||||
|
|||||||
| Draeden |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 22 Регистрация: 7.7.2008 Репутация: нет Всего: нет |
Не помогло ( как IoInitializeDpcRequest так и KeInitializeDpc ).
Лог SoftICE: ( см. прикреплённый файл ) Код драйвера:
Всё работает так, как описано в документации, вот только IRQL всё равно равен 2 :( Это сообщение отредактировал(а) Draeden - 14.7.2008, 17:42 Присоединённый файл ( Кол-во скачиваний: 8 )
dpc.jpg 28,93 Kb |
|||
|
||||
| xvr |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 40 Всего: 223 |
Увы, тогда только создавать отдельную kernel нитку (см PsCreateSystemThread) и ждать в ней события, которое выставлять в обработчике таймера. |
||||
|
|||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |