TAPE_PROCESS_COMMAND_ROUTINE fonction de rappel (minitape.h)

TAPE_PROCESS_COMMAND_ROUTINE gère les aspects spécifiques à l’appareil d’une demande IOCTL.

Syntaxe

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
)
{...}

Paramètres

[in, out] MinitapeExtension

Pointeur vers l’extension de mini-bande spécifique au pilote. Cette valeur est NULL si le pilote de la mini-classe n’a pas demandé d’extension de minitape lors de son initialisation.

[in, out] CommandExtension

Pointeur vers l’extension de commande. Cette valeur est NULL si le pilote de la miniclasse n’a pas demandé d’extension de commande lors de l’initialisation.

[in, out] CommandParameters

Pointeur vers une mémoire tampon allouée par l’appelant qui contient une structure TAPE_CREATE_PARTITION .

[in, out] Srb

Pointeur vers un SRB alloué et partiellement renseigné par le pilote de classe de bande. TAPE_PROCESS_COMMAND_ROUTINE devez renseigner le CDB dans le SRB.

  • Cdb : pointeur vers la base de données CDB SCSI pour la commande. Effacez la CDB avec TapeClassZeroMemory avant de la remplir.
  • CdbLength : spécifie le nombre d’octets dans la base de données CDB.
TAPE_PROCESS_COMMAND_ROUTINE peut également renseigner les membres suivants dans le SRB :
  • DataBuffer : pointeur vers la mémoire tampon de données à transférer. Utilisez TapeClassAllocateSrbBuffer pour allouer un DataBuffer d’une longueur supérieure ou égale à DataTransferLength.
  • DataTransferLength : spécifie le nombre d’octets à transférer dans le SRB. Ce membre est défini par TapeClassAllocateSrbBuffer.
  • TimeOutValue : spécifie une valeur de délai d’attente pour cette commande, en remplaçant la valeur de délai d’attente par défaut de l’extension de périphérique du pilote de classe de bande.
  • SrbFlags : spécifie un indicateur pour cette commande. Le pilote de miniclasse de bande doit définir SRB_FLAGS_DATA_OUT si le SRB envoie des données au lecteur de bande. Ce membre peut être égal à zéro si le SRB demande des données à partir du lecteur de bande ou si aucune donnée n’est transférée par la commande.

[in] CallNumber

Spécifie le nombre de fois où TAPE_PROCESS_COMMAND_ROUTINE a été appelé pour traiter une commande de bande donnée. CallNumber est égal à zéro la première fois que cette routine est appelée et est incrémentée pour chaque appel suivant jusqu’à ce que le pilote de miniclasse retourne une valeur TAPE_STATUS indiquant que la commande est terminée.

[in, optional] StatusOfLastCommand

Spécifie la status de la dernière commande. Dans le premier appel à TAPE_PROCESS_COMMAND_ROUTINE pour traiter une demande donnée, StatusOfLastCommand est TAPE_STATUS_SUCCESS. Dans les appels suivants, StatusOfLastCommand est TAPE_STATUS_SUCCESS ou une erreur status si une erreur s’est produite et que le pilote de miniclasse de bande défini RETURN_ERRORS dans RetryFlags lors de l’appel précédent.

[in, out] RetryFlags

Pointeur vers une variable qui spécifie l’action que le pilote de classe de bande doit effectuer lorsqu’un périphérique de bande signale une erreur.

Le mot d’ordre inférieur spécifie le nombre de nouvelles tentatives à effectuer en cas d’échec d’une commande SCSI. La valeur par défaut est zéro (aucune nouvelle tentative).

Le mot d’ordre élevé contient des indicateurs qui spécifient comment le pilote de classe de bande doit retourner le contrôle en cas d’erreur :

  • Si RETURN_ERRORS et IGNORE_ERRORS sont clairs (valeur par défaut), le pilote de classe de bande retourne une status d’échec au demandeur d’origine.
  • Si le pilote de miniclasse définit RETURN_ERRORS, le pilote de classe de bande appelle TAPE_PROCESS_COMMAND_ROUTINE avec StatusOfLastCommand défini sur un status d’échec.
  • Si le pilote de miniclasse définit IGNORE_ERRORS, le pilote de classe de bande convertit un status d’échec en réussite et appelle TAPE_PROCESS_COMMAND_ROUTINE avec StatusOfLastCommand défini sur success.

Valeur retournée

