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.
Ovladač může použít CONNECT_FULLY_SPECIFIED verzi IoConnectInterruptEx k registraci rutiny InterruptService pro konkrétní přerušení. Ovladač může používat CONNECT_FULLY_SPECIFIED verzi počínaje systémem Windows Vista. Propojením s knihovnou Iointex.lib může ovladač používat verzi CONNECT_FULLY_SPECIFIED v systémech Windows 2000, Windows XP a Windows Server 2003. Další informace naleznete v tématu Použití IoConnectInterruptEx Před Windows Vista.
Ovladač určuje hodnotu CONNECT_FULLY_SPECIFIED pro Parameters->Version a využívá členy Parameters->FullySpecified k určení dalších parametrů operace.
Parameters-FullySpecified.PhysicalDeviceObject> určuje fyzický objekt zařízení (PDO) pro zařízení, které ISR obsluhuje.
Parameters-FullySpecified.ServiceRoutine> odkazuje na rutinu InterruptService, zatímco Parameters-FullySpecified>.ServiceContext určuje hodnotu, kterou systém předává jako parametr ServiceContext na InterruptService. 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č poskytuje ukazatel na proměnnou PKINTERRUPT v Parameters-FullySpecified.InterruptObject>. Rutina IoConnectInterruptEx nastaví tuto proměnnou tak, aby odkazovala na objekt přerušení, který lze použít při odebírání ISR.
Ovladače mohou volitelně určit spin lock v parametru Parameters->FullySpecified.SpinLock pro systém, aby se použil 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í.
Ovladač musí zadat klíčové vlastnosti přerušení v jiných členech parametrů->plně specifikovaných. Systém poskytuje potřebné informace v poli CM_PARTIAL_RESOURCE_DESCRIPTOR struktur, když odešle IRP_MN_START_DEVICE IRP ovladači.
Systém poskytuje pro každé přerušení strukturu CM_PARTIAL_RESOURCE_DESCRIPTOR s členem Type rovným CmResourceTypeInterrupt. V případě přerušení se zprávou je nastaven CM_RESOURCE_INTERRUPT_MESSAGE bit členu Flags ; jinak se vymaže.
Člen u.PřerušeníCM_PARTIAL_RESOURCE_DESCRIPTOR obsahuje popis řádkového přerušení, zatímco u.MessageInterrupt.Translated člen obsahuje popis přerušení signalizované zprávou. Následující tabulka uvádí, kde ve struktuře CM_PARTIAL_RESOURCE_DESCRIPTOR najít informace potřebné k nastavení členů Parametrů - >PlněSpecifikovaných pro oba typy přerušení. Další informace najdete v příkladu kódu, který následuje za tabulkou.
| Člen | Přerušení založené na řádcích | Přerušení signalizované zprávou |
|---|---|---|
ShareVector |
ShareDisposition |
ShareDisposition |
Vektor |
u.Interrupt.Vector |
u.MessageInterrupt.Translated.Vector |
Irql |
u.Interrupt.Level |
u.MessageInterrupt.Translated.Level |
Režim přerušení |
Příznaky a CM_RESOURCE_INTERRUPT_LATCHED |
Příznaky a CM_RESOURCE_INTERRUPT_LATCHED |
ProcessorEnableMask |
u.Interrupt.Affinity |
u.MessageInterrupt.Translated.Affinity |
Ovladač obdrží struktury CM_PARTIAL_RESOURCE_DESCRIPTOR pouze pro přerušení signalizovaná zprávou v systému Windows Vista a novějších.
Následující příklad kódu ukazuje, jak zaregistrovat rutinu InterruptService pomocí CONNECT_FULLY_SPECIFIED.
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.
// IntResource is a CM_PARTIAL_RESOURCE_DESCRIPTOR structure of either type CmResourceTypeInterrupt or CmResourceTypeMessageInterrupt.
// 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_FULLY_SPECIFIED;
params.FullySpecified.PhysicalDeviceObject = PhysicalDeviceObject;
params.FullySpecified.InterruptObject = &devExt->IntObj;
params.FullySpecified.ServiceRoutine = deviceInterruptService;
params.FullySpecified.ServiceContext = ServiceContext;
params.FullySpecified.FloatingSave = FALSE;
params.FullySpecified.SpinLock = NULL;
if (IntResource->Flags & CM_RESOURCE_INTERRUPT_MESSAGE) {
// The resource is for a message-signaled interrupt. Use the u.MessageInterrupt.Translated member of IntResource.
params.FullySpecified.Vector = IntResource->u.MessageInterrupt.Translated.Vector;
params.FullySpecified.Irql = (KIRQL)IntResource->u.MessageInterrupt.Translated.Level;
params.FullySpecified.SynchronizeIrql = (KIRQL)IntResource->u.MessageInterrupt.Translated.Level;
params.FullySpecified.ProcessorEnableMask = IntResource->u.MessageInterrupt.Translated.Affinity;
} else {
// The resource is for a line-based interrupt. Use the u.Interrupt member of IntResource.
params.FullySpecified.Vector = IntResource->u.Interrupt.Vector;
params.FullySpecified.Irql = (KIRQL)IntResource->u.Interrupt.Level;
params.FullySpecified.SynchronizeIrql = (KIRQL)IntResource->u.Interrupt.Level;
params.FullySpecified.ProcessorEnableMask = IntResource->u.Interrupt.Affinity;
}
params.FullySpecified.InterruptMode = (IntResource->Flags & CM_RESOURCE_INTERRUPT_LATCHED ? Latched : LevelSensitive);
params.FullySpecified.ShareVector = (BOOLEAN)(IntResource->ShareDisposition == CmResourceShareShared);
status = IoConnectInterruptEx(¶ms);
if (!NT_SUCCESS(status)) {
...
}