Compartir a través de


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.
TAPE_PROCESS_COMMAND_ROUTINE también puede rellenar los siguientes miembros en la SRB:
  • 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
TAPE_STATUS_SEND_SRB_AND_CALLBACK
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.
TAPE_STATUS_CALLBACK
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.
TAPE_STATUS_CHECK_TEST_UNIT_READY
Dirige el controlador de clase de cinta para rellenar un SRB para el comando TEST UNIT READY y enviar el SRB al dispositivo.
TAPE_STATUS_XXX
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:
TAPE_STATUS_SUCCESS
TAPE_STATUS_INSUFFICIENT_RESOURCES
TAPE_STATUS_INVALID_DEVICE_REQUEST
TAPE_STATUS_INVALID_PARAMETER
TAPE_STATUS_IO_DEVICE_ERROR
TAPE_STATUS_MEDIA_WRITE_PROTECTED
TAPE_STATUS_NOT_IMPLEMENTED

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

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory