Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le système d’exploitation répartit toutes les demandes d’E/S sur l’appareil au pilote de classe. À son tour, le pilote de classe demande des informations spécifiques au matériel à partir du minidriver en passant des SDR au minidriver. Le pilote de classe spécifie l’opération qu’il demande dans le membre Command du bloc de demande de flux.
Le minidriver dans son ensemble et chaque flux dans le minidriver peuvent recevoir des demandes d’E/S. Le minidriver doit fournir une routine StrMiniReceiveDevicePacket pour gérer les requêtes à l’échelle de l’appareil. Chaque flux doit prendre en charge deux routines pour gérer les demandes d’E/S : l’une pour les demandes de données et l’autre pour les demandes de contrôle. Le pilote de classe appelle le rappel de la demande de données , StrMiniReceiveStreamDataPacket, pour gérer toutes les demandes de lecture et d’écriture sur un flux. Toutes les autres demandes d’un flux sont transmises à StrMiniReceiveStreamControlPacket.
Si le pilote de classe gère la synchronisation pour le minidriver, il met en file d’attente les demandes de flux et les distribue au minidriver une à la fois. Le pilote de classe gère trois files d’attente distinctes : une pour les demandes d’appareil et une pour les demandes de données de flux et de contrôle. Le minidriver peut indiquer qu’il est prêt pour une nouvelle demande provenant de l’une de ces files d’attente comme suit :
| Type de requête | Routine | Paramètre NotificationType de routine |
|---|---|---|
demande d’appareil |
ReadyForNextDeviceRequest |
|
demande de contrôle de flux |
ReadyForNextStreamControlRequest |
|
demande de données de flux |
ReadyForNextStreamDataRequest |
Lorsque le pilote de classe appelle StrMiniReceiveXXXPacket, il remet le bloc de demande de flux au minidriver. La routine du minidriver a seul accès au bloc de demande de flux jusqu’à ce qu’elle signale au pilote de classe qu’il a terminé la demande.
Lorsque le minidriver termine le traitement d’une demande, il doit indiquer au pilote de classe qu’il a terminé la demande comme suit :
Le minidriver doit définir la status de la demande dans le champ État du bloc de demande de flux.
Le minidriver doit signaler qu’il a terminé la demande, en appelant StreamClassDeviceNotification ou StreamClassStreamNotification. Pour effectuer une demande d’appareil, le minidriver appelle StreamClassDeviceNotification avec un paramètre NotificationType de DeviceRequestComplete. Pour effectuer une demande de flux, le minidriver appelle StreamClassStreamNotification avec un paramètre NotificationType de StreamRequestComplete.
Si le pilote de classe gère la synchronisation et si le minidriver n’a pas encore signalé au pilote de classe qu’il est prêt pour une autre requête sur cette file d’attente, il doit le faire maintenant.
Le minidriver peut combiner 2 et 3 en appelant StreamClassCompleteRequestAndMarkQueueReady.
Le minidriver traite les requêtes de manière asynchrone, de sorte que le pilote de classe peut avoir besoin d’annuler ou d’expirer une demande. À ces fins, le minidriver doit fournir une routine StrMiniCancelPacket et Une routine StrMiniRequestTimeout . Le pilote de classe appelle la routine de minidriver correspondante lorsqu’elle annule ou expire une demande.
Le pilote de classe annule une requête lorsque la demande d’E/S sous-jacente est annulée par le système d’exploitation. Le pilote de classe horodate les requêtes qui prennent trop de temps à traiter. Il décrémente un compteur du nombre de secondes jusqu’à ce qu’il expire une requête dans le membre TimeoutCounter du bloc de demande de flux. Si le minidriver doit différer le traitement d’une demande pendant une longue période, il doit définir le membre TimeoutCounter sur zéro. Le pilote de classe n’expirera pas la demande. Une fois que le minidriver reprend le traitement de la demande, il doit réinitialiser TimeoutCounter pour qu’il soit égal au membre TimeoutOriginal du bloc de demande de flux. Le minidriver peut réinitialiser TimeoutOriginal pour modifier la durée avant l’expiration de la requête. Pour plus d’informations, consultez HW_STREAM_REQUEST_BLOCK .