TAPE_PROCESS_COMMAND_ROUTINE función de devolución de llamada (minitape.h)
TAPE_PROCESS_COMMAND_ROUTINE controla los aspectos específicos del dispositivo de una solicitud IOCTL.
Sintaxis
TAPE_PROCESS_COMMAND_ROUTINE TapeProcessCommandRoutine;
TAPE_STATUS TapeProcessCommandRoutine(
[in, out] PVOID MinitapeExtension,
[in, out] PVOID CommandExtension,
[in, out] PVOID CommandParameters,
[in, out] PSCSI_REQUEST_BLOCK Srb,
[in] ULONG CallNumber,
[in, optional] TAPE_STATUS StatusOfLastCommand,
[in, out] PULONG RetryFlags
)
{...}
Parámetros
[in, out] MinitapeExtension
Puntero a la extensión de minitape específica del controlador. Esto es NULL si el controlador de miniclase no solicitó una extensión de minitape cuando se inicializó.
[in, out] CommandExtension
Puntero a la extensión de comando. Esto es NULL si el controlador de miniclase no solicitó una extensión de comando cuando se inicializó.
[in, out] CommandParameters
Puntero a un búfer asignado por el llamador que contiene una estructura de TAPE_CREATE_PARTITION .
[in, out] Srb
Puntero a una SRB asignada y rellena parcialmente por el controlador de clase de cinta. TAPE_PROCESS_COMMAND_ROUTINE debe rellenar el CDB en la SRB.
- Cdb : puntero al CDB SCSI para el comando. Borre el CDB con TapeClassZeroMemory antes de rellenarlo.
- CdbLength : especifica el número de bytes del CDB.
- DataBuffer : puntero al búfer de datos que se va a transferir. Use TapeClassAllocateSrbBuffer para asignar un objeto DataBuffer de longitud mayor o igual que DataTransferLength.
- DataTransferLength : especifica el número de bytes que se van a transferir en la SRB. Este miembro lo establece TapeClassAllocateSrbBuffer.
- TimeOutValue : especifica un valor de tiempo de espera para este comando, reemplazando el valor de tiempo de espera predeterminado de la extensión de dispositivo del controlador de clase de cinta.
- SrbFlags : especifica una marca para este comando. El controlador de miniclase de cinta debe establecer SRB_FLAGS_DATA_OUT si la SRB envía datos a la unidad de cinta. Este miembro puede ser cero si la SRB solicita datos de la unidad de cinta o si el comando no transfiere ningún dato.
[in] CallNumber
Especifica el número de veces que se ha llamado a TAPE_PROCESS_COMMAND_ROUTINE para procesar un comando de cinta determinado. CallNumber es cero la primera vez que se llama a esta rutina y se incrementa para cada llamada posterior hasta que el controlador de miniclase devuelve un valor TAPE_STATUS que indica que el comando está completo.
[in, optional] StatusOfLastCommand
Especifica el estado del último comando. En la primera llamada a TAPE_PROCESS_COMMAND_ROUTINE para procesar una solicitud determinada, StatusOfLastCommand se TAPE_STATUS_SUCCESS. En llamadas posteriores, StatusOfLastCommand es TAPE_STATUS_SUCCESS o un estado de error si se produjo un error y el controlador de miniclase de cinta establecido RETURN_ERRORS en RetryFlags en la llamada anterior.
[in, out] RetryFlags
Puntero a una variable que especifica qué acción debe realizar el controlador de clase de cinta cuando un dispositivo de cinta notifica un error.
La palabra de orden bajo especifica el número de reintentos que se van a realizar en caso de error de comando SCSI. El valor predeterminado es cero (sin reintentos).
La palabra de orden superior contiene marcas que especifican cómo debe devolver el control el controlador de clase de cinta si se produce un error:
- Si RETURN_ERRORS y IGNORE_ERRORS están claros (valor predeterminado), el controlador de clase de cinta devuelve un estado de error al solicitante original.
- Si el controlador de miniclase establece RETURN_ERRORS, el controlador de clase de cinta llama TAPE_PROCESS_COMMAND_ROUTINE con StatusOfLastCommand establecido en un estado de error.
- Si el controlador de miniclase establece IGNORE_ERRORS, el controlador de clase de cinta convierte un estado de error en correcto y llama a TAPE_PROCESS_COMMAND_ROUTINE con StatusOfLastCommand establecido en correcto.
Valor devuelto
Código devuelto | Descripción |
---|---|
|
Indica al controlador de clase de cinta que se ha rellenado la SRB y está listo para enviarse al dispositivo de destino. De forma predeterminada, el controlador de clase de cinta llama a TAPE_PROCESS_COMMAND_ROUTINE de nuevo solo si la SRB se realiza correctamente. Un controlador de miniclase puede modificar el comportamiento predeterminado estableciendo RetryFlags antes de volver de TAPE_PROCESS_COMMAND_ROUTINE. |
|
Dirige el controlador de clase de cinta para incrementar CallNumber y llamar a TAPE_PROCESS_COMMAND_ROUTINE de nuevo sin enviar una SRB al dispositivo de cinta. |
|
Dirige el controlador de clase de cinta para rellenar un SRB para el comando TEST UNIT READY y enviar el SRB al dispositivo. |
|
Cualquier otro código de retorno indica al controlador de clase de cinta que el comando está completo e indica que el comando se ha realizado correctamente, error o advertencia. Entre los posibles valores devueltos de finalización para esta rutina se incluyen, entre otros:
|
Comentarios
Las siguientes funciones se pueden asignar a este marcador de posición de devolución de llamada:
CreatePartition
CreatePartition controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_CREATE_PARTITION . Esta rutina es necesaria. CreatePartition crea una partición en una cinta rellenando el CDB en una SRB pasada por el controlador de clase de cinta. La creación de una partición normalmente requiere una serie de SRB para completar la operación. Después de que CreatePartition rellene una SRB determinada y devuelva, el controlador de clase de cinta envía el SRB al dispositivo de destino y, según el resultado de la SRB y el valor de RetryFlags, llama a TapeMiniCreatePartition de nuevo.CreatePartition debe rellenar los siguientes miembros en la SRB antes de volver al controlador de clase de cinta:
Si el controlador de miniclase de cinta almacena información de partición en la extensión de minitape, CreatePartition actualiza la extensión antes de volver al controlador de clase de cinta con TAPE_STATUS_SUCCESS.
Borrar
Borrar controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_ERASE . Esta rutina es necesaria. Borrar borra una cinta rellenando el CDB en una SRB pasada por el controlador de clase de cinta. La eliminación de una cinta normalmente requiere una SRB para completar la operación. Después de borrar rellena la SRB y vuelve, el controlador de clase de cinta envía el SRB al dispositivo y, según el resultado de la SRB y el valor de RetryFlags, llama a Erase de nuevo. Borrar después devuelve TAPE_STATUS_SUCCESS.GetDriveParameters
GetDriveParameters controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_GET_DRIVE_PARAMS . Esta rutina es necesaria. GetDriveParameters obtiene parámetros de unidad de cinta rellenando el CDB en una SRB pasada por el controlador de clase de cinta. La obtención de parámetros de unidad normalmente requiere una serie de SRB para completar la operación. Después de que GetDriveParameters rellene una SRB determinada y devuelva, el controlador de clase de cinta envía el SRB al dispositivo de destino y, según el resultado de la SRB y el valor de RetryFlags, llama a GetDriveParameters de nuevo.GetMediaParameters
GetMediaParameters controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_GET_MEDIA_PARAMS . Esta rutina es necesaria. GetMediaParameters obtiene parámetros de medios de cinta rellenando el CDB en una SRB pasada por el controlador de clase de cinta. La obtención de parámetros multimedia normalmente requiere más de una SRB para completar la operación, empezando por una unidad de prueba lista para la que el controlador de miniclase solicita devolviendo TAPE_STATUS_CHECK_TEST_UNIT_READY la primera vez que el controlador de clase de cinta llama a la rutina.Después de que GetMediaParameters rellene una SRB determinada y vuelva, el controlador de clase de cinta envía el SRB al dispositivo y, según el resultado de la SRB y el valor de RetryFlags, llama a GetMediaParameters de nuevo.
GetMediaTypes
GetMediaTypes controla los aspectos específicos del dispositivo de una solicitud de IOCTL_STORAGE_GET_MEDIA_TYPES_EX . Esta rutina es necesaria. GetMediaTypes obtiene información sobre los tipos de medios admitidos por un dispositivo de cinta rellenando el CDB en una SRB pasada por el controlador de clase de cinta. La obtención de tipos de medios normalmente requiere más de una SRB para completar la operación, empezando por una unidad de prueba lista que el controlador de miniclase solicita devolviendo TAPE_STATUS_CHECK_TEST_UNIT_READY la primera vez que el controlador de clase de cinta llama a la rutina.GetPosition
GetPosition controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_GET_POSITION . Esta rutina es necesaria. GetPosition lee la posición de una cinta rellenando el CDB en una SRB pasada por el controlador de clase de cinta. La posición de la cinta de lectura normalmente requiere más de una SRB para completar la operación, a menudo empezando por una unidad de prueba lista para la que el controlador de miniclase solicita devolviendo TAPE_STATUS_CHECK_TEST_UNIT_READY la primera vez que el controlador de clase de cinta llama a la rutina.GetStatus
GetStatus controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_GET_STATUS . Esta rutina es necesaria. GetStatus lee el estado de un dispositivo de cinta, normalmente al dirigir el controlador de clase de cinta para emitir un comando listo para la unidad de prueba.Si un dispositivo indica si una unidad necesita limpiar los datos de sentido (en lugar de notificar la necesidad de limpiar como un error, que un controlador de miniclase controlaría en su rutina TapeMiniTapeError ), GetStatus rellena el CDB en el SRB pasado por el controlador de clase de cinta para obtener los datos de sentido y, si es necesario, devuelve TAPE_STATUS_REQUIRES_CLEANING.
Preparar
Prepare controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_PREPARE . Esta rutina es necesaria. Prepare la preparación de una cinta rellenando el CDB en un SRB pasado por el controlador de clase de cinta. Si el dispositivo admite la operación solicitada, la preparación de una cinta normalmente requiere un SRB. Después de preparar rellena el SRB y vuelve, el controlador de clase de cinta envía el SRB al dispositivo y, dependiendo del resultado de la SRB y el valor de RetryFlags, llama a Prepare de nuevo.SetDriveParameters
SetDriveParameters controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_SET_DRIVE_PARAMS . Esta rutina es necesaria. SetDriveParameters establece parámetros para un dispositivo de cinta rellenando el CDB en un SRB pasado por el controlador de clase de cinta. Establecer parámetros normalmente implica una serie de SRB para completar la operación. Después de que SetDriveParameters rellene un SRB determinado y vuelva, el controlador de clase de cinta envía el SRB al dispositivo y, dependiendo del resultado del SRB y el valor de RetryFlags, llama a SetDriveParameters de nuevo.SetMediaParameters
SetMediaParameters controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_SET_MEDIA_PARAMS . Esta rutina es necesaria. SetMediaParameters establece el tamaño de bloque de una cinta rellenando la CDB en un SRB pasado por el controlador de clase de cinta. El establecimiento del tamaño de bloque normalmente requiere más de un SRB para completar la operación, empezando por una unidad de prueba lista para que el controlador de miniclase solicite devolviendo TAPE_STATUS_CHECK_TEST_UNIT_READY la primera vez que el controlador de clase de cinta llama a la rutina.Después de que SetMediaParameters rellene un SRB determinado y vuelva, el controlador de clase de cinta envía el SRB al dispositivo y, dependiendo del resultado del SRB y el valor de RetryFlags, llama a SetMediaParameters de nuevo.
SetPosition
SetPosition controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_SET_POSITION . Esta rutina es necesaria. SetPosition establece la posición de una cinta rellenando el CDB en un SRB pasado por el controlador de clase de cinta. La configuración de la posición normalmente requiere un SRB. Después de que SetPosition rellene el SRB y vuelva, el controlador de clase de cinta envía el SRB al dispositivo y, dependiendo del resultado de la SRB y el valor de RetryFlags, llama a SetPosition de nuevo. SetPosition devuelve TAPE_STATUS_SUCCESS.WriteMarks
WriteMarks controla los aspectos específicos del dispositivo de una solicitud de IOCTL_TAPE_WRITE_MARKS . Esta rutina es necesaria. WriteMarks escribe marcas en una cinta rellenando el CDB en un SRB pasado por el controlador de clase de cinta. Normalmente, la escritura de marcas toma un SRB para completar la operación. Después de que WriteMarks rellene el SRB y vuelva, el controlador de clase de cinta envía el SRB al dispositivo y, dependiendo del resultado de la SRB y el valor de RetryFlags, llama de nuevo a WriteMarks . WriteMarks devuelve TAPE_STATUS_SUCCESS.PreProcessReadWrite
PreProcessReadWrite es una rutina opcional de propósito especial que realiza las operaciones específicas del dispositivo necesarias antes de las operaciones de lectura y escritura. La mayoría de los controladores de miniclase de cinta no necesitan esta rutina. Las actividades de la rutina PreProcessReadWrite son específicas del dispositivo. La rutina puede usar la información que le pasa el controlador de clase para implementar el preprocesamiento especial para lecturas y escrituras. Si una unidad tiene funcionalidades limitadas, es posible que el controlador necesite esta rutina para mantener un estado coherente, por ejemplo.Si un controlador de miniclase de cinta establece un punto de entrada distinto de NULL para esta rutina en la estructura TAPE_INIT_DATA_EX pasa a TapeClassInitialize desde su rutina DriverEntry , el controlador de clase de cinta lo llama antes de cada operación de lectura y escritura en el dispositivo de cinta. El controlador de clase no espera ninguna información de esta rutina.
WMIOperations
WMIOperations es el punto de entrada común para todas las llamadas WMI desde el controlador de clase de cinta. Un minidriver que admita WMI debe establecer el miembro del puntero de función, WMIOperations, en la estructura TAPE_INIT_DATA_EX apuntar a la rutina de TAPE_PROCESS_COMMAND_ROUTINE del minidriver. El minidriver debe hacerlo en su rutina DriverEntry antes de llamar a TapeClassInitialize. Si un minidriver no admite operaciones WMI, debe establecer el campo TapeWMIOperations en NULL.El controlador de clase de cinta asigna valores a los miembros de TAPE_WMI_OPERATIONS estructura y pasa esta estructura a la rutina WMIOperations del minidriver en el parámetro CommandParameters . Al igual que con otras rutinas de minidriver, WMIOperations rellena, crea e inicializa los bloques de solicitud SCSI (SRB) y los bloques de descriptores de comandos (CDB) necesarios para implementar el método WMI indicado y devuelve el control al controlador de clase de cinta. A continuación, el controlador de clase de cinta llama al controlador de puerto para ejecutar la solicitud.
El minidriver devuelve los datos WMI del búfer al que apunta el miembro DataBuffer de la estructura TAPE_WMI_OPERATIONS.
Requisitos
Requisito | Value |
---|---|
Plataforma de destino | Escritorio |
Encabezado | minitape.h (incluya Minitape.h) |
Consulte también
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de