FilterGetMessage without OVERLAPPED
От: Age91  
Дата: 28.01.15 08:49
Оценка:
Доброго времени суток.

Занимаюсь разработкой минифильтра фс. В юзер моде сервис с которым драйвер взаимодействует посредством FltSendMessage (с нулевым таймаутом снизу) и FilterGetMessage (с OVERLAPPED и GetOverlappedResult) и FilterReplyMessage сверху. Всё работает очень даже не плохо, пока не сделаешь логOFF ибо дальнейший логON совершить не удается: не появляется курсор в поле ввода пароля (Win XP x86) при этом остальной интерфейс отвечает . Просмотрев стек вызовов всех потоков каждого процесса WinDbg'ом в этот момент, очень огорчился не увидев там ни одного "подвешенного" вызова с моим драйвером. Ладно, пишем заглушку эмулирующую отправку сообщений на обработку сервисной части (может там Lock), при этом исключается взаимодействие с драйвером. Логин проходит.
Делаю вывод что проблема во взаимодействии 0 и 3 кольца. Использование OVERLAPPED по msdn'у: для каждого вызова FilterGetMessage заново инициализированная структура и новое событие с ручным сбросом для нее. Но все же вызывает подозрение. Вообще его использовал для получения длины входящего сообщения — оно может изменяться. Хватает буфера — хорошо, мало — выделим сколько нужно. Ок, попробую без overlapped... Вторые сутки пробую и больше 3-4ех сообщений от драйвера получить не удается:
FilterGetMessage раз: срабатывает result == HRESULT_FROM_WIN32(ERROR_INSUFFICIENT_BUFFER) -> держи буфер побольше.
FilterGetMessage два: S_OK
FilterGetMessage три: S_OK
FilterGetMessage четыре: E_FAIL и никакой инфы больше.

FilterGetMessage работает в ОДНОМ потоке (архитектурно).

Есть мысли по этому поводу?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.