Compartir a través de


Rutinas de E/S de objetos del sistema de archivos

Las rutinas de E/S de objetos del sistema de archivos representan las llamadas de E/S de archivos tradicionales para las operaciones de lectura, escritura y otros archivos. Estas rutinas se suelen denominar "rutinas de E/S bajas" en el minidirector de red. RDBSS llama a estas rutinas en respuesta a la recepción de un IRP específico

Las rutinas de E/S bajas se pasan como una matriz de punteros rutinarios como parte de la estructura de MINIRDR_DISPATCH pasada a la rutina RxRegisterMinirdr que se usa para registrar el minidirector de red en el inicio (en la rutina DriverEntry ). El valor de la entrada de matriz es la operación de E/S baja que se va a realizar.

Estas rutinas de E/S de objeto de sistema de archivos o E/S bajas normalmente las llama RDBSS de forma asincrónica. Por lo tanto, un minidirector de red debe asegurarse de que las rutinas de E/S bajas que se implementan se pueden llamar de forma asincrónica de forma segura. También es posible que un minidirector de red omita la solicitud de una llamada asincrónica e implemente una rutina para que solo funcione de forma sincrónica. Sin embargo, para determinadas llamadas que pueden tardar tiempo en completarse (lectura y escritura, por ejemplo), implementarlas como operaciones sincrónicas puede reducir significativamente el rendimiento de E/S para todo el sistema operativo.

Todas las rutinas de E/S de objetos del sistema de archivos esperan que un puntero a una estructura de RX_CONTEXT se pase como parámetro. Antes de llamar a estas rutinas, RDBSS establece el valor de un número de miembros en la estructura LowIoContext del RX_CONTEXT. Algunos de los miembros de la estructura LowIoContext se establecen para todas las rutinas, mientras que algunos miembros solo se establecen para rutinas específicas. La estructura de datos RX_CONTEXT contiene el IRP que se está procesando y tiene un miembro LowIoContext.Operation que especifica la operación de E/S baja que se va a realizar. Es posible que varias de las rutinas de E/S bajas apunten a la misma rutina en un minidirector de red porque este miembro LowIoContext.Operation se puede usar para diferenciar la operación de E/S baja solicitada. Por ejemplo, todas las llamadas de E/S relacionadas con bloqueos de archivo podrían llamar a la misma rutina de E/S baja en el minidirector de red que usa el miembro LowIoContext.Operation para diferenciar la operación de bloqueo o desbloqueo solicitada.

Otras rutinas de E/S de archivos distintas de las rutinas de E/S bajas se basan en llamadas sincrónicas, aunque esto está sujeto a cambios en futuras versiones del sistema operativo Windows.

Mientras se encuentra en la ruta de acceso LowIo, se garantiza que el miembro LowIoContext.ResourceThreadId del RX_CONTEXT indique el subproceso propietario que inició la operación en RDBSS. El miembro LowIoContext.ResourceThreadId se puede usar para liberar el recurso FCB en nombre de otro subproceso. Cuando se completa una rutina asincrónica, se puede liberar el recurso FCB adquirido a partir del subproceso inicial.

Si es probable que una rutina MrxLowIoSubmit[LOWIO_OP_XXX] tarde mucho tiempo en completarse, el controlador minidirector de red debe liberar el recurso FCB antes de iniciar la comunicación de red. El recurso FCB se puede liberar llamando a RxReleaseFcbResourceForThreadInMRx.

En la tabla siguiente se enumeran las rutinas que puede implementar un minidirector de red para las operaciones de E/S de objetos del sistema de archivos (E/S bajas).

Rutina Descripción
MRxLowIOSubmit[LOWIO_OP_EXCLUSIVELOCK]

RDBSS llama a esta rutina para solicitar que un minidirector de red abra un bloqueo exclusivo en un objeto de archivo. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_LOCK_CONTROL con un código secundario de IRP_MN_LOCK e IrpSp-Flags> tiene establecido el bit SL_EXCLUSIVE_LOCK.

MRxLowIOSubmit[LOWIO_OP_FSCTL]

RDBSS llama a esta rutina para pasar una solicitud de control del sistema de archivos al minidirector de red. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_FILE_SYSTEM_CONTROL.

MRxLowIOSubmit[LOWIO_OP_IOCTL]

RDBSS llama a esta rutina para pasar una solicitud de control del sistema de E/S al minidirector de red. RDBSS emite esta llamada en respuesta a la recepción de una IRP_MJ_DEVICE_CONTROL o IRP_MJ_INTERNAL_DEVICE_CONTROL..

MRxLowIOSubmit[LOWIO_OP_NOTIFY_CHANGE_DIRECTORY]

RDBSS llama a esta rutina para emitir una solicitud al minidirector de red para una operación de notificación de cambio de directorio. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_DIRECTORY_CONTROL.

MRxLowIOSubmit[LOWIO_OP_READ]

RDBSS llama a esta rutina para emitir una solicitud de lectura al minidirector de red. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_READ.

MRxLowIOSubmit[LOWIO_OP_SHAREDLOCK]

RDBSS llama a esta rutina para solicitar que un redirector de red abra un bloqueo compartido en un objeto de archivo. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_LOCK_CONTROL con un código secundario de IRP_MN_LOCK e IrpSp-Flags> no tiene establecido el bit SL_EXCLUSIVE_LOCK.

MRxLowIOSubmit[LOWIO_OP_UNLOCK]

RDBSS llama a esta rutina para solicitar que un minidirector de red quite un único bloqueo en un objeto de archivo. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_LOCK_CONTROL con un código menor de IRP_MN_UNLOCK_SINGLE.

MRxLowIOSubmit[LOWIO_OP_UNLOCK_MULTIPLE]

RDBSS llama a esta rutina para solicitar que el minidirector de red quite varios bloqueos mantenidos en un objeto de archivo. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_LOCK_CONTROL con un código menor de IRP_MN_UNLOCK_ALL o IRP_MN_UNLOCK_ALL_BY_KEY. Los intervalos de bytes que se van a desbloquear se especifican en el miembro LowIoContext.ParamsFor.Locks.LockList del RX_CONTEXT.

MRxLowIOSubmit[LOWIO_OP_WRITE]

RDBSS llama a esta rutina para emitir una solicitud de escritura al minidirector de red. RDBSS emite esta llamada en respuesta a la recepción de un IRP_MJ_WRITE.