Partager via


Utilisation de la version CONNECT_LINE_BASED d’IoConnectInterruptEx

Pour les systèmes d’exploitation Windows Vista et ultérieurs, un pilote peut utiliser la version CONNECT_LINE_BASED d’IoConnectInterruptEx pour inscrire une routine InterruptService pour les interruptions en ligne du pilote. (Le pilote pour les systèmes d’exploitation antérieurs peut utiliser la version CONNECT_FULLY_SPECIFIED d’IoConnectInterruptEx.)

Note Vous pouvez utiliser cette méthode uniquement pour les pilotes qui inscrivent une routine de service d’interruption unique (ISR) pour toutes ses interruptions basées sur les lignes. Si le pilote peut recevoir plusieurs interruptions, il doit utiliser la version CONNECT_FULLY_SPECIFIED d’IoConnectInterruptEx.

Le pilote spécifie une valeur de CONNECT_LINE_BASED pour Parameters-Version> et utilise les membres deParameters-LineBased> pour spécifier les autres paramètres de l’opération :

  • Parameters-LineBased.PhysicalDeviceObject> spécifie l’objet d’appareil physique (PDO) pour l’appareil que l’ISR dessert. Le système utilise l’objet d’appareil pour identifier automatiquement les interruptions basées sur les lignes de l’appareil.

  • Parameters-LineBased.ServiceRoutine> pointe vers la routine InterruptService, tandis que Parameters-LineBased>. ServiceContext spécifie la valeur que le système transmet comme paramètre ServiceContext à InterruptService. 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 fournit un pointeur vers une variable PKINTERRUPT dans Parameters-LineBased.InterruptObject>. IoConnectInterruptEx définit cette variable pour pointer vers l’objet d’interruption de l’interruption, qui peut être utilisé lors de la suppression de l’ISR. Pour plus d’informations, consultez Suppression d’un ISR.

  • Les pilotes peuvent éventuellement spécifier un verrou de rotation dans Parameters-LineBased.SpinLock> que le système doit 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 InterruptService à l’aide de CONNECT_LINE_BASED :

IO_CONNECT_INTERRUPT_PARAMETERS params;

// deviceExtension is a pointer to the driver's device extension. 
//     deviceExtension->IntObj is a PKINTERRUPT.
// deviceInterruptService is a pointer to the driver's InterruptService routine.
// PhysicalDeviceObject is a pointer to the device's PDO. 
// ServiceContext is a pointer to driver-specified context for the ISR.

RtlZeroMemory( &params, sizeof(IO_CONNECT_INTERRUPT_PARAMETERS) );
params.Version = CONNECT_LINE_BASED;
params.LineBased.PhysicalDeviceObject = PhysicalDeviceObject;
params.LineBased.InterruptObject = &deviceExtension->IntObj;
params.LineBased.ServiceRoutine = deviceInterruptService;
params.LineBased.ServiceContext = ServiceContext;
params.LineBased.SpinLock = NULL;
params.LineBased.SynchronizeIrql = 0;
params.LineBased.FloatingSave = FALSE;

status = IoConnectInterruptEx(&params);

if (!NT_SUCCESS(status)) {
    // Operation failed. Handle error.
    ...
}