Использование FltCreateCommunicationPort
От: chijo Россия  
Дата: 27.07.10 14:54
Оценка:
Пробую использовать коммуникационные порты минифильтров для связи с 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, а с другой стороны ничего не приходит, в конечном итоге сиситтема потихоньку умирает.

Видимо я чего-то недопонимаю, мало информации в интернете по этой теме. Помоги советами плиз....
Re: Использование FltCreateCommunicationPort
От: Alexey Frolov Беларусь  
Дата: 27.07.10 15:17
Оценка:
Здравствуйте, 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>Видимо я чего-то недопонимаю, мало информации в интернете по этой теме. Помоги советами плиз....

Покажите в коде как вы в драйвере отправляете сообщение? Может на самом деле не ждете ответа из юзермода
Re[2]: Использование FltCreateCommunicationPort
От: chijo Россия  
Дата: 27.07.10 15:19
Оценка:
Здравствуйте, 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 );

В одном потоке все работает....
Re[3]: Использование FltCreateCommunicationPort
От: Alexey Frolov Беларусь  
Дата: 28.07.10 10:25
Оценка:
Здравствуйте, chijo, Вы писали:

C>>>С одним подключением к порту, похоже эта схема не работает. Так как в случае получения нового сообщения в 1-м потоке и одновременно отправке в 3 ответа на другое сообщение(полученное раньше). Получаю ошибку 0x801f0020 (No waiter is present for the filter's reply to this message. ERROR_FLT_NO_WAITER_FOR_REPLY ).

C>>>Видимо я чего-то недопонимаю, мало информации в интернете по этой теме. Помоги советами плиз....

AF>>Покажите в коде как вы в драйвере отправляете сообщение? Может на самом деле не ждете ответа из юзермода


C>Не... Жду :

C>В одном потоке все работает....

Ну тогда возможно MessageId не заполнено в FILTER_REPLY_HEADER или еще что, тяжело вобщем гадать на кофейной гуще. Судя по вашему описанию алгоритма все должно работать. Показывайте тогда код FilterGetMessage И FilterReplyMessage
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.