Initialisation d’un objet Device

Une fois ioCreateDevice retourné, en donnant à l’appelant un pointeur vers un DeviceObject qui contient un pointeur vers l’extension de périphérique, les pilotes doivent configurer certains champs dans les objets d’appareil pour leurs appareils physiques, logiques et/ou virtuels respectifs.

IoCreateDevice définit le champ StackSize d’un objet d’appareil nouvellement créé sur un. Un pilote de niveau inférieur peut ignorer ce champ. Lorsqu’un pilote de niveau supérieur appelle IoAttachDeviceToDeviceStack pour s’attacher au pilote inférieur suivant, cette routine définit automatiquement le champ StackSize dans l’objet de périphérique sur celui de l’objet périphérique du pilote inférieur suivant plus un. Toutefois, pour certains types d’appareils, le pilote de niveau supérieur peut avoir besoin de définir le champ StackSize sur une valeur supérieure, comme indiqué dans la documentation spécifique à l’appareil. La définition de la taille de la pile garantit que les IRP envoyés au pilote de niveau supérieur contiennent un emplacement de pile d’E/S spécifique au pilote, ainsi que le nombre correct d’emplacements de pile d’E/S pour tous les pilotes de niveau inférieur dans la chaîne.

IoCreateDevice définit le champ AlignmentRequirement d’un objet d’appareil nouvellement créé sur la taille de ligne de cache de données du processeur moins un, pour garantir que les mémoires tampons utilisées dans les E/S directes sont alignées correctement. Une fois ioCreateDevice retourné, les pilotes de périphériques physiques de niveau le plus bas doivent effectuer les opérations suivantes :

  1. Soustraire un de l’exigence d’alignement de l’appareil.

  2. Comparez le résultat de l’étape 1 à la valeur actuelle de l’objet d’appareil AlignmentRequirement.

  3. Si l’exigence d’alignement de l’appareil est supérieure, définissez AlignmentRequirement sur le résultat de l’étape 1. Sinon, laissez la valeur AlignmentRequirement définie par IoCreateDevice.

Une fois qu’un pilote de niveau supérieur s’est lié à un autre pilote en appelant IoGetDeviceObjectPointer, le pilote de niveau supérieur doit définir le champ AlignmentRequirement de son objet de périphérique nouvellement créé sur celui de l’objet de périphérique du pilote de niveau inférieur suivant. En règle générale, un pilote de niveau supérieur ne doit pas modifier cette valeur. Si un pilote de niveau supérieur appelle IoAttachDevice ou IoAttachDeviceToDeviceStack, ces routines définissent automatiquement le champ AlignmentRequirement dans l’objet de périphérique sur celui de l’objet périphérique du pilote de niveau inférieur.

IoGetDeviceObjectPointer retourne des pointeurs vers l’objet de périphérique du pilote de niveau inférieur et vers l’objet fichier associé. Seul un FSD (ou, éventuellement, un autre pilote de niveau supérieur) peut utiliser le pointeur d’objet de fichier retourné. Un pilote intermédiaire qui appelle IoGetDeviceObjectPointer doit enregistrer ce pointeur d’objet fichier afin qu’il puisse être déréférencé en appelant ObDereferenceObject lorsque le pilote est déchargé.

Après qu’un FSD monte le volume contenant l’objet file qui représente l’objet de périphérique d’un pilote inférieur, un pilote intermédiaire ne peut pas se chaîner entre le système de fichiers et le pilote inférieur en appelant IoAttachDevice ou IoAttachDeviceToDeviceStack. En outre, un FSD peut définir le membre SectorSize de l’objet d’appareil en fonction de la géométrie du matériel de volume sous-jacent lors d’un montage. Pour plus d’informations, consultez DEVICE_OBJECT.

Un pilote de niveau intermédiaire ou de niveau inférieur définit également un bit dans les indicateurs de l’objet de périphérique en l’oring avec DO_DIRECT_IO ou avec DO_BUFFERED_IO dans chaque objet de périphérique qu’il crée. Les pilotes de plus haut niveau des périphériques logiques ou virtuels peuvent éviter de définir des indicateurs pour les E/S directes ou mises en mémoire tampon si l’enregistreur de pilotes décide que le travail supplémentaire impliqué sera rentable pour de meilleures performances du pilote. Un pilote intermédiaire doit configurer le champ Flags de son objet de périphérique pour qu’il corresponde à celui de l’objet de périphérique du pilote inférieur suivant.

La configuration d’un champ Indicateurs d’objet d’appareil avec DO_DIRECT_IO ou DO_BUFFERED_IO détermine comment le gestionnaire d’E/S transmet l’accès aux mémoires tampons utilisateur dans toutes les demandes de transfert de données envoyées par la suite au pilote.

Le pilote peut ensuite définir toutes les autres valeurs dépendantes du périphérique dans l’objet de périphérique. Par exemple, les pilotes non WDM pour les périphériques multimédias amovibles doivent OU le membre Flags de l’objet de périphérique avec DO_VERIFY_VOLUME s’ils détectent (ou soupçonnent) un changement de média pendant les opérations d’E/S. (Pour plus d’informations, consultez Prise en charge des supports amovibles .) Les pilotes des périphériques qui nécessitent une alimentation d’appel doivent OU le membre Indicateurs avec DO_POWER_INRUSH, et les pilotes des périphériques qui ne se trouvent pas sur le chemin de pagination système doivent OU le membre Flags avec DO_POWER_PAGABLE. Les pilotes de fonction et de filtre doivent effacer l’indicateur DO_DEVICE_INITIALIZING.

Après avoir initialisé l’objet de périphérique, un pilote peut également initialiser tous les objets définis par le noyau et d’autres structures de données définies par le système pour lesquels il a fourni du stockage dans l’extension de périphérique. Le moment précis où un pilote effectue ces tâches dépend de son appareil, du type de l’objet et/ou de la nature des données. En général, tous les objets ou structures de données qui peuvent persister via des demandes de démarrage et d’arrêt PnP peuvent être initialisés dans la routine AddDevice . Ceux qui nécessitent des informations sur les ressources fournies avec une demande de IRP_MN_START_DEVICE PnP, ou qui peuvent nécessiter des modifications lorsque l’appareil est arrêté et/ou redémarré, doivent être initialisés lorsque le pilote gère la demande de IRP_MN_START_DEVICE . Pour plus d’informations sur les routines AddDevice , consultez Écriture d’une routine AddDevice.