Routine BuildRequest du pilote de classe de stockage
Comme tous les pilotes en mode noyau de niveau supérieur, un pilote de classe de stockage doit configurer l’emplacement de la pile d’E/S de l’IRP pour le pilote inférieur suivant lors de la gestion des demandes adressées aux périphériques de stockage. Dans les IRP que le pilote de classe configure avec des SDR pour le pilote de port fourni par le système, l’emplacement de la pile d’E/S du pilote de port est défini comme suit :
MajorFunction contient IRP_MJ_SCSI
Parameters.Scsi.Srb contient un pointeur vers le SRB
Chaque pilote de classe est responsable de l’allocation de la mémoire pour les SDR, ainsi que de leur configuration avec des cdBs pour le pilote de port de stockage sous-jacent. Le pilote de classe peut configurer une liste de recherche pour ses SB avec ExInitializeNPageLookasideList ou appeler ExAllocatePool pour la mémoire non paginée. Pour plus d’informations sur l’utilisation des listes de recherche et du pool non paginé, consultez Utilisation de listes de recherche.
Qu’il alloue de la mémoire à partir d’un pool ou d’une liste de recherche créée par un pilote, chaque pilote de classe de stockage est responsable de libérer la mémoire qu’il alloue pour les SB. Les routines IoCompletion des pilotes de classe de stockage, décrites dans Routines IoCompletion des pilotes de classe de stockage, libèrent généralement la mémoire allouée pour les SBA dans une liste de recherche.
La routine BuildRequest d’un pilote de classe doit définir les valeurs appropriées dans les membres SRB, y compris la longueur de la CDB qu’il a configurée pour communiquer avec son appareil. Pour les demandes qui retournent des informations sur l’sens de la demande et/ou dont le pilote peut avoir besoin de réessayer, il définit une routine IoCompletion dans l’IRP. Pour les demandes de lecture ou d’écriture, il oR les SrbFlags avec le sens de transfert approprié, SRB_FLAGS_DATA_IN ou SRB_FLAGS_DATA_OUT, respectivement.
Une routine BuildRequest peut partager la responsabilité de la configuration d’un SRB avec une paire de routines SendSrbSynchronous et SendSrbAsynchronous . Autrement dit, la routine BuildRequest peut configurer les membres SRB qui sont généralement configurés pour toutes les requêtes, tandis que la routine SendSrbXxx définit chaque valeur SRB définie uniquement pour chaque type de requête. Lorsqu’un IRP est transmis au pilote de port à partir d’une routine SendSrbAsynchronous , l’IRP doit être configuré avec une routine IoCompletion fournie par le pilote.
Une fois le pilote de classe chargé, il configure la plupart des SBS avec le membre Function défini sur SRB_FUNCTION_EXECUTE_SCSI, indiquant qu’une demande d’E/S d’appareil doit être envoyée par le bus.
Pour plus d’informations sur les membres SRB définis par le système et leurs valeurs, consultez SCSI_REQUEST_BLOCK.
Configuration des SBS pour l’sens de la demande
Un pilote de classe peut demander que le pilote de port retourne un sens de requête SCSI ou des informations équivalentes lorsque le contrôleur cible retourne une condition case activée. Pour ce faire, le pilote de classe configure le pointeur SenseInfoBuffer et SenseInfoBufferLength dans le SRB, afin que le pilote de port puisse retourner les informations de sens de la demande si une condition de case activée se produit. Le pilote de port indique qu’il a retourné des informations de sens de requête en définissant le membre SrbStatus avec SRB_STATUS_AUTOSENSE_VALID lorsqu’il retourne l’IRP. Pour plus d’informations sur les routines InterpretSenseInfo , consultez La routine InterpretRequestSense du pilote de classe de stockage.
Tentatives
Les pilotes de classe de stockage sont responsables des nouvelles tentatives de demandes qui échouent en raison d’erreurs de cible/de contrôleur, de réinitialisations de bus ou de délais d’expiration des demandes. Par conséquent, de nombreux pilotes de classe conservent un nombre de nouvelles tentatives dans leur propre emplacement de pile d’E/S de l’IRP. La routine BuildRequest d’un tel pilote de classe peut également initialiser la limite de nouvelles tentatives pour une requête donnée avant de configurer sa routine IoCompletion et d’envoyer l’IRP au pilote de port. Pour plus d’informations sur les routines RetryRequest , consultez La routine retryRequest du pilote de classe de stockage.