Пробую использовать коммуникационные порты минифильтров для связи с USER MODE.
Пытаюсь реализовать следующее:
В первом потоке принимаю сообщения из драйвера с помощью FilterGetMessage и складывваю их всех в список для обработки во втором потоке, после обработки в третьем потоке отправляю ответ с помощью FilterReplyMessage.
С одним подключением к порту, похоже эта схема не работает. Так как в случае получения нового сообщения в 1-м потоке и одновременно отправке в 3 ответа на другое сообщение(полученное раньше). Получаю ошибку 0x801f0020 (No waiter is present for the filter's reply to this message. ERROR_FLT_NO_WAITER_FOR_REPLY ).
Пошел другим путем, подумал что можно к порту подключиться из 3-го потока 2-й раз и через второе подключение слать ответы( есть параметр у FltCreateCommunicationPort __in LONG MaxConnections который это задает). Но при 2-х подключениях, при попытке драйвером отослать сообщение, драйвер зависает на функции FltSendMessage, а с другой стороны ничего не приходит, в конечном итоге сиситтема потихоньку умирает.
Видимо я чего-то недопонимаю, мало информации в интернете по этой теме. Помоги советами плиз....
Здравствуйте, Alexey Frolov, Вы писали:
AF>Здравствуйте, chijo, Вы писали:
C>>Пробую использовать коммуникационные порты минифильтров для связи с USER MODE.
C>>Пытаюсь реализовать следующее:
C>>В первом потоке принимаю сообщения из драйвера с помощью FilterGetMessage и складывваю их всех в список для обработки во втором потоке, после обработки в третьем потоке отправляю ответ с помощью FilterReplyMessage.
C>>С одним подключением к порту, похоже эта схема не работает. Так как в случае получения нового сообщения в 1-м потоке и одновременно отправке в 3 ответа на другое сообщение(полученное раньше). Получаю ошибку 0x801f0020 (No waiter is present for the filter's reply to this message. ERROR_FLT_NO_WAITER_FOR_REPLY ).
C>>Видимо я чего-то недопонимаю, мало информации в интернете по этой теме. Помоги советами плиз....
AF>Покажите в коде как вы в драйвере отправляете сообщение? Может на самом деле не ждете ответа из юзермода
Не... Жду :
status = FltSendMessage( ScannerData.Filter,
&ScannerData.ClientPort,
notification,
sizeof(SCANNER_NOTIFICATION),
notification,
&replyLength,
NULL );
В одном потоке все работает....