DispatchDeviceControl et DispatchInternalDeviceControl Routines
Les routines de répartition d’un pilote (voir DRIVER_DISPATCH) gèrent les IRP avec des codes de fonction d’E/S de IRP_MJ_DEVICE_CONTROL et de IRP_MJ_INTERNAL_DEVICE_CONTROL, respectivement.
Pour chaque type de périphérique courant, le système définit un ensemble de codes de contrôle d’E/S pour les demandes de IRP_MJ_DEVICE_CONTROL . Les nouveaux pilotes pour chaque type d’appareil doivent prendre en charge ces demandes. Dans la plupart des cas, ces codes de contrôle d’E/S publics pour chaque type d’appareil ne sont pas exportés vers des applications en mode utilisateur.
Certains de ces codes de contrôle d’E/S définis par le système sont utilisés par des pilotes de niveau supérieur qui créent des IRP pour le pilote de périphérique sous-jacent en appelant IoBuildDeviceIoControlRequest. D’autres sont utilisés par les composants Win32 pour communiquer avec un pilote de périphérique sous-jacent en appelant la fonction Win32 DeviceIoControl (décrite dans Microsoft Windows SDK documentation) qui, à son tour, appelle un service système. Le gestionnaire d’E/S configure une IRP et stocke le code de fonction principal IRP_MJ_DEVICE_CONTROL et le code de contrôle d’E/S donné dans la structure IO_STACK_LOCATION sur Parameters.DeviceIoControl.IoControlCode. Ensuite, le gestionnaire d’E/S appelle la routine DispatchDeviceControl du pilote de niveau le plus élevé de la chaîne.
Pour certains pilotes fournis par le système conçus pour interagir avec de nouveaux pilotes et les prendre en charge, le système d’exploitation définit également un ensemble de codes de contrôle d’E/S pour les demandes IRP_MJ_INTERNAL_DEVICE_CONTROL . Dans la plupart des cas, ces codes de contrôle d’E/S publics permettent aux pilotes de niveau supérieur d’interagir avec un pilote de périphérique sous-jacent.
Par exemple, les pilotes parallèles fournis par le système prennent en charge un ensemble de codes de contrôle d’E/S internes que les pilotes fournis par le fournisseur envoient dans IRP_MJ_INTERNAL_DEVICE_CONTROL requêtes. Pour plus d’informations, consultez Demandes de contrôle d’appareil interne pour les ports parallèles et Demandes de contrôle d’appareil interne pour les appareils parallèles.
Presque toutes les opérations demandées via des codes de contrôle d’E/S définis par le système utilisent des E/S mises en mémoire tampon, car ce type de requête nécessite rarement le transfert de grandes quantités de données. En d’autres termes, même les pilotes qui configurent leurs objets d’appareil pour les E/S directes sont envoyés pour les demandes de contrôle de périphérique avec des données à transférer dans ou hors de la mémoire tampon sur Irp-AssociatedIrp.SystemBuffer> (à l’exception de certains types de pilotes de périphérique de niveau supérieur avec des pilotes multimédias Win32 étroitement couplés).
En outre, un pilote peut définir un ensemble de codes de contrôle d’E/S privés que d’autres pilotes peuvent utiliser pour communiquer avec lui. De nouveaux codes de contrôle d’E/S publics peuvent être ajoutés au système uniquement avec la coopération de Microsoft Corporation, car les codes de contrôle d’E/S publics sont intégrés au système d’exploitation lui-même.
Pour plus d’informations sur l’ensemble des codes de contrôle d’E/S publics que différents types de pilotes doivent prendre en charge et sur la définition de codes de contrôle d’E/S privés, consultez les sections de référence spécifiques aux appareils du Kit de pilotes Windows (WDK).