Implémentation d’un pilote miniport virtuel Storport

Cette page fournit des informations générales sur l’implémentation d’un pilote miniport virtuel Storport (VMiniport). L’interface VMiniport est définie dans storport.h.

Les considérations de conception étant propres à différents VMiniports, les spécificités de l’implémentation ne sont pas incluses ici.

Interface VMiniport

Cette section répertorie les fonctions, rappels et structures les plus importants qu’un VMiniport implémente/utilise. Certaines fonctions et rappels sont requis ; les rappels facultatifs sont propres à la conception d’un VMiniport.

  • DriverEntry, qui est la première routine que le système d’exploitation appelle après le chargement du VMiniport. Cette routine est obligatoire.

  • HW_INITIALIZATION_DATA, qui est une structure allouée et initialisée par Vminiport que le VMiniport transmet à Storport lors de l’initialisation. VMiniport fournit des pointeurs vers ses fonctions de rappel dans cette structure.

    Les routines de rappel suivantes sont requises :

    Les routines de rappel suivantes sont facultatives, bien qu’un VMiniport puisse devoir implémenter certaines d’entre elles en fonction de son architecture unique :

    • HwInitializeTracing

    • HwCleanupTracing. Cette routine est requise lorsque HwInitializeTracing pointe vers une routine de rappel ; sinon, cette routine est facultative et est unique à un VMiniport.

    • HwProcessServiceRequest. Cette routine reçoit un IRP de « rappel inverse », qui est terminé lorsque le VMiniport met à jour l’appelant (par exemple, une application en mode utilisateur ou un pilote en mode noyau) ou exige que l’appelant fasse quelque chose au nom de VMiniport.

    • HwCompleteServiceIrp. Cette routine est requise lorsque HwProcessServiceRequest pointe vers une routine de rappel ; sinon, cette routine est facultative et est unique à un VMiniport. HwCompleteServiceIrp est appelé lorsque la carte virtuelle est en cours de suppression afin que le VMiniport puisse effectuer tous les irps de rappel inverse qui peuvent être en attente.

    Le VMiniport doit également définir les membres suivants de la structure HW_INITIALIZATION_DATA :

    • Définissez HwInitializationDataSize sur sizeof(HW_INITIALIZATION_DATA).

    • Définissez AdapterInterfaceType sur Interne, ce qui indique à Storport qu’il s’agit d’un adaptateur virtuel.

    • Définissez HwBuildIo sur NULL.

    Le pilote Vminiport définit d’autres champs en fonction des besoins. Les champs inutilisés doivent être définis sur zéro.

  • PORT_CONFIGURATION_INFORMATION, qui est une structure allouée par Storport. Storport initialise certains membres PORT_CONFIGURATION_INFORMATION , puis les a transmis au rappel HwFindAdapter de VMiniport, où le VMiniport termine l’initialisation. Étant donné que cette structure est pré-initialisée par Storport, HWFindAdapter ne doit pas zéro de la structure. Un VMiniport doit définir VirtualDevice sur TRUE.

Initialisation VMiniport

Un VMiniport comporte trois phases d’initialisation.

  • Dans la première étape, la routine DriverEntry de VMiniport appelle StorPortInitialize avec un pointeur vers sa structure HW_INITIALIZATION_DATA initialisée.

  • Storport appelle le rappel HwFindAdapter de VMiniport avec une structure de PORT_CONFIGURATION_INFORMATION partiellement initialisée et allouée par Storport. La fonction principale de HwFindAdapter consiste à terminer l’initialisation de PORT_CONFIGURATION_INFORMATION, notamment en définissant le membre VirtualDevice sur TRUE.

  • Une fois que HwFindAdapter est retourné, Storport appelle le rappel HwInitialize de VMiniport pour terminer l’initialisation du VMiniport.

E/S VMiniport

Storport appelle un rappel HwStartIo de VMiniport pour lancer une demande d’E/S. Dans Storport, une demande d’E/S est décrite à l’aide d’un SCSI_REQUEST_BLOCK ou d’un STORAGE_REQUEST_BLOCK (SRB standard ou étendu, respectivement).

Contrairement à un pilote de miniport physique, Storport n’appelle pas HwBuildIo dans un Vminiport avant d’appeler HwStartIo.

Aucun verrou n’est conservé avant d’appeler HwStartIo. La profondeur de file d’attente par défaut pour chaque unité logique exposée via l’interface de miniport virtuel est de 250.