Partager via


EVT_SPB_CONTROLLER_READ fonction de rappel (spbcx.h)

La fonction de rappel d’événement EvtSpbControllerIoRead d’un pilote de contrôleur SPB lit les données de l’appareil cible spécifié dans les mémoires tampons fournies avec la demande de lecture.

Syntaxe

EVT_SPB_CONTROLLER_READ EvtSpbControllerRead;

void EvtSpbControllerRead(
  [in] WDFDEVICE Controller,
  [in] SPBTARGET Target,
  [in] SPBREQUEST Request,
  [in] size_t Length
)
{...}

Paramètres

[in] Controller

Un handle WDFDEVICE pour l’objet d’appareil d’infrastructure qui représente le contrôleur SPB.

[in] Target

Un handle SPBTARGET à la cible pour cette demande d’E/S. La cible est un périphérique ou un port qui est attaché au bus. L’extension d’infrastructure SPB (SpbCx) a précédemment affecté ce handle à la cible dans le rappel EvtSpbTargetConnect qui a ouvert la connexion à la cible.

[in] Request

Un handle SPBREQUEST pour la demande d’E/S. Votre pilote de contrôleur SPB doit effectuer cette demande en effectuant l’opération demandée ou en retournant une erreur status. Pour plus d’informations, consultez Remarques.

[in] Length

Nombre d’octets à lire à partir de l’appareil cible.

Valeur de retour

None

Remarques

SpbCx gère la file d’attente d’E/S pour le contrôleur SPB. SpbCx appelle la fonction de rappel EvtSpbControllerIoRead du pilote du contrôleur SPB lorsqu’un client (pilote périphérique) du contrôleur SPB envoie une demande de IRP_MJ_READ à un appareil cible attaché au bus. La valeur du paramètre Request est un handle qui encapsule cette requête.

Un rappel EvtSpbControllerIoRead ne retourne pas de valeur status. Au lieu de cela, le pilote du contrôleur SPB indique la status de l’opération de lecture dans le status d’achèvement pour la demande d’E/S.

Un rappel EvtSpbControllerIoRead est asynchrone. Autrement dit, la fonction de rappel doit lancer l’opération de lecture demandée, puis retourner sans attendre la fin de l’opération. Plus tard, le pilote du contrôleur SPB termine la demande de lecture pendant une interruption DPC ou un DPC du minuteur.

Si l’opération de lecture se termine entièrement, le pilote du contrôleur SPB doit définir la status d’achèvement sur STATUS_SUCCESS. Si l’appareil cible indique qu’il peut fournir une partie, mais pas la totalité des données demandées, le pilote du contrôleur SPB doit récupérer autant de données que disponible, spécifier le nombre d’octets de données récupérés et définir l’achèvement status dans la demande d’E/S sur STATUS_SUCCESS. Une telle opération de lecture partiellement terminée ne peut pas se produire sur un bus SPI ou I2C, mais peut se produire sur un autre type de bus.

Si l’opération de lecture échoue en raison d’un bruit de ligne, d’une erreur matérielle du contrôleur ou d’une erreur de pilote, le pilote du contrôleur SPB doit définir l’achèvement status dans la demande d’E/S sur un code d’erreur approprié. Tous les bus ne fournissent pas un mécanisme permettant à un appareil cible de signaler une erreur de transport ou un transfert partiellement terminé, et tous les contrôleurs ne peuvent pas détecter ces conditions.

Pour inscrire une fonction de rappel EvtSpbControllerIoRead , appelez la méthode SpbDeviceInitialize .

Exemples

Pour définir une fonction de rappel EvtSpbControllerIoRead , vous devez d’abord fournir une déclaration de fonction qui identifie le type de fonction de rappel que vous définissez. Windows fournit un ensemble de types de fonctions de rappel pour les pilotes. La déclaration d’une fonction à l’aide des types de fonction de rappel permet à l’analyse du code pour les pilotes, au vérificateur de pilotes statiques (SDV) et à d’autres outils de vérification de trouver des erreurs. Il s’agit d’une exigence pour l’écriture de pilotes pour le système d’exploitation Windows.

Par exemple, pour définir une fonction de rappel EvtSpbControllerIoRead nommée MyEvtSpbControllerIoRead, utilisez le type de fonction EVT_SPB_CONTROLLER_READ, comme indiqué dans cet exemple de code :

EVT_SPB_CONTROLLER_READ  MyEvtSpbControllerIoRead;

Ensuite, implémentez votre fonction de rappel comme suit :

_Use_decl_annotations_
VOID
  MyEvtSpbControllerIoRead(
    WDFDEVICE Controller,
    SPBTARGET Target,
    SPBREQUEST Request,
    size_t Length
    )
{ ... }

Le type de fonction EVT_SPB_CONTROLLER_READ est défini dans le fichier d’en-tête Spbcx.h. Pour identifier plus précisément les erreurs lors de l’exécution des outils d’analyse du code, veillez à ajouter l’annotation Use_decl_annotations à votre définition de fonction. L’annotation Use_decl_annotations garantit que les annotations appliquées au type de fonction EVT_SPB_CONTROLLER_READ dans le fichier d’en-tête sont utilisées. Pour plus d’informations sur la configuration requise pour les déclarations de fonction, consultez Déclaration de fonctions à l’aide de types de rôles de fonction pour les pilotes KMDF. Pour plus d’informations sur Use_decl_annotations, consultez Annotating Function Behavior.

Configuration requise

Condition requise Valeur
Client minimal pris en charge Pris en charge à partir de Windows 8.
Plateforme cible Desktop (Expérience utilisateur)
En-tête spbcx.h
IRQL Appelé à IRQL <= DISPATCH_LEVEL.

Voir aussi