Compartir a través de


Función RxStartMinirdr (mrx.h)

se llama a rxStartMinirdr para iniciar un minidirector de red al que se ha llamado anteriormente para registrarse con RDBSS. Como parte de RxStartMinirdr, RDBSS también registrará el controlador de minidirector de red como proveedor de convención de nomenclatura universal (UNC) con el Proveedor unc múltiple (MUP) si el controlador indica compatibilidad con nombres UNC.

Sintaxis

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

Parámetros

[in] RxContext

Puntero a la estructura RX_CONTEXT que se va a usar para obtener el objeto de dispositivo y determinar si se trata de un proceso del sistema de archivos.

[out] PostToFsp

Puntero a un valor lógico establecido en TRUE al devolver si el proceso del sistema de archivos debe publicar la solicitud para su posterior procesamiento.

Valor devuelto

rxStartMinirdr devuelve STATUS_SUCCESS si la secuencia de inicio se realizó correctamente o uno de los siguientes valores de error:

Código devuelto Descripción
STATUS_ACCESS_DENIED Error en la solicitud de registro como proveedor UNC porque se denegó el acceso.
STATUS_ACCESS_VIOLATION Error en la solicitud de registro como proveedor UNC con una infracción de acceso.
STATUS_INSUFFICIENT_RESOURCES No había recursos suficientes para completar esta rutina.
STATUS_PENDING La secuencia de inicio de RDBSS y mini redirección debe completarse en el contexto del proceso del sistema, no en un proceso de aplicación en modo de usuario. Si la llamada a RxStartMinirdr procede de un proceso en modo de usuario (una solicitud de servicio en modo de usuario, por ejemplo), se publicará la solicitud para su posterior procesamiento en RDBSS y se devolverá STATUS_PENDING. Este error también se puede devolver si determinados bloqueos RDBSS internos no se pueden adquirir sin esperar. La llamada se completará más adelante desde un subproceso del sistema.
STATUS_REDIRECTOR_STARTED Ya se inició el minidirector de red.

Observaciones

Un minidirector de red se registra con RDBSS cada vez que el kernel carga el controlador y, a continuación, anula el registro con RDBSS cuando se descarga el controlador. Un minidirector de red informa a RDBSS de que se ha cargado llamando a RxRegisterMinirdr, la rutina de registro exportada desde RDBSS. Como parte de este proceso de registro, el minidirector de red pasa un parámetro a RxRegisterMinirdr que es un puntero a una estructura grande, MINIRDR_DISPATCH, que contiene información de configuración para el minidirector de red y una tabla de punteros para las rutinas de devolución de llamada implementadas por el controlador de minidirector de red. RDBSS usa las rutinas de devolución de llamada pasadas en esta estructura para comunicarse con el minidirector de red.

El minidirector de red no inicia realmente la operación hasta que recibe una llamada a su rutina de MRxStart, una de las rutinas de devolución de llamada pasadas en la estructura MINIRDR_DISPATCH. El controlador de minidirector de red debe implementar el MrxStart rutina de devolución de llamada si desea recibir rutinas de devolución de llamada para las operaciones a menos que el minidirector de red conserve sus propios puntos de entrada de distribución del controlador. De lo contrario, RDBSS solo permitirá los siguientes paquetes de solicitud de E/S al controlador hasta que MrxStart devuelva correctamente:

  • Las solicitudes IRP para las operaciones de creación de dispositivos y las operaciones de dispositivo en las que el parámetro FileObject FileObject->FileName.Length en IRPSP es cero y el parámetro FileObject->RelatedFileObject es NULL.

Para cualquier otra solicitud IRP, la rutina de distribución de RDBSS RxFsdDispatch devolverá un estado de STATUS_REDIRECTOR_NOT_STARTED.

La rutina de distribución de RDBSS también producirá un error en las solicitudes de los siguientes paquetes de solicitud de E/S:

  • IRP_MJ_CREATE_MAILSLOT
  • IRP_MJ_CREATE_NAMED_PIPE

RDBSS llama a la rutina de minidirector de red MrxStart cuando se llama a la rutina de RxStartMinirdr. Normalmente, se llama a la rutina de rdBSS RxStartMinirdr como resultado de una solicitud FSCTL o IOCTL desde una aplicación o servicio en modo de usuario para iniciar el minidirector de red. No se puede realizar la llamada a RxStartMinirdr desde la rutina de DriverEntry del minidirector de red después de una llamada correcta a RxRegisterMinirdr, ya que parte del procesamiento de inicio requiere que se complete la inicialización del controlador.

