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

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

Синтаксис

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

Параметры

[in] RxContext

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

[out] PostToFsp

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

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

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

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

Комментарии

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

Сетевой мини-перенаправитель фактически не запускает работу, пока не получит вызов своей подпрограммы 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 , так как для некоторых начальных процессов требуется завершить инициализацию драйвера.

Когда RDBSS получает запрос FSCTL или IOCTL, отправленный драйверу сетевого мини-перенаправления из пользовательского режима, RDBSS создает структуру 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 , и адрес члена PostToFSPRxContext в качестве параметра 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.

Требования

Требование Значение
Целевая платформа Персональный компьютер
Верхняя часть mrx.h (включая Mrx.h)
IRQL <= APC_LEVEL

См. также раздел

, RxpUnregisterMinirdr

DriverEntry

FsRtlRegisterUncProvider

IoRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

RxRegisterMinirdr

RxSetDomainForMailslotBroadcast

RxStopMinirdr

RxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch