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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как прикрутить event к ZWReadFile?  (Прочитано 11587 раз)
0 Пользователей и 1 Гость смотрят эту тему.
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« : 07-12-2005 03:33 » 

Как я понимаю ZWReadFile в поле Event получает HANDLE на event а у меня есть объект типа KEvent как получить его Handle?
Читал что есть такая функция ZwCreateEvent но у меня в DDK ее почему то нет.
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
ILIS
Гость
« Ответ #1 : 07-12-2005 10:50 » 

Почему же...
Вот обьявление в ддк:

NTSTATUS
  ZwCreateEvent(
    OUT PHANDLE  EventHandle,
    IN ACCESS_MASK  DesiredAccess,
    IN POBJECT_ATTRIBUTES  ObjectAttributes OPTIONAL,
    IN EVENT_TYPE  EventType,
    IN BOOLEAN  InitialState
    );
Записан
id3210
Гость
« Ответ #2 : 07-12-2005 12:12 » 

А Event в ZwReadFile разве работает? В хелпе написано, что нет...
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #3 : 08-12-2005 03:37 » 

А Event в ZwReadFile разве работает? В хелпе написано, что нет...
Да ну... 8|
Серьезно чтоли...? Где написано? Щас повнимательнее посмотрю...
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #4 : 08-12-2005 03:41 » 

Да вроде должен работать...

DDK:

Event
Specifies an optional handle for an event to be set to the signaled state after the read operation completes. Device and intermediate drivers should set this parameter to NULL.

ZwReadFile notifies the driver of I/O completion by means of an event created by the driver.
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #5 : 08-12-2005 05:32 » 

Создал event с помощью IoCreateNotificationEvent она выдает сразу и HANDLE eventa и указатель на него только он почемуто не срабатывает...
Поток останавливается на WaitForSingleObject и стоит на нем а event не взводится
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
ILIS
Гость
« Ответ #6 : 08-12-2005 08:56 » 

Драйвер может передавать event в функцию, только в контексте определенного потока, в другом случае для асинхронного чтения нужно открыть файл с  DesiredAccess = SYNCHRONIZE, и ждать на FileHandle после ZwReadFile
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #7 : 08-12-2005 09:29 » 

>>Драйвер может передавать event в функцию, только в контексте определенного потока

Насчет этого все Ok Чтение идет в контексте одного потока в этом же контексте создается HANDLE eventа, в этом же он и уничтожается.

>> в другом случае для асинхронного чтения нужно открыть файл с  DesiredAccess = SYNCHRONIZE, и ждать на FileHandle после ZwReadFile

А вот это уже интересно... у тебя нету случайно примера с подобным приемом? Кроме DesiredAccess = SYNCHRONIZE нужно еще чтонибудь ставить FILE_SYNCHRONOUS_IO_ALERT например?

Интересно как можно использовать hFile в WaitForMultypleObjects - ведь ему нужен указатель а не хэндл а в данном случае я могу предложить только FileObject
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
ILIS
Гость
« Ответ #8 : 08-12-2005 12:44 » 

>>А вот это уже интересно... у тебя нету случайно примера с подобным приемом? Кроме DesiredAccess = SYNCHRONIZE нужно еще чтонибудь ставить FILE_SYNCHRONOUS_IO_ALERT например?

только SYNCHRONIZE, FILE_SYNCHRONOUS_IO_ALERT делает оперцию синхронной

>>Интересно как можно использовать hFile в WaitForMultypleObjects - ведь ему нужен указатель а не хэндл а в данном случае я могу предложить только FileObject

typedef void* HANDLE; - чем не указатель?
Записан
id3210
Гость
« Ответ #9 : 09-12-2005 07:28 » 

     ObReferenceObjectByHandle(DE->FileHandle1,
                          IRP_MJ_READ,
                        NULL,
                        KernelMode,
                        &DE->FileObject2,
                        NULL);
   KeWaitForSingleObject(&DE->FileObject2->Event,
               Executive,
               KernelMode,
               FALSE,
               NULL);
   ObDereferenceObject(DE->FileObject2);

У меня работает так. Без Synchronize
Записан
USBLexus
Опытный

ru
Offline Offline
Пол: Мужской
Кот рыжий


« Ответ #10 : 09-12-2005 07:35 » 

id3210

Хм.. интересно..

В твоем пример DE->FileObject2->Event взводится когда завершено чтение из файла?
Записан

#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
id3210
Гость
« Ответ #11 : 09-12-2005 07:42 » 

Да, этот код идет после ZwReadFile
Записан
id3210
Гость
« Ответ #12 : 09-12-2005 07:45 » 

Наверное, можно пользоваться ссылкой на Event...
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines