Partager via


TAPE_PROCESS_COMMAND_ROUTINE fonction de rappel (minitape.h)

TAPE_PROCESS_COMMAND_ROUTINE gère les aspects spécifiques de 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 minitape spécifique au pilote. Il s’agit NULL si le pilote de miniclasse n’a pas demandé d’extension de minitape lorsqu’il a initialisé.

[in, out] CommandExtension

Pointeur vers l’extension de commande. Il s’agit NULL si le pilote miniclass n’a pas demandé d’extension de commande lors de son 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 rempli par le pilote de classe de bande. TAPE_PROCESS_COMMAND_ROUTINE devez renseigner la CDB dans la 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 CDB.
TAPE_PROCESS_COMMAND_ROUTINE peut également renseigner les membres suivants dans la SRB :
  • DataBuffer : pointeur vers la mémoire tampon de données à transférer. Utilisez TapeClassAllocateSrbBuffer pour allouer une DataBuffer de 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ée 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 qui indique que la commande est terminée.

[in, optional] StatusOfLastCommand

Spécifie l’état de la dernière commande. Dans le premier appel de 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 un état d’erreur si une erreur s’est produite et que le pilote de miniclasse bande défini RETURN_ERRORS dans RetryFlags dans 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 prendre lorsqu’un périphérique de bande signale une erreur.

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

Le mot à ordre élevé contient des indicateurs qui spécifient la façon dont le pilote de classe de bande doit retourner le contrôle si une erreur se produit :

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

Valeur de retour

Retourner le code Description
TAPE_STATUS_SEND_SRB_AND_CALLBACK
Indique au pilote de classe de bande que le SRB a été rempli et 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 miniclasse peut modifier le comportement par défaut en définissant RetryFlags avant de revenir de TAPE_PROCESS_COMMAND_ROUTINE.
TAPE_STATUS_CALLBACK
Dirige le pilote de classe de bande pour incrémenter CallNumber et appeler TAPE_PROCESS_COMMAND_ROUTINE à nouveau sans envoyer de SRB au périphérique de bande.
TAPE_STATUS_CHECK_TEST_UNIT_READY
Dirige le pilote de classe de bande à remplir une 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 de saisie semi-automatique 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 de l’appareil d’une demande de IOCTL_TAPE_CREATE_PARTITION. Cette routine est requise. CreatePartition crée une partition sur une bande en remplissant la base de données CDB dans un SRB passé par le pilote de classe de bande. La création d’une partition nécessite généralement une série de SSR pour terminer l’opération. Après CreatePartition renseigne un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil cible et, selon le résultat du SRB et la valeur de RetryFlags, appelle TapeMiniCreatePartition.

CreatePartition devez renseigner les membres suivants dans la 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

Effacer gère les aspects spécifiques de l’appareil d’une demande de IOCTL_TAPE_ERASE. Cette routine est requise. Effacer efface une bande en remplissant la CDB dans un SRB passé par le pilote de classe de bande. L’effacement d’une bande nécessite généralement une SRB pour terminer l’opération. Après effacer remplit le SRB 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 Effacer à nouveau. Effacer puis retourne TAPE_STATUS_SUCCESS.

GetDriveParameters

GetDriveParameters gère les aspects spécifiques de l’appareil d’une requête IOCTL_TAPE_GET_DRIVE_PARAMS. Cette routine est requise. GetDriveParameters obtient des paramètres de lecteur de bande en remplissant la base de données CDB dans un SRB passé par le pilote de classe de bande. L’obtention des paramètres de lecteur nécessite généralement une série de SSR pour terminer l’opération. Après GetDriveParameters renseigne un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil cible et, selon le résultat du SRB et la valeur de RetryFlags, appelle GetDriveParameters.

GetMediaParameters

GetMediaParameters gère les aspects spécifiques de l’appareil d’une requête IOCTL_TAPE_GET_MEDIA_PARAMS. Cette routine est requise. GetMediaParameters obtient des paramètres multimédias sur bande en remplissant la base de données CDB dans un SRB passé 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 pour laquelle le pilote miniclasse demande en retournant TAPE_STATUS_CHECK_TEST_UNIT_READY la première fois que le pilote de classe de bande appelle la routine.

Après GetMediaParameters renseigne 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 de nouveau GetMediaParameters.

GetMediaTypes

GetMediaTypes gère les aspects spécifiques à l’appareil d’une requête IOCTL_STORAGE_GET_MEDIA_TYPES_EX. Cette routine est requise. GetMediaTypes obtient des informations sur les types de supports pris en charge par un périphérique de 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 pour laquelle le pilote 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 requise. GetPosition lit la position d’une bande en remplissant la CDB dans un SRB passé par le pilote de classe de bande. La lecture de la position de bande nécessite généralement plusieurs SRB pour terminer l’opération, en commençant souvent par une unité de test prête pour laquelle le pilote miniclasse 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 de l’appareil d’une requête IOCTL_TAPE_GET_STATUS. Cette routine est requise. GetStatus lit l’état d’un périphérique de bande, généralement en dirigeant le pilote de classe de bande pour émettre une commande prête pour l’unité de test.

Si un appareil indique si un lecteur a besoin d’un nettoyage dans le sens des données (par opposition à la nécessité de le nettoyer en tant qu’erreur, qu’un pilote de miniclasse gère dans sa routine TapeMiniTapeError), GetStatus remplit la base de données CDB dans le SRB passé par le pilote de classe de bande pour obtenir les données de sens et, si nécessaire, retourne TAPE_STATUS_REQUIRES_CLEANING.

Préparer

Préparer gère les aspects spécifiques de l’appareil d’une demande de IOCTL_TAPE_PREPARE. Cette routine est requise. Préparer prépare une bande en remplissant la CDB dans un SRB passé 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 une SRB. Après Prepare renseigne le SRB et retourne, le pilote de classe de bande envoie le SRB à l’appareil et, en fonction du résultat de la SRB et de la valeur de RetryFlags, appelle Prepare.

SetDriveParameters

SetDriveParameters gère les aspects spécifiques de l’appareil d’une requête IOCTL_TAPE_SET_DRIVE_PARAMS. Cette routine est requise. SetDriveParameters définit des paramètres pour un périphérique de bande en remplissant la base de données CDB dans un SRB passé par le pilote de classe de bande. La définition des paramètres implique généralement une série de SSR pour terminer l’opération. Après SetDriveParameters renseigne un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil et, selon le résultat du SRB et la valeur de RetryFlags, appelle SetDriveParameters.

SetMediaParameters

SetMediaParameters gère les aspects spécifiques de l’appareil d’une requête IOCTL_TAPE_SET_MEDIA_PARAMS. Cette routine est requise. SetMediaParameters définit la taille de bloc d’une bande en remplissant la base de données CDB dans un SRB passé 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 pour laquelle le pilote miniclasse demande en retournant TAPE_STATUS_CHECK_TEST_UNIT_READY la première fois que le pilote de classe de bande appelle la routine.

Après SetMediaParameters renseigne un SRB donné et retourne, le pilote de classe de bande envoie le SRB à l’appareil et, selon le résultat du SRB et la valeur de RetryFlags, appelle SetMediaParameters.

SetPosition

SetPosition gère les aspects spécifiques à l’appareil d’une demande de IOCTL_TAPE_SET_POSITION. Cette routine est requise. SetPosition définit la position d’une bande en remplissant la CDB dans un SRB passé par le pilote de classe de bande. La définition de la position nécessite généralement une SRB. Après SetPosition remplit le SRB 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 SetPosition. SetPosition retourne ensuite TAPE_STATUS_SUCCESS.

WriteMarks

WriteMarks gère les aspects spécifiques de l’appareil d’une requête IOCTL_TAPE_WRITE_MARKS. Cette routine est requise. WriteMarks écrit des marques dans une bande en remplissant la base de données CDB dans un SRB passé par le pilote de classe de bande. L’écriture de marques prend généralement une SRB pour terminer l’opération. Après WriteMarks remplit le SRB 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 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 miniclasses 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 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 fonctionnalités limitées, le pilote 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 null nonNULL pour cette routine dans la structure TAPE_INIT_DATA_EX qu’il passe à TapeClassInitialize à partir de sa routine DriverEntry, le pilote de classe bande l’appelle avant chaque opération de lecture et d’écriture sur le périphérique de bande. Le pilote de classe ne s’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 prenant en charge WMI doit définir le membre du pointeur de fonction, WMIOperations, dans la structure TAPE_INIT_DATA_EX pointer vers la routine TAPE_PROCESS_COMMAND_ROUTINE du minidriver. Le minidriver doit le faire 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 la structure TAPE_WMI_OPERATIONS et transmet cette structure à la routine WMIOperations de minidriver dans le paramètre CommandParameters. Comme pour d’autres routines minidriver, WMIOperations remplit, crée et initialise les blocs de requête SCSI (SRB) et les blocs de descripteur de commande (CDB) requis 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ées par le membre DataBuffer de la structure TAPE_WMI_OPERATIONS.

Exigences

Exigence Valeur
plateforme cible Bureau
d’en-tête minitape.h (include Minitape.h)

Voir aussi

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory