Partager via


IO_DPC_ROUTINE fonction de rappel (wdm.h)

La routine DpcForIsr termine la maintenance d’une opération d’E/S, après le retour d’une routine InterruptService .

Syntaxe

IO_DPC_ROUTINE IoDpcRoutine;

void IoDpcRoutine(
  [in]           PKDPC Dpc,
  [in]           _DEVICE_OBJECT *DeviceObject,
  [in, out]      _IRP *Irp,
  [in, optional] PVOID Context
)
{...}

Paramètres

[in] Dpc

Pointeur fourni par l’appelant vers une structure KDPC , qui représente l’objet DPC associé à cette routine DpcForIsr .

[in] DeviceObject

Pointeur fourni par l’appelant vers une structure DEVICE_OBJECT . Il s’agit de l’objet d’appareil pour l’appareil cible, précédemment créé par la routine AddDevice du pilote.

[in, out] Irp

Pointeur fourni par l’appelant vers une structure IRP qui décrit l’opération d’E/S.

[in, optional] Context

Pointeur fourni par l’appelant vers les informations de contexte définies par le pilote, spécifiées dans un appel précédent à IoRequestDpc.

Valeur de retour

None

Remarques

Pour inscrire une routine DpcForIsr pour un objet d’appareil spécifique, un pilote doit appeler IoInitializeDpcRequest, ce qui oblige le système à allouer et à initialiser un objet DPC. (Si vous avez besoin de plusieurs routines DPC, utilisez des routines CustomDpc .)

Pour mettre en file d’attente une routine DpcForIsr en vue de son exécution, la routine InterruptService d’un pilote doit appeler IoRequestDPC.

Une routine DpcForIsr est généralement responsable d’au moins les tâches suivantes :

  • Exécution de l’opération d’E/S décrite par l’IRP reçu.

  • Suppression de la file d’attente suivante.

    Si le pilote utilise la file d’attente IRP fournie par le système, la routine DpcForIsr doit appeler IoStartNextPacket Ou IoStartNextPacketByKey, afin que la routine StartIo du pilote commence à traiter la demande d’E/S suivante.

    Si le pilote utilise des files d’attente IRP internes, la routine DpcForIsr doit mettre la file d’attente à l’IRP suivante et commencer le traitement pour la demande d’E/S suivante.

  • Définition du bloc d’E/S status dans l’IRP reçu et appelez IoCompleteRequest pour la demande terminée.

Une routine DpcForIsr peut également réessayer une opération ayant échoué ou configurer le transfert suivant pour une demande d’E/S volumineuse qui a été divisée en morceaux plus petits.

Pour plus d’informations sur les routines DpcForIsr , consultez Objets DPC et PDC.

Exemples

Pour définir une routine de rappel DpcForIsr , vous devez d’abord fournir une déclaration de fonction qui identifie le type de routine 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 aide l’analyse du code pour les pilotes, le vérificateur de pilotes statique (SDV) et d’autres outils de vérification à la recherche d’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 routine de rappel DpcForIsr nommée MyDpcForIsr, utilisez le type IO_DPC_ROUTINE comme indiqué dans cet exemple de code :

IO_DPC_ROUTINE MyDpcForIsr;

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

_Use_decl_annotations_
VOID
  MyDpcForIsr(
    PKDPC  Dpc,
    struct _DEVICE_OBJECT  *DeviceObject,
    struct _IRP  *Irp,
    PVOID  Context
    )
  {
      // Function body
  }

Le type de fonction IO_DPC_ROUTINE est défini dans le fichier d’en-tête Wdm.h. Pour identifier plus précisément les erreurs lorsque vous exécutez les 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 IO_DPC_ROUTINE 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 WDM. Pour plus d’informations sur _Use_decl_annotations_, consultez Annotating Function Behavior.

Configuration requise

Condition requise Valeur
Plateforme cible Desktop (Expérience utilisateur)
En-tête wdm.h (inclure Wdm.h, Ntddk.h, Ntifs.h)
IRQL Appelé à DISPATCH_LEVEL.