USBLexus
Опытный
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
Опытный
Offline
Пол:
Кот рыжий
|
|
« Ответ #3 : 08-12-2005 03:37 » |
|
А Event в ZwReadFile разве работает? В хелпе написано, что нет...
Да ну... 8| Серьезно чтоли...? Где написано? Щас повнимательнее посмотрю...
|
|
|
Записан
|
#define QUESTION(b) (2*b)||(!(2*b)) (c) William Shakespeare
|
|
|
USBLexus
Опытный
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
Опытный
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
Опытный
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
Опытный
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...
|
|
|
Записан
|
|
|
|
|