Cuando RDBSS recibe una solicitud FSCTL o IOCTL enviada al controlador de minidirector de red desde el modo de usuario, RDBSS crea una estructura de RX_CONTEXT y pasa esta llamada a la del minidirector de red MRxLowIOSubmit[LOWIO_OP_FSCTL] o MRxLowIOSubmit[LOWIO_OP_IOCTL] rutina de devolución de llamada definida en la estructura de MINIRDR_DISPATCH. La implementación del minidirector de red de esta rutina de devolución de llamada reconocería la solicitud para iniciar y llamar a RxStartMinirdr. Este proceso normal de eventos se muestra a continuación con más detalle:

  1. Una aplicación en modo de usuario emite una solicitud PRIVADA FSCTL o IOCTL para iniciar el minidirector de red.

  2. El controlador del kernel RDBSS recibe la solicitud FSCTL o IOCTL en nombre del minidirector de red, ya que RDBSS ha reemplazado los puntos de entrada de distribución del controlador del minidirector para que apunten a las rutinas internas de RDBSS. Tenga en cuenta que esto supone que el minidirector de red no estableció el RX_REGISTERMINI_FLAG_DONT_INIT_DRIVER_DISPATCH en el parámetro Controls al llamar a RxRegisterMinirdr. Esta opción pasada a RxRegisterMinirdr sería inusual e indica que el minidirector de red no quiere que RDBSS reemplace sus puntos de entrada de distribución del controlador.

  3. RDBSS recibe la solicitud FSCTL o IOCTL internamente en nombre del redirector de red. El distribuidor de RDBSS asigna e inicializa una estructura RX_CONTEXT. A continuación, RDBSS llama al minidirector de red MRxLowIOSubmit[LOW_OP_FSCTL] o MRxLowIOSubmit[LOW_OP_IOCTL] rutina definida en la estructura de MINIRDR_DISPATCH para este minidirector de red, pasando la estructura de RX_CONTEXT inicializada como parámetro.

  4. La implementación de minidirector de red de esta rutina de devolución de llamada reconocería la solicitud PRIVADA FSCTL o IOCTL para iniciar y llamar a RxStartMinirdr, pasando un puntero a la estructura RX_CONTEXT que recibió de RDBSS como parámetro RxContext y la dirección del miembro postToFSP de rxContext como parámetro PostToFsp.

  5. Dado que esta llamada se inició desde el modo de usuario, rxStartMinirdr devolvería STATUS_PENDING y establecería PostToFsp en TRUE.

  6. El minidirector de red MRxLowIOSubmit[LOW_OP_FSCTL] o MRxLowIOSubmit[LOW_OP_IOCTL] rutina recibiría este valor devuelto y lo devolvería al distribuidor de RDBSS.

  7. El distribuidor de RDBSS recibiría el valor devuelto STATUS_PENDING y establecería PostToFsp en TRUE y, a continuación, publicaría una solicitud en un subproceso de trabajo para volver a ejecutar la llamada al minidirector de red.

Después de este punto, hay dos resultados posibles en función de si el FSCTL o el IOCTL se solicitó como una operación asincrónica o sincrónica.

Si se trata de una solicitud asincrónica, se produciría lo siguiente:

  • El llamador en modo de usuario recibiría la respuesta STATUS_PENDING de la llamada. El subproceso de trabajo publicado llamaría finalmente a RxStartMinirdr desde un subproceso del sistema de archivos y se procesaría la llamada. La rutina de RxStartMinirdr intentará registrar el minidirector de red como proveedor UNC, si se solicita. En versiones de Windows anteriores a Windows Vista, RDBSS intentará registrar el minidirector de red como sistema de archivos con el administrador de E/S. Si estas llamadas se realizan correctamente, rxStartMinirdr llama a la rutina de devolución de llamada de mrxStart implementada por el minidirector de red. El valor devuelto de mrxStart se devolvería finalmente a la aplicación en modo de usuario que inició el proceso de secuencia de llamadas como una operación asincrónica.

