Delen via


De CONNECT_FULLY_SPECIFIED-versie van IoConnectInterruptEx gebruiken

Een stuurprogramma kan de CONNECT_FULLY_SPECIFIED versie van IoConnectInterruptEx gebruiken om een InterruptService-routine voor een specifieke interrupt te registreren. Een stuurprogramma kan de CONNECT_FULLY_SPECIFIED versie gebruiken die begint met Windows Vista. Door een koppeling naar de Iointex.lib-bibliotheek te maken, kan het stuurprogramma de CONNECT_FULLY_SPECIFIED versie in Windows 2000, Windows XP en Windows Server 2003 gebruiken. Zie IoConnectInterruptEx gebruiken vóór Windows Vista voor meer informatie.

Het stuurprogramma specificeert een waarde van CONNECT_FULLY_SPECIFIED voor Parameters->Version en gebruikt de leden van Parameters->FullySpecified om de andere parameters van de bewerking op te geven:

  • Parameters-FullySpecified.PhysicalDeviceObject> geeft de PDO op voor het apparaat dat de ISR-taken uitvoert.

  • Parameters->FullySpecified.ServiceRoutine verwijst naar de InterruptService-routine, terwijl Parameters->FullySpecified.ServiceContext de waarde specificeert die het systeem doorgeeft als de parameter ServiceContext aan InterruptService. Het stuurprogramma kan dit gebruiken om contextinformatie door te geven. Zie Isr-contextinformatie opgeven voor meer informatie over het doorgeven van contextinformatie.

  • Het stuurprogramma biedt een aanwijzer naar een PKINTERRUPT-variabele in Parameters-FullySpecified.InterruptObject>. De IoConnectInterruptEx-routine stelt deze variabele in op het interruptobject voor de interrupt, die kan worden gebruikt bij het verwijderen van de ISR.

  • Een stuurprogramma kan eventueel een spinvergrendeling opgeven in Parameters-FullySpecified.SpinLock> voor het systeem om te gebruiken bij het synchroniseren met de ISR. De meeste stuurprogramma's kunnen alleen NULL opgeven om het systeem in te schakelen voor het toewijzen van een kringvergrendeling namens het stuurprogramma. Zie Toegang tot apparaatgegevens synchroniseren voor meer informatie over synchroniseren met een ISR.

Het stuurprogramma moet de belangrijkste eigenschappen van de interrupt opgeven in andere leden van Parameters-FullySpecified>. Het systeem levert de benodigde informatie in de matrix van CM_PARTIAL_RESOURCE_DESCRIPTOR structuren wanneer het de IRP_MN_START_DEVICE IRP naar het stuurprogramma verzendt.

Het systeem biedt voor elke interrupt een CM_PARTIAL_RESOURCE_DESCRIPTOR structuur met typelid gelijk aan CmResourceTypeInterrupt. Voor een berichtsignaalonderbrekeling wordt de CM_RESOURCE_INTERRUPT_MESSAGE bit van het lid Vlaggen ingesteld; anders wordt het gewist.

Het u.Interrupt-lid van CM_PARTIAL_RESOURCE_DESCRIPTOR bevat de beschrijving van een line-based interrupt, terwijl het lid u.MessageInterrupt.Translated de beschrijving van een door berichten gesignaleerde interrupt bevat. In de volgende tabel wordt aangegeven waar in de CM_PARTIAL_RESOURCE_DESCRIPTOR structuur de informatie moet worden gevonden die is vereist voor het instellen van de leden van Parameters-FullySpecified> voor beide typen interrupts. Zie het codevoorbeeld dat volgt op de tabel voor meer informatie.

Lid Lijngebaseerde interrupt Bericht-gesignaleerde interrupt

ShareVector

ShareDisposition

ShareDisposition

Vector

u.Interrupt.Vector

u.MessageInterrupt.Translated.Vector

Irql

u.Interrupt.Level

u.MessageInterrupt.Translated.Level

Onderbreekmodus

Vlaggen & CM_RESOURCE_INTERRUPT_LATCHED

Vlaggen en CM_RESOURCE_INTERRUPT_LATCHED

ProcessorEnableMask

u.Interrupt.Affinity

u.MessageInterrupt.Translated.Affinity

Een stuurprogramma ontvangt alleen CM_PARTIAL_RESOURCE_DESCRIPTOR structuren voor berichtsignaalonderbrekers op Windows Vista en latere versies van Windows.

In het volgende codevoorbeeld ziet u hoe u een InterruptService-routine registreert met behulp van 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( &params, 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(&params);

if (!NT_SUCCESS(status)) {
    ...
}