#c #windows #windows-services #kernel #driver
#c #Windows #windows-службы #ядро #драйвер
Вопрос:
Как вы можете отправлять уведомления от драйвера в службу пользовательского режима? В то же время я хочу, чтобы это работало только в одном направлении, то есть чтобы служба не имела возможности отправлять сообщения драйверу. Да, я знаю о IOCTL, событиях и обо всем этом… Но, возможно, я не знаю о какой-то технологии
Ответ №1:
Связь между пользовательским режимом и режимом ядра
Диспетчер фильтров поддерживает связь между пользовательским режимом и режимом ядра через коммуникационные порты. Драйвер минифильтра управляет безопасностью порта, указывая дескриптор безопасности, который будет применен к объекту порта связи. Обмен данными через коммуникационный порт не буферизуется, поэтому он быстрее и эффективнее. Приложение или служба пользовательского режима могут отвечать на сообщения от драйвера минифильтра для двунаправленной связи.
Когда драйвер минифильтра создает порт сервера связи, он неявно начинает прослушивать входящие соединения на этом порту. Когда вызывающий абонент пользовательского режима пытается подключиться к порту, диспетчер фильтров вызывает ConnectNotifyCallback
процедуру драйвера минифильтра с дескриптором для вновь созданного соединения. Когда диспетчер фильтров восстанавливает управление, он передает вызывающей стороне пользовательского режима отдельный дескриптор файла, который представляет конечную точку вызывающей стороны пользовательского режима для соединения. Этот дескриптор можно использовать для связывания портов завершения ввода-вывода с портом прослушивателя.
Соединение принимается, только если вызывающий абонент пользовательского режима имеет достаточный доступ, указанный дескриптором безопасности на порту. Каждое соединение с портом получает свою собственную очередь сообщений и частные конечные точки.
Закрытие любой конечной точки (ядра или пользователя) завершает это соединение. Когда вызывающий абонент пользовательского режима закрывает свой дескриптор для конечной точки, диспетчер фильтров вызывает DisconnectNotifyCallback
подпрограмму драйвера минифильтра, чтобы драйвер минифильтра мог закрыть свой дескриптор для соединения.
Закрытие порта сервера связи предотвращает новые соединения, но не прерывает существующие соединения. Диспетчер фильтров прерывает существующие соединения при выгрузке драйвера минифильтра.
Процедуры диспетчера фильтров для обмена данными между пользовательским режимом и режимом ядра
Диспетчер фильтров предоставляет следующие процедуры поддержки для драйверов минифильтров в режиме ядра для взаимодействия с приложениями пользовательского режима:
Для взаимодействия приложений пользовательского режима с драйверами минифильтров предусмотрены следующие процедуры поддержки:
Процедуры обратного вызова драйвера минифильтра для обмена данными между пользовательским режимом и режимом ядра
Следующие процедуры обратного вызова драйвера минифильтра передаются в качестве параметров FltCreateCommunicationPort
:
Имя процедуры обратного вызова | Тип процедуры обратного вызова |
---|---|
ConnectNotifyCallback | PFLT_CONNECT_NOTIFY |
DisconnectNotifyCallback | PFLT_DISCONNECT_NOTIFY |
MessageNotifyCallback | PFLT_MESSAGE_NOTIFY |
Подробнее: Примеры