Si fuera una solicitud sincrónica, se produciría lo siguiente:

  • El autor de la llamada en modo de usuario no recibiría la respuesta STATUS_PENDING, pero se forzaría a esperar hasta que la llamada devuelta desde el subproceso de trabajo publicado. El subproceso de trabajo publicado llamaría finalmente a RxStartMinirdr desde un subproceso del sistema de archivos y se procesaría la llamada. La rutina de RxStartMinirdr intentará registrar el minidirector de red como proveedor UNC, si se solicita. En versiones de Windows anteriores a Windows Vista, RDBSS intentará registrar el minidirector de red como sistema de archivos con el administrador de E/S. Si estas llamadas se realizan correctamente, rxStartMinirdr llama a la rutina de devolución de llamada de mrxStart implementada por el minidirector de red. El valor devuelto de mrxStart se devolvería a la aplicación en modo de usuario que inició el proceso de secuencia de llamadas.

Si un minidirector de red indica compatibilidad con UNC al registrarse con RDBSS (el parámetro Controls para RxRegisterMinirdr), RxStartMinirdr intentará registre el parámetro DeviceName del minidirector de red como proveedor UNC con MUP (llamadas RDBSS FsRtlRegisterUncProvider en nombre del minidirector de red).

En las versiones de Windows anteriores a Windows Vista, RxStartMinirdr registra el sistema de archivos con el administrador de E/S (llamadas a RDBSS ioRegisterFileSystem en nombre del minidirector de red).

Si las llamadas se realizan correctamente, rxStartMinirdr llama al minidirector de red rutina mrxStart. Si mrxStart devuelve éxito, el estado interno del minidirector en RDBSS se establece en RDBSS_STARTED. También se incrementará el miembro StartStopContext. Version del objeto de dispositivo mini-redirector.

La secuencia de inicio de RDBSS y el minidirector de red deben completarse en el contexto del proceso del sistema si se solicita una operación asincrónica. Si la llamada a RxStartMinirdr procede de un proceso en modo de usuario (por ejemplo, una solicitud de servicio en modo de usuario), la solicitud se publicará internamente mediante RDBSS en una cola de trabajo para su procesamiento posterior y se devolverá STATUS_PENDING y se devolverá el parámetro PostToFsp en TRUE. Además, si ciertos bloqueos RDBSS internos no se pueden obtener sin esperar, se devuelve STATUS_PENDING y PostToFsp se establece en TRUE. Cuando se devuelve STATUS_PENDING, se volverá a llamar a RxStartMinirdr desde un proceso del sistema. Si la solicitud FSCTL o IOCTL que inició la llamada a RxStartMinirdr se estableció para la operación asincrónica, RDBSS devolvería STATUS_PENDING realizar una copia de seguridad de la cadena de llamadas a la solicitud FSCTL o IOCTL original desde el modo de usuario. En cambio, si la solicitud FSCTL o IOCTL fuera para la operación sincrónica, la llamada también se publicaría en un subproceso de trabajo para su ejecución posterior, pero la llamada FSCTL o IOCTL no volvería al modo de usuario hasta que RxStartMinirdr se hubiera ejecutado en el contexto del proceso del sistema de archivos. En este caso, el autor de la llamada del FSCTL o el IOCTL nunca verían la devolución del error STATUS_PENDING. El comportamiento más típico es iniciar una solicitud sincrónica para estas operaciones de inicio y detención para simplificar el código de aplicación en modo de usuario.

En una terminación anómala u otro error, RxStartMinirdr intentará deshacer estas operaciones, incluida la anulación del registro del proveedor UNC con MUP, anular el registro del sistema de archivos, liberar memoria asignada para almacenar el nombre de dominio que usarán las difusiones de mailslot y actualizar las tablas RDBSS internas.

Requisitos

Requisito Valor
de la plataforma de destino de Escritorio
encabezado de mrx.h (incluya Mrx.h)
irQL <= APC_LEVEL

Consulte también

, RxpUnregisterMinirdr

DriverEntry de

FsRtlRegisterUncProvider

ioRegisterFileSystem

MRxLowIOSubmit[LOWIO_OP_FSCTL]

MRxLowIOSubmit[LOWIO_OP_IOCTL]

MRxStart

RxFsdDispatch

rxRegisterMinirdr

rxSetDomainForMailslotBroadcast

rxStopMinirdr

rxUnregisterMinirdr

__RxFillAndInstallFastIoDispatch