Доброго времени суток.
Занимаюсь разработкой минифильтра фс. В юзер моде сервис с которым драйвер взаимодействует посредством 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 работает в ОДНОМ потоке (архитектурно).
Есть мысли по этому поводу?