Code de retour Description
TAPE_STATUS_SEND_SRB_AND_CALLBACK
Indique au pilote de classe de bande que le SRB a été renseigné et qu’il est prêt à être envoyé à l’appareil cible. Par défaut, le pilote de classe de bande appelle TAPE_PROCESS_COMMAND_ROUTINE à nouveau uniquement si le SRB réussit. Un pilote de miniclasse peut modifier le comportement par défaut en définissant RetryFlags avant de retourner à partir de TAPE_PROCESS_COMMAND_ROUTINE.
TAPE_STATUS_CALLBACK
Indique au pilote de classe de bande d’incrémenter CallNumber et d’appeler à nouveau TAPE_PROCESS_COMMAND_ROUTINE sans envoyer de SRB au périphérique à bande.
TAPE_STATUS_CHECK_TEST_UNIT_READY
Indique au pilote de classe de bande de remplir un SRB pour la commande TEST UNIT READY et d’envoyer le SRB à l’appareil.
TAPE_STATUS_XXX
Tout autre code de retour indique au pilote de classe de bande que la commande est terminée et indique la réussite, l’échec ou l’avertissement. Les valeurs de retour d’achèvement possibles pour cette routine incluent, mais ne sont pas limitées à :
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

Remarques

Les fonctions suivantes peuvent être affectées à cet espace réservé de rappel :

CreatePartition

CreatePartition gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_CREATE_PARTITION . Cette routine est obligatoire. CreatePartition crée une partition sur une bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. La création d’une partition nécessite généralement une série de SSB pour terminer l’opération. Une fois que CreatePartition remplit un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil cible et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau TapeMiniCreatePartition .

CreatePartition doit renseigner les membres suivants dans le SRB avant de revenir au pilote de classe de bande :

Si le pilote de miniclasse de bande stocke les informations de partition dans l’extension minitape, CreatePartition met à jour l’extension avant de revenir au pilote de classe de bande avec TAPE_STATUS_SUCCESS.

Effacer

Erase gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_ERASE . Cette routine est obligatoire. Effacer efface une bande en remplissant la CDB dans un SRB transmis par le pilote de classe de bande. L’effacement d’une bande nécessite généralement un SRB pour terminer l’opération. Une fois que Erase a renseigné le SRB et retourné, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau Erase . Effacer retourne ensuite TAPE_STATUS_SUCCESS.

GetDriveParameters

GetDriveParameters gère les aspects spécifiques de l’appareil d’une demande de IOCTL_TAPE_GET_DRIVE_PARAMS . Cette routine est obligatoire. GetDriveParameters obtient les paramètres du lecteur de bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. L’obtention des paramètres de lecteur nécessite généralement une série de SRB pour terminer l’opération. Une fois que GetDriveParameters remplit un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil cible et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau GetDriveParameters .

GetMediaParameters

GetMediaParameters gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_GET_MEDIA_PARAMS . Cette routine est obligatoire. GetMediaParameters obtient les paramètres multimédias de bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. L’obtention de paramètres multimédias nécessite généralement plusieurs SRB pour terminer l’opération, en commençant par une unité de test prête que le pilote de la mini-classe demande en retournant TAPE_STATUS_CHECK_TEST_UNIT_READY la première fois que le pilote de classe de bande appelle la routine.

Une fois que GetMediaParameters remplit un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau GetMediaParameters.

GetMediaTypes

GetMediaTypes gère les aspects spécifiques à l’appareil d’une demande de IOCTL_STORAGE_GET_MEDIA_TYPES_EX . Cette routine est obligatoire. GetMediaTypes obtient des informations sur les types de médias pris en charge par un périphérique à bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. L’obtention de types multimédias nécessite généralement plusieurs SRB pour terminer l’opération, en commençant par une unité de test prête que le pilote de miniclasse demande en retournant TAPE_STATUS_CHECK_TEST_UNIT_READY la première fois que le pilote de classe de bande appelle la routine.

GetPosition

GetPosition gère les aspects spécifiques de l’appareil d’une demande de IOCTL_TAPE_GET_POSITION . Cette routine est obligatoire. GetPosition lit la position d’une bande en remplissant la CDB dans un SRB transmis par le pilote de classe de bande. La lecture de la position de la bande nécessite généralement plusieurs SRB pour terminer l’opération, en commençant souvent par une unité de test prête que le pilote de la mini-classe demande en retournant TAPE_STATUS_CHECK_TEST_UNIT_READY la première fois que le pilote de classe de bande appelle la routine.

GetStatus

GetStatus gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_GET_STATUS . Cette routine est obligatoire. GetStatus lit les status d’un périphérique à bande, généralement en demandant au pilote de classe de bande d’émettre une commande prête pour l’unité de test.

Si un appareil indique si un lecteur a besoin de nettoyer les données de sens (au lieu de signaler le besoin de nettoyage en tant qu’erreur, ce qu’un pilote de miniclasse gérerait dans sa routine TapeMiniTapeError ), GetStatus remplit la base de données CDB dans le SRB transmis par le pilote de classe de bande pour obtenir les données de détection et, si nécessaire, retourne TAPE_STATUS_REQUIRES_CLEANING.

Préparer

