Création de files d’attente d’E/S

Les objets de file d’attente du framework représentent des files d’attente d’E/S, qui sont des conteneurs pour les demandes d’E/S qu’un pilote reçoit. Chaque pilote peut créer une ou plusieurs files d’attente d’E/S pour chaque appareil. L’objet de file d’attente d’infrastructure définit un ensemble de fonctions de rappel d’événements que le pilote peut fournir et un ensemble de méthodes d’objet que le pilote peut appeler.

Lorsque l’infrastructure reçoit une demande d’E/S dirigée vers l’un des appareils du pilote, l’infrastructure place la demande dans la file d’attente d’E/S appropriée. Si votre pilote inscrit un ou plusieurs gestionnaires de requêtes, l’infrastructure peut le notifier chaque fois qu’une demande d’E/S est disponible. Votre pilote peut également interroger la file d’attente d’E/S pour les demandes.

La plupart des pilotes créent des files d’attente d’E/S dans leur fonction de rappel EvtDriverDeviceAdd . Pour créer une file d’attente d’E/S pour un appareil, le pilote appelle la méthode WdfIoQueueCreate de l’objet de file d’attente d’infrastructure (qui crée un objet de file d’attente d’infrastructure). Le pilote fournit une structure WDF_IO_QUEUE_CONFIG à la méthode . Cette structure contient des informations de configuration sur la file d’attente, telles que la méthode de distribution de la file d’attente et des pointeurs vers les gestionnaires de requêtes que l’infrastructure appelle lorsque les demandes sont disponibles dans la file d’attente. La structure indique également si la file d’attente sera gérée par l’alimentation et si le pilote prend en charge les mémoires tampons de longueur nulle pour les demandes d’E/S de la file d’attente.

Si le pilote définit le membre DefaultQueue de la structure WDF_IO_QUEUE_CONFIG sur TRUE, la file d’attente devient la file d’attente d’E/S par défaut de l’appareil. Si votre pilote crée une file d’attente d’E/S par défaut, l’infrastructure place toutes les demandes d’E/S de l’appareil dans cette file d’attente, sauf si vous créez des files d’attente supplémentaires pour recevoir certaines des demandes. Un pilote peut obtenir un handle dans la file d’attente d’E/S par défaut d’un appareil en appelant la méthode WdfDeviceGetDefaultQueue .

Si vous souhaitez utiliser plusieurs files d’attente d’E/S pour un appareil, le pilote peut appeler WdfIoQueueCreate pour créer autant d’objets de file d’attente que nécessaire. Si un pilote crée plusieurs files d’attente, il peut appeler WdfDeviceConfigureRequestDispatching, qui indique au framework de diriger différents types de requêtes vers différentes files d’attente. Par exemple, vous pouvez spécifier que toutes les demandes de lecture seront remises à une file d’attente et que toutes les demandes d’écriture seront remises à une autre file d’attente.

Si votre pilote crée un ensemble de files d’attente d’E/S et appelle WdfDeviceConfigureRequestDispatching pour diriger chaque type de demande que votre pilote peut recevoir vers une file d’attente spécifique, il n’a pas besoin d’une file d’attente par défaut.

Si un pilote ne fournit pas de file d’attente d’E/S pour les requêtes d’un type particulier, et si votre pilote est un pilote de fonction, l’infrastructure termine les demandes de ce type avec une valeur d’achèvement status de STATUS_INVALID_DEVICE_REQUEST. Si votre pilote est un pilote de filtre et a appelé WdfFdoInitSetFilter, le framework transfère automatiquement ces requêtes au pilote inférieur suivant dans la pile des pilotes. Ainsi, par exemple, un pilote de filtre qui ne traite pas les demandes de lecture n’a pas besoin de fournir une file d’attente d’E/S qui reçoit des demandes de lecture.

Pour obtenir des exemples d’utilisation des files d’attente d’E/S, consultez Exemples d’utilisations de files d’attente d’E/S.