Compartir a través de


administración de RX_CONTEXT e IRP

La estructura RX_CONTEXT es una de las estructuras de datos fundamentales usadas por RDBSS y miniireccionadores de red para administrar un paquete de solicitud de E/S (IRP). Una estructura de RX_CONTEXT describe un IRP mientras se está procesando y contiene información de estado que permite liberar recursos globales a medida que se completa el IRP. El RX_CONTEXT estructura de datos encapsula un IRP para su uso por RDBSS, miniireccionadores de red y el sistema de archivos. Una estructura de RX_CONTEXT incluye un puntero a un único IRP y todo el contexto necesario para procesar el IRP.

A veces, una estructura de RX_CONTEXT se conoce como contexto IRP o RxContext en los archivos de encabezado del Kit de controladores de Windows (WDK) y otros recursos que se usan para desarrollar controladores de minidirector de red.

El RX_CONTEXT es una estructura de datos a la que se adjunta información adicional proporcionada por los distintos miniireccionadores de red. Desde el punto de vista del diseño, esta información adicional se puede controlar de una de varias maneras:

  • Permitir que los punteros de contexto se definan como parte de RX_CONTEXT, que los miniireccionadores de red usan para almacenar su información. Esto implica que cada vez que se asigna y destruye una estructura de RX_CONTEXT, el controlador minidirector de red debe realizar una asignación o destrucción asociada independiente del bloque de memoria que contiene la información adicional del minidirector de red. Dado que RX_CONTEXT estructuras se crean y destruyen en grandes cantidades, no es una solución aceptable desde el punto de vista del rendimiento.

  • Otro enfoque consiste en asignar el tamaño de cada estructura de RX_CONTEXT por una cantidad especificada previamente para cada minidirector de red, que luego se reserva para su uso por el minidirector. Este enfoque evita la asignación y destrucción adicionales, pero complica el código de administración de RX_CONTEXT en RDBSS.

  • El tercer enfoque consiste en asignar un área especificada previamente, que es la misma para todos los miniireccionadores de red como parte de cada RX_CONTEXT. Se trata de un área sin formato sobre la que los distintos redireccionadores de red pequeños pueden imponer cualquier estructura deseada. Este enfoque supera las desventajas asociadas a los enfoques anteriores. Este es el enfoque implementado actualmente en RDBSS.

El tercer enfoque es el esquema utilizado por RDBSS. Por lo tanto, los desarrolladores de controladores de minidirector de red deben intentar definir el contexto privado asociado para ajustarse a esta área predefinida definida en la estructura de datos RX_CONTEXT. Los controladores de minidirector de red que infringen esta regla incurrirán en una penalización significativa del rendimiento.

Muchas rutinas y rutinas RDBSS exportadas por un minidirector de red hacen referencia a RX_CONTEXT estructuras en el subproceso iniciador o en algún otro subproceso utilizado por la rutina. Por lo tanto, se hace referencia a las estructuras RX_CONTEXT para administrar su uso para las operaciones asincrónicas. Cuando el recuento de referencias va a cero, la estructura de RX_CONTEXT se puede finalizar y liberar en la última operación de desreferencia.

RDBSS proporciona una serie de rutinas que se usan para manipular una estructura de RX_CONTEXT y el IRP asociado. Estas rutinas se usan para asignar, inicializar y eliminar una estructura de RX_CONTEXT. Estas rutinas también se usan para completar el IRP asociado a un RX_CONTEXT y configurar una rutina de cancelación para un RX_CONTEXT.

Las rutinas siguientes manipulan RX_CONTEXT estructuras:

Rutina Descripción

RxCompleteRequest

Esta rutina se usa para completar un IRP asociado a una estructura de RX_CONTEXT. RdBSS usa internamente esta rutina y no debe ser utilizada por los miniireccionadores de red.

RxCompleteRequest_Real

Esta rutina se usa para completar un IRP asociado a una estructura de RX_CONTEXT. RdBSS usa internamente esta rutina y no debe ser utilizada por los miniireccionadores de red.

RxCreateRxContext

Esta rutina asigna una nueva estructura RX_CONTEXT e inicializa la estructura de datos.

RxDereferenceAndDeleteRxContext_Real

Esta rutina desreferencia una estructura de RX_CONTEXT y, si el recuento de referencias va a cero, desasigna y quita la estructura de RX_CONTEXT especificada de las estructuras de datos en memoria de RDBSS.

RxInitializeContext

Esta rutina inicializa una estructura de RX_CONTEXT recién asignada.

RxPrepareContextForReuse

Esta rutina prepara una estructura de RX_CONTEXT para su reutilización restableciendo todas las asignaciones y adquisiciones específicas de la operación realizadas anteriormente. Los parámetros obtenidos del IRP no se modifican. RdBSS usa internamente esta rutina y no debe ser utilizada por los miniireccionadores de red.

RxResumeBlockedOperations_Serially

Esta rutina reactiva el siguiente subproceso en espera, si existe, en la cola de E/S de bloqueo serializada.

RxSetMinirdrCancelRoutine

La rutina configura una rutina de cancelación de minidirector de red para una estructura de RX_CONTEXT.

__RxSynchronizeBlockingOperations

Esta rutina se usa para sincronizar la E/S de bloqueo con la misma cola de trabajo. RDBSS usa internamente esta rutina para sincronizar las operaciones de canalización con nombre. Una minidirectora de red puede usar esta rutina para sincronizar las operaciones en una cola independiente que mantiene el minidirector de red.

La rutina solo está disponible en Windows Server 2003.

__RxSynchronizeBlockingOperationsMaybeDroppingFcbLock

Esta rutina se usa para sincronizar la E/S de bloqueo con la misma cola de trabajo. RDBSS usa internamente esta rutina para sincronizar las operaciones de canalización con nombre. Una minidirectora de red puede usar esta rutina para sincronizar las operaciones en una cola independiente que mantiene el minidirector de red.

La rutina solo está disponible en Windows XP y Windows 2000.

Las macros siguientes se definen en el archivo de encabezado rxcontx.h que llama a las rutinas enumeradas en la tabla anterior. Estas macros se usan normalmente en lugar de llamar directamente a estas rutinas.

Macro Descripción

RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE)

Esta macro sincroniza el bloqueo de solicitudes de E/S en la misma cola de trabajo. En Windows Server 2003, esta macro llama a la rutina __RxSynchronizeBlockingOperations con el parámetro DropFcbLock establecido en FALSE.

En Windows XP y Windows 2000, esta macro llama a la rutina __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock con el parámetro DropFcbLock establecido en FALSE.

RxSynchronizeBlockingOperations(RXCONTEXT,FCB,IOQUEUE)

Esta macro sincroniza el bloqueo de solicitudes de E/S en la misma cola de trabajo. En Windows Server 2003, esta macro llama a la rutina __RxSynchronizeBlockingOperations con el parámetro DropFcbLock establecido en TRUE.

En Windows XP y Windows 2000, esta macro llama a la rutina __RxSynchronizeBlockingOperationsMaybeDroppingFcbLock con el parámetro DropFcbLock establecido en TRUE.