Prepare gère les aspects spécifiques de l’appareil d’une demande de IOCTL_TAPE_PREPARE . Cette routine est obligatoire. Prepare prépare une bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. Si l’appareil prend en charge l’opération demandée, la préparation d’une bande nécessite généralement un SRB. Une fois que Prepare a renseigné le SRB et retourné, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau Prepare .

SetDriveParameters

SetDriveParameters gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_SET_DRIVE_PARAMS . Cette routine est obligatoire. SetDriveParameters définit les paramètres d’un périphérique à bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. La définition des paramètres implique généralement une série de SSB pour terminer l’opération. Une fois que SetDriveParameters remplit un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau SetDriveParameters .

SetMediaParameters

SetMediaParameters gère les aspects spécifiques de l’appareil d’une demande de IOCTL_TAPE_SET_MEDIA_PARAMS . Cette routine est obligatoire. SetMediaParameters définit la taille de bloc d’une bande en remplissant la CDB dans un SRB transmis par le pilote de classe de bande. La définition de la taille de bloc nécessite généralement plusieurs SRB pour terminer l’opération, en commençant par une unité de test prête que le pilote de la mini-classe demande en retournant TAPE_STATUS_CHECK_TEST_UNIT_READY la première fois que le pilote de classe de bande appelle la routine.

Une fois que SetMediaParameters a rempli un SRB donné et est retourné, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau SetMediaParameters .

SetPosition

SetPosition gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_SET_POSITION . Cette routine est obligatoire. SetPosition définit la position d’une bande en remplissant la base de données CDB dans un SRB transmis par le pilote de classe de bande. La définition de la position nécessite généralement un SRB. Une fois que SetPosition a renseigné le SRB et retourné, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau SetPosition . SetPosition retourne ensuite TAPE_STATUS_SUCCESS.

WriteMarks

WriteMarks gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_WRITE_MARKS . Cette routine est obligatoire. WriteMarks écrit des marques dans une bande en remplissant la CDB dans un SRB transmis par le pilote de classe de bande. L’écriture de marques nécessite généralement un SRB pour terminer l’opération. Une fois que WriteMarks a renseigné le SRB et retourné, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat du SRB et de la valeur de RetryFlags, appelle à nouveau WriteMarks . WriteMarks retourne ensuite TAPE_STATUS_SUCCESS.

PreProcessReadWrite

PreProcessReadWrite est une routine facultative à usage spécial qui effectue toutes les opérations spécifiques à l’appareil requises avant les opérations de lecture et d’écriture. La plupart des pilotes de miniclasse sur bande n’ont pas besoin de cette routine. Les activités de la routine PreProcessReadWrite sont spécifiques à l’appareil. La routine peut utiliser les informations qui lui sont transmises par le pilote de classe pour implémenter un prétraitement spécial pour les lectures et les écritures. Si un lecteur a des capacités limitées, il peut avoir besoin de cette routine pour maintenir un état cohérent, par exemple.

Si un pilote de miniclasse de bande définit un point d’entrée non NULL pour cette routine dans la structure TAPE_INIT_DATA_EX qu’il transmet à TapeClassInitialize à partir de sa routine DriverEntry , le pilote de classe de bande l’appelle avant chaque opération de lecture et d’écriture sur le périphérique à bande. Le pilote de classe n’attend aucune information de cette routine.

WMIOperations

WMIOperations est le point d’entrée commun pour tous les appels WMI à partir du pilote de classe de bande. Un minidriver qui prend en charge WMI doit définir le membre du pointeur de fonction , WMIOperations, dans la structure TAPE_INIT_DATA_EX pour qu’il pointe vers la routine TAPE_PROCESS_COMMAND_ROUTINE du minidriver. Le minidriver doit effectuer cette opération dans sa routine DriverEntry avant d’appeler TapeClassInitialize. Si un minidriver ne prend pas en charge les opérations WMI, il doit définir le champ TapeWMIOperations sur NULL.

Le pilote de classe de bande affecte des valeurs aux membres de TAPE_WMI_OPERATIONS structure et transmet cette structure à la routine WMIOperations du minidriver dans le paramètre CommandParameters . Comme avec d’autres routines de minidriver, WMIOperations remplit, crée et initialise les blocs de requête SCSI (SRB) et les blocs de descripteur de commande (CDB) nécessaires pour implémenter la méthode WMI indiquée, et retourne le contrôle au pilote de classe de bande. Le pilote de classe de bande appelle ensuite le pilote de port pour exécuter la requête.

Le minidriver retourne les données WMI dans la mémoire tampon pointée par le membre DataBuffer de la structure TAPE_WMI_OPERATIONS.

Configuration requise

Condition requise Valeur
Plateforme cible Desktop (Expérience utilisateur)
En-tête minitape.h (inclure Minitape.h)

Voir aussi

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory