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. |