Поделиться через


Регистрация драйвера и управление запуском и остановкой

При запуске операционной системы Windows загружает RDBSS и все сетевые драйверы мини-перенаправления на основе параметров в реестре. Для монолитного драйвера мини-перенаправления сети, который статически связан с rdbsslib.lib, драйвер должен вызвать подпрограмму RxDriverEntry из своей подпрограммы DriverEntry , чтобы инициализировать копию библиотеки RDBSSLIB, связанной с сетевым драйвером. В этом случае подпрограмма RxDriverEntry должна вызываться перед вызовом и использованием других процедур RDBSS. Для не монолитного сетевого мини-перенаправления драйвера (перенаправления Microsoft SMB) драйвер устройства rdbss.sys инициализируется в собственной подпрограмме DriverEntry при загрузке.

Сетевой мини-перенаправитель регистрируется в RDBSS, когда драйвер загружается ядром, и отменяет регистрацию в RDBSS при выгрузке драйвера. Сетевой мини-перенаправитель сообщает RDBSS о том, что он был загружен, вызвав RxRegisterMinirdr, подпрограмму регистрации, экспортированную из RDBSS. В рамках этого процесса регистрации мини-перенаправитель сети передает параметр в RxRegisterMinirdr , который является указателем на большую структуру, MINIRDR_DISPATCH. Эта структура содержит сведения о конфигурации для сетевого мини-перенаправления и таблицу отправки указателей на процедуры обратного вызова, реализованные драйвером ядра сетевого мини-перенаправления. RDBSS вызывает драйвер сетевого мини-перенаправления через этот список процедур обратного вызова.

Подпрограмма RxRegisterMinirdr задает все подпрограммы диспетчеризации драйверов драйвера сетевого мини-перенаправления, указывая на подпрограмму диспетчера RDBSS верхнего уровня RxFsdDispatch. Сетевой мини-перенаправитель может переопределить это поведение, сохранив собственные точки входа и перезаписав отправку драйвера с собственными точками входа после вызова RxRegisterMinirdr или установив специальный параметр при вызове RxRegisterMinirdr.

Драйвер мини-перенаправления сети фактически не запускает работу, пока не получит вызов к своей подпрограмме MRxStart , одной из подпрограмм обратного вызова, переданных в MINIRDR_DISPATCH структуре. Подпрограмма обратного вызова MrxStart должна быть реализована драйвером сетевого мини-перенаправления, если он хочет получать подпрограммы обратного вызова для операций, если мини-перенаправитель сети не сохраняет собственные точки входа диспетчеризации драйвера. В противном случае RDBSS разрешит драйверу только следующие пакеты запросов ввода-вывода, пока MrxStart не вернет успешно:

  • IRP-запросы для создания устройств и операций устройства, где fileObject-FileName.Length> в IRPSP равно нулю, а FileObject-RelatedFileObject> имеет значение NULL.

Для любого другого запроса IRP подпрограмма RxFsdDispatch диспетчеризации RDBSS вернет состояние STATUS_REDIRECTOR_NOT_STARTED.

Подпрограмма диспетчеризации RDBSS также завершит сбой всех запросов для следующих пакетов запросов ввода-вывода:

  • IRP_MJ_CREATE_MAILSLOT

  • IRP_MJ_CREATE_NAMED_PIPE

Подпрограмма обратного вызова MrxStart , реализованная мини-перенаправлением сети, вызывается RDBSS при вызове подпрограммы RxStartMinirdr . Подпрограмма RxStartMinirdr RDBSS обычно вызывается в результате запроса кода управления файловой системой (FSCTL) или кода управления вводом-выводом (IOCTL) от приложения или службы пользовательского режима для запуска мини-перенаправления сети. Вызов RxStartMinirdr не может быть выполнен из подпрограммы DriverEntry мини-перенаправления сети после успешного вызова RxRegisterMinirdr, так как для некоторых процессов запуска требуется завершить инициализацию драйвера. После получения вызова RxStartMinirdr RDBSS завершает процесс запуска, вызывая подпрограмму MrxStart мини-перенаправителя сети. Если вызов MrxStart возвращает успешное выполнение, RDBSS устанавливает внутреннее состояние мини-перенаправления в RDBSS на RDBSS_STARTED.

