Sdílet prostřednictvím


Použití verze s názvem CONNECT_MESSAGE_BASED pro IoConnectInterruptEx

V případě operačních systémů Windows Vista a novějších může ovladač použít verzi CONNECT_MESSAGE_BASED IoConnectInterruptEx k registraci ISR pro přerušení signalizované zprávami ovladače. Ovladač určuje hodnotu CONNECT_MESSAGE_BASED pro Parametry–>verzea používá komponenty Parametry->MessageBased ke specifikaci dalších parametrů operace.

  • Parametry–>MessageBased.PhysicalDeviceObject určuje PDO pro zařízení, které obsluhuje ISR. Systém používá objekt zařízení k automatické identifikaci přerušení signalizovaných zprávou zařízení.

  • Parametry–>MessageBased.MessageServiceRoutine odkazuje na rutinu InterruptMessageService, zatímco Parametry–>MessageBased.ServiceContext určuje hodnotu, kterou systém předává jako ServiceContext pro parametr InterruptMessageService. Ovladač ho může použít k předání kontextových informací. Další informace o předávání informací o kontextu naleznete v tématu Poskytování informací o kontextu ISR.

  • Ovladač může také zadat náhradní rutinu InterruptMessageService v Parametry–>MessageBased.FallBackServiceRoutine. Pokud má zařízení přerušení založená na řádcích, ale nemá přerušení se zprávou, systém místo toho zaregistruje InterruptMessageService rutinu pro obsluhu přerušení založených na řádcích. V tomto případě systém předává parametry –>MessageBased.ServiceContext jako parametr ServiceContextInterruptService. IoConnectInterruptEx aktualizuje parametry–>verzi CONNECT_LINE_BASED, pokud registrovala rutinu náhradní instalace.

  • Parametry–>MessageBased.ConnectionContext odkazuje na proměnnou, která přijímá ukazatel buď na strukturu IO_INTERRUPT_MESSAGE_INFO (pro InterruptMessageService) nebo na strukturu KINTERRUPT (pro InterruptService). Ovladač může použít přijatý ukazatel k odebrání ISR. Další informace viz Odebrání přerušovací služby (ISR).

  • Ovladače můžou volitelně zadat otáčkový zámek v Parametry–>MessageBased.SpinLock, který systém používá při synchronizaci s ISR. Většina ovladačů může jednoduše zadat NULL, aby systém mohl jménem ovladače přidělit spinlock. Další informace o synchronizaci s ISR naleznete v tématu Synchronizace přístupu k datům zařízení.

Následující příklad kódu ukazuje, jak zaregistrovat InterruptMessageService rutinu pomocí 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( &params, 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(&params);

if (NT_SUCCESS(status)) {
    // We record the type of ISR registered.
    devExt->IsrType = params.Version;
} else {
    // Operation failed. Handle error.
    ...
}