Функция RxRegisterMinirdr (mrx.h)

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

Синтаксис

NTSTATUS RxRegisterMinirdr(
  [out]     OUT PRDBSS_DEVICE_OBJECT *DeviceObject,
  [in, out] IN OUT PDRIVER_OBJECT    DriverObject,
  [in]      IN PMINIRDR_DISPATCH     MrdrDispatch,
  [in]      IN ULONG                 Controls,
  [in]      IN PUNICODE_STRING       DeviceName,
  [in]      IN ULONG                 DeviceExtensionSize,
  [in]      IN DEVICE_TYPE           DeviceType,
  [in]      IN ULONG                 DeviceCharacteristics
);

Параметры

[out] DeviceObject

Указатель на место хранения созданного объекта устройства.

[in, out] DriverObject

Указатель на объект драйвера сетевого мини-перенаправления. Каждый драйвер получает указатель на объект драйвера в параметре в подпрограмме DriverEntry . Этот объект драйвера будет использоваться для создания объекта устройства для драйвера мини-перенаправления сети.

[in] MrdrDispatch

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

[in] Controls

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

RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS

Если этот флаг задан, он указывает, что мини-перенаправление сети не поддерживает имена UNC.

RX_REGISTERMINI_FLAG_DONT_PROVIDE_MAILSLOTS

Если этот флаг задан, он указывает, что мини-перенаправление сети не поддерживает почтовые ящики.

RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH

Если этот флаг задан, он указывает, что мини-перенаправление сети не требует RDBSS для инициализации точек входа драйвера диспетчера мини-перенаправления для указания на внутренние подпрограммы RDBSS. Этот вариант будет использоваться только в необычных обстоятельствах. Как правило, RDBSS устанавливает точки входа драйвера и быструю отправку ввода-вывода в объекте драйвера мини-перенаправления сети, чтобы указать на подпрограммы внутренние в RDBSS.

RX_REGISTERMINI_FLAG_DONT_INIT_PREFIX_N_SCAVENGER

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

[in] DeviceName

Указатель на буфер, содержащий строку Юникода без нуля, которая называет объект устройства. Строка должна быть полным именем пути. Этот параметр передается как DeviceName в подпрограмму IoCreateDevice rDBSS.

[in] DeviceExtensionSize

Размер, указанный драйвером мини-перенаправления для количества байтов, выделяемых для расширения устройства объекта устройства. Внутренняя структура расширения устройства определяется драйвером. Этот параметр добавляется к размеру расширения устройства, используемого RDBSS и передается в качестве параметра DeviceExtensionSize в подпрограмму IoCreateDevice rDBSS.

[in] DeviceType

Тип устройства, используемый при создании объекта устройства. Это указывает одну из системных констант FILE_DEVICE_XXX, указывающих тип устройства или определенное поставщиком значение для нового типа устройства. Обычно это значение будет FILE_DEVICE_NETWORK_FILE_SYSTEM для драйверов мини-перенаправления сети. Этот параметр передается как DeviceType в подпрограмму IoCreateDevice rDBSS.

[in] DeviceCharacteristics

Характеристики устройства, используемые при создании объекта устройства. Это указывает одну или несколько системных констант, объединенных вместе, которые предоставляют дополнительные сведения об устройстве драйвера. Это значение должно содержать FILE_REMOTE_DEVICE для драйверов мини-перенаправления сети, но это может быть объединено с другими характеристиками, такими как FILE_DEVICE_SECURE_OPEN. Этот параметр передается как DeviceCharacteristics в подпрограмму IoCreateDevice rDBSS.

Возвращаемое значение

RxRegisterMinirdr возвращает STATUS_SUCCESS при успешном выполнении или одно из следующих значений ошибок при сбое:

Код возврата Description
STATUS_INSUFFICIENT_RESOURCES
Для создания объекта устройства недостаточно ресурсов.
СТАТУС_НЕДЕЙСТВИТЕЛЬНЫЙ_ПАРАМЕТР
Недопустимый параметр был передан в подпрограмму. Эта ошибка будет возвращена, если параметр DeviceObject является указателем NULL .
STATUS_OBJECT_NAME_COLLISION
При попытке создать объект устройства произошло столкновение имен.
STATUS_OBJECT_NAME_EXISTS
Объект устройства с таким именем уже существует.
STATUS_UNSUCCESSFUL
Вызов для создания объекта устройства вернул объект устройства NULL .

Замечания

Сетевой мини-перенаправление регистрируется в RDBSSS всякий раз, когда драйвер загружается ядром и отменяет регистрацию с помощью RDBSS при выгрузке драйвера. Не монолитный драйвер (мини-перенаправление сети SMB) взаимодействует с Rdbss.sys, другим драйвером ядра. Для драйвера мини-перенаправления сети монолитной сети, который статически связывается с Rdbsslib.lib, это просто вызов подпрограммы библиотеки Rdbsslib.lib .

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

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

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

Если вызов RxRegisterMinirdr выполнен успешно, число членов в RDBSS_DEVICE_OBJECT, на которые указывает параметр DeviceObject , инициализируется, включая следующее:

  • Для элемента dispatch задан параметр MrdrDispatch .
  • Для элемента RegistrationControls задан параметр Controls .
  • Для элемента DeviceName задан параметр DeviceName .
  • Элемент RegisterUncProvider имеет значение TRUE , если RX_REGISTERMINI_FLAG_DONT_PROVIDE_UNCS бит в параметре Controls не задан.
  • Элемент RegisterMailSlotProvider имеет значение TRUE , если RX_REGISTERMINI_FLAG_DONT_PROVIDE_MAILSLOTS бит в параметре Controls не задан.
  • Для члена NetworkProviderPriority задан приоритет поставщика сети, который будет использоваться MUP.
Если вызов RxRegisterMinirdr выполнен успешно и RX_REGISTERMINI_FLAG_DONT_INIT_PREFIX_N_SCAVENGER бит в параметре Controls не задан, то ряд других элементов в RDBSS_DEVICE_OBJECT, на которые указывает параметр DeviceObject , инициализированы, включая следующее:
  • Структура элементов pRxNetNameTable инициализируется.
  • Для элемента RxNetNameTableInDeviceObject.IsNetNameTable задано значение TRUE.
  • Структура элементов pRdbssScavenger инициализируется.
Если вызов RxRegisterMinirdr выполнен успешно, RDBSS задает внутреннее состояние мини-перенаправления сети в RDBSS для RDBSS_STARTABLE.

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

  • Запросы IRP для операций создания устройства и операций устройства, в которых параметр FileObject->FileName.Length в IRPSP равен нулю, а параметр FileObject->RelatedFileObject имеет значение NULL.
Для любого другого запроса IRP подпрограмма отправки RDBSS RxFsdDispatch возвращает состояние STATUS_REDIRECTOR_NOT_STARTED.

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

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

Требования

Требование Ценность
целевая платформа Рабочий стол
Header mrx.h (include Mrx.h)
IRQL <= APC_LEVEL

См. также

DriverEntry

IoCreateDevice

MRxStart

RxFsdDispatch

RxSetDomainForMailslotBroadcast

RxStartMinirdr

RxStopMinirdr

RxUnregisterMinirdr

RxpUnregisterMinirdr

__RxFillAndInstallFastIoDispatch