RDBSS экспортирует подпрограмму RxSetDomainForMailslotBroadcast, чтобы задать домен для широковещательных передач mailslot. Эта подпрограмма используется во время регистрации, если мини-перенаправление сети поддерживает почтовые узлы.

Удобную подпрограмму , __RxFillAndInstallFastIoDispatch, экспортируемую RDBSS, можно использовать для копирования всех указателей IRP_MJ_XXX драйвера для обработки запросов ввода-вывода в сопоставимые векторы диспетчеризации быстрых операций ввода-вывода, но эта подпрограмма работает только для не монолитных драйверов.

RDBSS также экспортирует подпрограммы для уведомления RDBSS о том, что мини-перенаправление сети запускается или останавливается. Эти вызовы используются, если сетевой мини-перенаправление включает в себя службу администрирования пользовательского режима или служебное приложение, которое запускает и останавливает перенаправитель. Эта служба или приложение в пользовательском режиме может отправлять пользовательские запросы FSCTL или IOCTL драйверу сетевого мини-перенаправления, чтобы указать, что он должен запускаться или останавливаться. Перенаправитель может вызвать подпрограммы RDBSS RxStartMinirdr или RxStopMinirdr , чтобы уведомить RDBSS о запуске или остановке этого мини-перенаправления сети.

В следующей таблице перечислены процедуры регистрации драйвера RDBSS и управления запуском и остановкой.

Подпрограмма Описание

RxDriverEntry

Эта подпрограмма вызывается монолитным драйвером мини-перенаправления сети из подпрограммы DriverEntry для инициализации RDBSS.

Для не монолитных драйверов эта подпрограмма инициализации эквивалентна процедуре DriverEntry драйвера устройства rbss.sys.

RxRegisterMinirdr

Эта подпрограмма вызывается драйвером сетевого мини-перенаправления для регистрации драйвера в RDBSS, который добавляет сведения о регистрации во внутреннюю таблицу регистрации. RDBSS также создает объект устройства для мини-перенаправления сети.

RxSetDomainForMailslotBroadcast

Эта подпрограмма вызывается драйвером сетевого мини-перенаправления, чтобы задать домен, используемый для широковещательной рассылки, если почтовые узлы поддерживаются драйвером.

RxStartMinirdr

Эта подпрограмма запускает сетевой мини-перенаправитель, который вызывается для регистрации. RDBSS также зарегистрирует драйвер сетевого мини-перенаправления в качестве поставщика UNC в MUP, если драйвер указывает на поддержку UNC-имен.

RxStopMinirdr

Эта процедура останавливает драйвер сетевого мини-перенаправления. Остановленный драйвер больше не будет получать новые команды, кроме запросов IOCTL или FSCTL.

RxpUnregisterMinirdr

Эта подпрограмма вызывается драйвером сетевого мини-перенаправления для отмены регистрации драйвера в RDBSS и удаления сведений о регистрации из внутренней таблицы регистрации RDBSS.

RxUnregisterMinirdr

Эта подпрограмма является встроенной функцией, определенной в rxstruc.h, которая вызывается драйвером мини-перенаправления сети для отмены регистрации драйвера в RDBSS и удаления сведений о регистрации из внутренней таблицы регистрации RDBSS. Встроенная функция RxUnregisterMinirdr внутренне вызывает RxpUnregisterMinirdr.

__RxFillAndInstallFastIoDispatch

Эта подпрограмма заполняет быстрый вектор диспетчеризации ввода-вывода, чтобы он был идентичен обычному вектору ввода-вывода диспетчера, и устанавливает его в объект драйвера, связанный с переданным объектом устройства.

Следующий макрос определен в файле заголовка mrx.h, который вызывает одну из этих подпрограмм. Обычно этот макрос используется вместо вызова подпрограммы __RxFillAndInstallFastIoDispatch напрямую.

Макрос Описание

RxFillAndInstallFastIoDispatch(__devobj, __fastiodisp)

Этот макрос вызывает __RxFillAndInstallFastIoDispatchдля заполнения вектора быстрой диспетчеризации ввода-вывода, чтобы он был идентичен обычному вектору ввода-вывода диспетчера, и устанавливает его в объект драйвера, связанный с переданным объектом устройства.