Utilisation de la version CONNECT_MESSAGE_BASED d’IoConnectInterruptEx
Pour les systèmes d’exploitation Windows Vista et ultérieurs, un pilote peut utiliser la version CONNECT_MESSAGE_BASED d’IoConnectInterruptEx pour inscrire un ISR pour les interruptions signalées par le message du pilote. Le pilote spécifie une valeur de CONNECT_MESSAGE_BASED pour Parameters-Version> et utilise les membres de Parameters-MessageBased> pour spécifier les autres paramètres de l’opération.
Parameters-MessageBased.PhysicalDeviceObject> spécifie le PDO pour l’appareil que l’ISR dessert. Le système utilise l’objet d’appareil pour identifier automatiquement les interruptions signalées par le message de l’appareil.
Parameters-MessageBased.MessageServiceRoutine> pointe vers la routine InterruptMessageService, tandis que Parameters-MessageBased.ServiceContext> spécifie la valeur que le système transmet comme paramètre ServiceContext à InterruptMessageService. Le pilote peut l’utiliser pour transmettre des informations de contexte. Pour plus d’informations sur la transmission d’informations de contexte, consultez Fournir des informations de contexte ISR.
Le pilote peut également spécifier une routine InterruptMessageService de secours dans Parameters-MessageBased.FallBackServiceRoutine>. Si l’appareil a des interruptions basées sur les lignes, mais qu’aucun message n’est interrompu, le système inscrit plutôt la routine InterruptMessageService pour traiter les interruptions basées sur les lignes. Dans ce cas, le système transmet Parameters-MessageBased.ServiceContext> comme paramètre ServiceContext à InterruptService. IoConnectInterruptEx met à jour Parameters-Version> pour CONNECT_LINE_BASED s’il a inscrit la routine de secours.
Parameters-MessageBased.ConnectionContext> pointe vers une variable qui reçoit un pointeur vers une structure IO_INTERRUPT_MESSAGE_INFO (pour InterruptMessageService) ou une structure KINTERRUPT (pour InterruptService). Le pilote peut utiliser le pointeur reçu pour supprimer l’ISR. Pour plus d’informations, consultez Suppression d’un ISR.
Les pilotes peuvent éventuellement spécifier un verrou de rotation dans Parameters-MessageBased.SpinLock> pour le système à utiliser lors de la synchronisation avec l’ISR. La plupart des pilotes peuvent simplement spécifier NULL pour permettre au système d’allouer un verrou de rotation pour le compte du pilote. Pour plus d’informations sur la synchronisation avec un ISR, consultez Synchronisation de l’accès aux données d’appareil.
L’exemple de code suivant montre comment inscrire une routine InterruptMessageService à l’aide de CONNECT_MESSAGE_BASED.
IO_CONNECT_INTERRUPT_PARAMETERS params;
// deviceExtension is a pointer to the driver's device extension.
// deviceExtension->IntInfo is a PVOID.
// deviceExtension->IntType is a ULONG.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// deviceInterruptMessageService is a pointer to the driver's InterruptMessageService routine.
// PhysicalDeviceObject is a pointer to the device's PDO.
// ServiceContext is a pointer to driver-specified context for the ISR.
RtlZeroMemory( ¶ms, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_MESSAGE_BASED;
params.MessageBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.MessageBased.MessageServiceRoutine = deviceInterruptMessageService;
params.MessageBased.ServiceContext = ServiceContext;
params.MessageBased.SpinLock = NULL;
params.MessageBased.SynchronizeIrql = 0;
params.MessageBased.FloatingSave = FALSE;
params.MessageBased.FallBackServiceRoutine = deviceInterruptService;
status = IoConnectInterruptEx(¶ms);
if (NT_SUCCESS(status)) {
// We record the type of ISR registered.
devExt->IsrType = params.Version;
} else {
// Operation failed. Handle error.
...
}