Здравствуйте, ratix, Вы писали:
R>при поступлении входящего соединения (TDI_EVENT_CONNECT handler), в обработчике нет возможности принять решение о том разрешить ли соединение или запретить.. R>Необходимо спросить об этом user-mode процесс, которые контроллирует драйвер.
R>Проблема собственно в том, что я не знаю как это сделать.. R>Насколько я понял — TDI_EVENT_CONNECT handler работает на IRQL Dispatch, поэтому нельзя тупо отправить запрос в юзер-мод, и ждать ответа каким-нибудь KeWaitForSingleObject, так?
Так. Да даже если бы он вызывался только на PASSIVE_LEVEL, это не было бы правильным решением.
R>При этом, если TDI_EVENT_CONNECT handler возвращает что-то отличное от STATUS_MORE_PROCESSING_REQUIRED (например я пробовал вернуть STATUS_PENDING) — соединение прерывается.
R>А нужно, чтобы вопрос о том установить соединение или нет как-бы подвис на время, пока не придет ответ от user-mode приложения.
R>Подскажите как решить проблему?
Подскажу один из вариантов — посмотрите на последний аргумент ClientEventConnect.
Для этого IRP можно установить completion routine, и в ней отложить завершение,
отправив сигнал в user-mode. Получив ответ, завершение IRP возобновляется с
подходящим кодом, разрешая или запрещая прием соединения (TDI_ACCEPT).