Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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( ¶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.
...
}