Descriptions des mémoires tampons pour les codes de contrôle d’E/S
Les codes de contrôle d’E/S sont contenus dans les requêtes IRP_MJ_DEVICE_CONTROL et IRP_MJ_INTERNAL_DEVICE_CONTROL . Le gestionnaire d’E/S crée ces requêtes à la suite d’appels à DeviceIoControl et IoBuildDeviceIoControlRequest.
Étant donné que DeviceIoControl et IoBuildDeviceIoControlRequest acceptent une mémoire tampon d’entrée et une mémoire tampon de sortie comme arguments, toutes les demandes IRP_MJ_DEVICE_CONTROL et IRP_MJ_INTERNAL_DEVICE_CONTROL fournissent à la fois une mémoire tampon d’entrée et une mémoire tampon de sortie. La façon dont le système décrit ces mémoires tampons dépend du type de transfert de données. Le type de transfert est spécifié par la valeur TransferType dans la macro CTL_CODE qui crée des valeurs de code IOCTL.
Le système décrit les mémoires tampons pour chaque valeur TransferType comme suit.
METHOD_BUFFERED
Pour ce type de transfert, les irps fournissent un pointeur vers une mémoire tampon dans Irp-AssociatedIrp.SystemBuffer>. Cette mémoire tampon représente à la fois la mémoire tampon d’entrée et la mémoire tampon de sortie spécifiées dans les appels à DeviceIoControl et IoBuildDeviceIoControlRequest. Le pilote transfère les données hors de, puis dans cette mémoire tampon.
Pour les données d’entrée, la taille de la mémoire tampon est spécifiée par Parameters.DeviceIoControl.InputBufferLength dans la structure IO_STACK_LOCATION du pilote. Pour les données de sortie, la taille de la mémoire tampon est spécifiée par Parameters.DeviceIoControl.OutputBufferLength dans la structure de IO_STACK_LOCATION du pilote.
La taille de l’espace que le système alloue pour la mémoire tampon d’entrée/sortie unique est la plus grande des deux valeurs de longueur.
METHOD_IN_DIRECT ou METHOD_OUT_DIRECT
Pour ces types de transfert, les IRP fournissent un pointeur vers une mémoire tampon sur Irp-AssociatedIrp.SystemBuffer>. Cela représente la première mémoire tampon spécifiée dans les appels à DeviceIoControl et IoBuildDeviceIoControlRequest. La taille de la mémoire tampon est spécifiée par Parameters.DeviceIoControl.InputBufferLength dans la structure de IO_STACK_LOCATION du pilote.
Pour ces types de transfert, les runtimes d’intégration fournissent également un pointeur vers une MDL sur Irp-MdlAddress>. Cela représente la deuxième mémoire tampon spécifiée dans les appels à DeviceIoControl et IoBuildDeviceIoControlRequest. Cette mémoire tampon peut être utilisée comme mémoire tampon d’entrée ou mémoire tampon de sortie, comme suit :
METHOD_IN_DIRECT est spécifié si le pilote qui gère l’IRP reçoit des données dans la mémoire tampon lorsqu’il est appelé. La MDL décrit une mémoire tampon d’entrée, et en spécifiant METHOD_IN_DIRECT garantit que le thread en cours d’exécution dispose d’un accès en lecture à la mémoire tampon.
METHOD_OUT_DIRECT est spécifié si le pilote qui gère l’IRP écrit des données dans la mémoire tampon avant de terminer l’IRP. La MDL décrit une mémoire tampon de sortie, et en spécifiant METHOD_OUT_DIRECT garantit que le thread en cours d’exécution dispose d’un accès en écriture à la mémoire tampon.
Pour ces deux types de transfert, Parameters.DeviceIoControl.OutputBufferLength spécifie la taille de la mémoire tampon décrite par la MDL.
METHOD_NEITHER
Le gestionnaire d’E/S ne fournit pas de mémoires tampons système ou de MDL. L’IRP fournit les adresses virtuelles en mode utilisateur des mémoires tampons d’entrée et de sortie qui ont été spécifiées sur DeviceIoControl ou IoBuildDeviceIoControlRequest, sans les valider ni les mapper.
L’adresse de la mémoire tampon d’entrée est fournie par Parameters.DeviceIoControl.Type3InputBuffer dans la structure de IO_STACK_LOCATION du pilote, et l’adresse de la mémoire tampon de sortie est spécifiée par Irp-UserBuffer>.
Les tailles de mémoire tampon sont fournies par Parameters.DeviceIoControl.InputBufferLength et Parameters.DeviceIoControl.OutputBufferLength dans la structure IO_STACK_LOCATION du pilote.
Pour plus d’informations sur la macro CTL_CODE et les types de transfert répertoriés ci-dessus, consultez Définition de codes de contrôle d’E/S.