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.
- 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 |
---|---|
|
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. |
|
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. |
|
Indique au pilote de classe de bande de remplir un SRB pour la commande TEST UNIT READY et d’envoyer le SRB à l’appareil. |
|
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 à :
|
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
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour