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

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

Синтаксис

NTSTATUS RxStartMinirdr(
  [in]  IN PRX_CONTEXT RxContext,
  [out] OUT PBOOLEAN   PostToFsp
);

Параметры

[in] RxContext

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

[out] PostToFsp

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

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

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

Код возврата Description
STATUS_ACCESS_DENIED Запрос на регистрацию в качестве поставщика UNC завершился ошибкой, так как доступ был отклонен.
STATUS_ACCESS_VIOLATION Запрос на регистрацию в качестве поставщика UNC произошел с нарушением доступа.
STATUS_INSUFFICIENT_RESOURCES Для выполнения этой процедуры недостаточно ресурсов.
STATUS_PENDING Последовательность запуска для RDBSS и мини-перенаправлений сети должна быть завершена в контексте системного процесса, а не процесса приложения в режиме пользователя. Если вызов RxStartMinirdr поступает из процесса пользовательского режима (например, запроса на обслуживание в режиме пользователя), запрос будет размещен для последующей обработки в RDBSS И STATUS_PENDING будет возвращен. Эта ошибка также может быть возвращена, если некоторые внутренние блокировки RDBSS не могут быть приобретены без ожидания. Вызов будет выполнен позже из системного потока.
STATUS_REDIRECTOR_STARTED Мини-перенаправление сети уже запущен.

Замечания

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

Мини-перенаправление сети фактически не запускает операцию, пока она не получит вызов своей подпрограммы 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 . Обычно подпрограмма RXStartMinirdr RDBS RxStartMinirdr вызывается в результате запроса FSCTL или IOCTL из приложения или службы пользовательского режима, чтобы запустить мини-перенаправление сети. Вызов RxStartMinirdr нельзя сделать из подпрограммы DriverEntry мини-перенаправления сети после успешного вызова RxRegisterMinirdr , так как некоторые из начальной обработки требуют завершения инициализации драйвера.

Когда RDBSS получает запрос FSCTL или IOCTL, отправленный драйверу мини-перенаправления сети из пользовательского режима, RDBSSS создает RX_CONTEXT структуру и передает этот вызов в MRxLowIOSubmit[LOWIO_OP_FSCTL] сети или процедуру обратного вызова MRxLowIOSubmit[LOWIO_OP_IOCTL] , определенную в структуре MINIRDR_DISPATCH. Реализация этой подпрограммы обратного вызова мини-перенаправления сети распознает запрос на запуск и вызов RxStartMinirdr. Этот обычный процесс событий приведен ниже.

  1. Приложение в пользовательском режиме выдает частный запрос FSCTL или IOCTL для запуска мини-перенаправления сети.

  2. Драйвер ядра RDBSS получает запрос FSCTL или IOCTL от имени мини-перенаправления сети, так как RDBSS заменил точки входа драйвера для драйвера мини-перенаправления, чтобы указать на внутренние подпрограммы RDBSS. Обратите внимание, что предполагается, что мини-перенаправление сети не устанавливал RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH в параметре Controls при вызове RxRegisterMinirdr. Этот параметр, переданный в RxRegisterMinirdr , будет необычным и указывает, что мини-перенаправление сети не хочет, чтобы RDBSS заменял точки входа диспетчера драйвера.

  3. RDBSS получает запрос FSCTL или IOCTL внутренне от имени перенаправления сети. Диспетчер RDBSS выделяет и инициализирует структуру RX_CONTEXT. Затем RDBSS вызывает подпрограмму MRxLowIOSubmit[LOW_OP_FSCTL] или подпрограмму MRxLowIOSubmit[LOW_OP_IOCTL] , определенную в структуре MINIRDR_DISPATCH для этого мини-перенаправления сети, передавая инициализированную структуру RX_CONTEXT в качестве параметра.

  4. Реализация мини-перенаправления сети этой подпрограммы обратного вызова распознает частный запрос FSCTL или IOCTL для запуска и вызова RxStartMinirdr, передав указатель на структуру RX_CONTEXT, полученную из RDBSS в качестве параметра RxContext, и адрес члена RxContext RxContext в качестве параметра PostToFsp.

  5. Так как этот вызов был инициирован из пользовательского режима, RxStartMinirdr вернет STATUS_PENDING и присвоит PostToFsp значение TRUE.

  6. Подпрограмма мини-перенаправления сети MRxLowIOSubmit[LOW_OP_FSCTL] или подпрограмма MRxLowIOSubmit[LOW_OP_IOCTL] получит это возвращаемое значение и передает его обратно диспетчеру RDBSS.

  7. Диспетчер RDBSS получит STATUS_PENDING возвращаемое значение и присвоит PostToFsp значение TRUE, а затем будет отправлять запрос в рабочий поток для повторного выполнения вызова мини-перенаправления сети.

После этого есть два возможных результата на основе того, запрашивается ли FSCTL или IOCTL в качестве асинхронной или синхронной операции.

Если это был асинхронный запрос, произойдет следующее:

  • Вызывающий объект в пользовательском режиме получит STATUS_PENDING ответ от вызова. Опубликованный рабочий поток в конечном итоге вызовет RxStartMinirdr из потока файловой системы и вызов будет обработан. Подпрограмма RxStartMinirdr попытается зарегистрировать мини-перенаправление сети в качестве поставщика UNC, если он запрошен. В версиях Windows до Windows Vista RDBSS будет пытаться зарегистрировать мини-перенаправление сети в качестве файловой системы в диспетчере ввода-вывода. Если эти вызовы выполнены успешно, RxStartMinirdr вызывает подпрограмму обратного вызова MrxStart , реализованную мини-перенаправлением сети. Возвращаемое значение из MrxStart в конечном итоге будет возвращено в приложение пользовательского режима, которое инициировало процесс последовательности вызовов в качестве асинхронной операции.

Если это был синхронный запрос, произойдет следующее:

  • Вызывающий пользователь не получит STATUS_PENDING ответ, но будет вынужден ждать, пока вызов не вернулся из размещенного рабочего потока. Опубликованный рабочий поток в конечном итоге вызовет RxStartMinirdr из потока файловой системы и вызов будет обработан. Подпрограмма RxStartMinirdr попытается зарегистрировать мини-перенаправление сети в качестве поставщика UNC, если он запрошен. В версиях Windows до Windows Vista RDBSS будет пытаться зарегистрировать мини-перенаправление сети в качестве файловой системы в диспетчере ввода-вывода. Если эти вызовы выполнены успешно, RxStartMinirdr вызывает подпрограмму обратного вызова MrxStart , реализованную мини-перенаправлением сети. Возвращаемое значение из MrxStart будет возвращено в приложение пользовательского режима, которое инициировало процесс последовательности вызовов.

Если сетевой мини-перенаправление указывает на UNC при регистрации в RDBSS (параметр Controls в RxRegisterMinirdr), то RxStartMinirdr попытается зарегистрировать параметр DeviceName сетевого мини-перенаправления в качестве поставщика UNC с помощью MUP (RDBSS вызывает FsRtlRegisterUncProvider от имени сетевого мини-перенаправления).

В версиях Windows до Windows Vista RxStartMinirdr регистрирует файловую систему с помощью диспетчера ввода-вывода (RDBSS вызывает IoRegisterFileSystem от имени мини-перенаправления сети).

Если вызовы выполняются успешно, RxStartMinirdr вызывает подпрограмму mrxStart сетевого мини-перенаправления. Если MrxStart возвращает успех, для внутреннего состояния мини-перенаправления в RDBSS задано значение RDBSS_STARTED. Элемент StartStopContext.Version объекта устройства мини-перенаправления также будет добавлен.

Последовательность запуска для RDBSS и мини-перенаправления сети должна быть завершена в контексте системного процесса, если запрашивается асинхронная операция. Если вызов RxStartMinirdr поступает из процесса пользовательского режима (например, запроса на обслуживание в режиме пользователя), то запрос будет помещен в рабочую очередь RDBSS в рабочую очередь для последующей обработки и STATUS_PENDING будет возвращен, а параметр PostToFsp будет иметь значение TRUE. Кроме того, если некоторые внутренние блокировки RDBSS не могут быть получены без ожидания, возвращается STATUS_PENDING, а PostToFsp имеет значение TRUE. При возврате STATUS_PENDING rxStartMinirdr будет вызываться снова из системного процесса. Если для асинхронной операции задан запрос FSCTL или IOCTL, инициирующий вызов RxStartMinirdr , RDBSS будет возвращать STATUS_PENDING резервное копирование цепочки вызовов в исходный запрос FSCTL или IOCTL из пользовательского режима. В отличие от этого, если запрос FSCTL или IOCTL был для синхронной операции, вызов также будет размещен в рабочем потоке для последующего выполнения, но вызов FSCTL или IOCTL не вернется в пользовательский режим, пока RxStartMinirdr не будет выполнен в контексте процесса файловой системы. В этом случае вызывающий объект FSCTL или IOCTL никогда не увидит возврат STATUS_PENDING ошибки. Более типичное поведение — инициировать синхронный запрос для этих операций запуска и остановки, чтобы упростить код приложения в пользовательском режиме.

При ненормальном завершении или другом сбое RxStartMinirdr попытается отменить эти операции, включая отмену регистрации поставщика UNC с помощью MUP, отмену регистрации файловой системы, освобождение памяти, выделенной для хранения доменного имени, используемого трансляциями mailslot, и обновление внутренних таблиц RDBSS.

Требования

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

См. также

RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch