Sincronización del uso de un puerto paralelo
Los clientes deben sincronizar su uso de un puerto paralelo asignando un puerto paralelo antes de usarlo y liberando el puerto una vez que hayan terminado de usarlo.
Como alternativa, un cliente puede seleccionar y anular la selección de un dispositivo IEEE 1284.3 (que asigna y libera automáticamente un puerto paralelo), consulte Selección y deselección de un dispositivo IEEE 1284 conectado a un puerto paralelo.
Un cliente usa las siguientes solicitudes de control de dispositivo para asignar y liberar un puerto paralelo:
IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE
IOCTL_INTERNAL_PARALLEL_PORT_FREE
Un cliente en modo kernel también puede usar las rutinas de devolución de llamada de puerto paralelo proporcionadas por el sistema que se obtienen mediante una solicitud de IOCTL_INTERNAL_GET_PARALLEL_PORT_INFO . Esta solicitud devuelve una estructura PARALLEL_PORT_INFORMATION que incluye los siguientes punteros a las devoluciones de llamada proporcionadas por el sistema:
El miembro TryAllocatePort es un puntero a una devolución de llamada PPARALLEL_TRY_ALLOCATE_ROUTINE , que es una rutina de no bloqueo que intenta asignar un puerto paralelo.
El miembro QueryNumWaiters es un puntero a una devolución de llamada PPARALLEL_QUERY_WAITERS_ROUTINE , que devuelve el número de solicitudes de asignación de puerto y de selección de dispositivos que se ponen en cola en la cola de trabajo de un puerto paralelo.
El miembro FreePort es un puntero a una devolución de llamada PPARALLEL_FREE_ROUTINE , que libera un puerto paralelo.
La solicitud de IOCTL_INTERNAL_PARALLEL_PORT_ALLOCATE requiere el menor control por parte de un cliente porque el controlador de funciones proporcionado por el sistema para los puertos paralelos pone en cola la solicitud del cliente si el puerto paralelo ya está asignado. El controlador de función completa una solicitud de asignación con un estado de STATUS_SUCCESS después de asignar el puerto a un cliente. Un cliente puede cancelar una solicitud de asignación pendiente en cualquier momento debido a un retraso de tiempo de espera inaceptable o a alguna otra condición específica del dispositivo.
Nota La devolución de llamada PPARALLEL_TRY_ALLOCATE_ROUTINE devuelve inmediatamente (no se bloquea). Si un cliente usa solo la devolución de llamada de PPARALLEL_TRY_ALLOCATE_ROUTINE para intentar asignar un puerto paralelo para el que otros clientes están contendiendo, es posible que el controlador de función de puerto paralelo nunca asigne el puerto al cliente. Para garantizar el éxito, un cliente debe usar una solicitud de asignación de puerto en paralelo. (El controlador de funciones de puerto paralelo pone en cola y, posteriormente, procesa las solicitudes de selección de puertos y de asignación de puertos en el orden en que se reciben las solicitudes).
Después de que el controlador de función de puerto paralelo asigne un puerto paralelo a un cliente, el cliente tiene acceso exclusivo al puerto. El cliente debe llamar a la devolución de llamada PPARALLEL_FREE_ROUTINE para liberar el puerto. Una vez que el cliente libera el puerto, el controlador de función de puerto paralelo quita la siguiente solicitud (una solicitud de selección de dispositivo o asignación de puerto), si existe, de la cola de trabajo del puerto y completa la solicitud.
Un cliente debe usar el PPARALLEL_QUERY_WAITERS_ROUTINE devolución de llamada para determinar si hay otros clientes que esperan un puerto paralelo. Un cliente que necesite asignar un puerto durante un período prolongado de tiempo debe llamar periódicamente a la devolución de llamada PPARALLEL_QUERY_WAITERS_ROUTINE para determinar si otros clientes están esperando adquirir el puerto y, si los clientes están esperando, liberen el puerto lo antes posible.