Présentation des codes de contrôle d’E/S

Les codes de contrôle d’E/S (IOCTL) sont utilisés pour la communication entre les applications en mode utilisateur et les pilotes, ou pour la communication en interne entre les pilotes d’une pile. Les codes de contrôle d’E/S sont envoyés à l’aide des irps.

Les applications en mode utilisateur envoient des IOCTL aux pilotes en appelant DeviceIoControl, qui est décrit dans Microsoft Windows SDK documentation. Les appels à DeviceIoControl permettent au gestionnaire d’E/S de créer une requête IRP_MJ_DEVICE_CONTROL et de l’envoyer au pilote le plus haut.

En outre, les pilotes de niveau supérieur peuvent envoyer des IOCTL à des pilotes de niveau inférieur en créant et en envoyant des requêtes IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL . Les pilotes traitent ces demandes dans les routines DispatchDeviceControl et DispatchInternalDeviceControl . (Les applications en mode utilisateur ne peuvent pas envoyer IRP_MJ_INTERNAL_DEVICE_CONTROL requêtes.)

Certaines IOCTL sont « publiques » et d’autres « privées ». Les IOCTL publics sont généralement définis par le système et documentés par Microsoft, soit dans le Kit de pilotes Windows (WDK) soit dans le Kit de pilotes Windows (SDK) ou le Kit de développement logiciel (SDK) Windows. Elles peuvent être envoyées au moyen d’appels d’un composant en mode utilisateur à DeviceIoControl, ou d’un pilote en mode noyau à un autre, à l’aide de requêtes IRP_MJ_DEVICE_CONTROL ou IRP_MJ_INTERNAL_DEVICE_CONTROL . Les codes de contrôle D’E/S du port SCSI et les demandes de contrôle d’appareil interne de la souris I8042prt sont des exemples de listes IOCTL publiques.

Les IOCTL privés, quant à eux, sont destinés à être utilisés exclusivement par les composants logiciels d’un fournisseur pour communiquer entre eux. Les IOCTL privés sont généralement définis dans un fichier d’en-tête fourni par le fournisseur et ne sont pas documentés publiquement. Comme les IOCTL publiques, elles peuvent être envoyées au moyen d’appels d’un composant en mode utilisateur à DeviceIoControl, ou être envoyées d’un pilote en mode noyau à un autre, à l’aide de IRP_MJ_DEVICE_CONTROL ou de requêtes IRP_MJ_INTERNAL_DEVICE_CONTROL .

Il n’y a aucune différence entre le codage des IOCTL publics et privés. Toutefois, il existe des différences dans les codes internes qui peuvent être utilisés dans les IOCTL définis par le fournisseur, par rapport à ceux utilisés pour les IOCTL définies par le système. Si les IOCTL publiques disponibles ne répondent pas à vos besoins, vous pouvez définir de nouvelles IOCTL privées que vos composants logiciels peuvent utiliser pour communiquer entre eux. Pour plus d’informations, consultez Définition de codes de contrôle d’E/S.