Funzione IoConnectInterrupt (wdm.h)

La routine IoConnectInterrupt registra una routine di InterruptService (ISR) del driver di dispositivo, in modo che venga chiamata quando un dispositivo interrompe uno qualsiasi di un set specificato di processori.

Sintassi

NTSTATUS IoConnectInterrupt(
  [out]          PKINTERRUPT       *InterruptObject,
  [in]           PKSERVICE_ROUTINE ServiceRoutine,
  [in, optional] PVOID             ServiceContext,
  [in, optional] PKSPIN_LOCK       SpinLock,
  [in]           ULONG             Vector,
  [in]           KIRQL             Irql,
  [in]           KIRQL             SynchronizeIrql,
  [in]           KINTERRUPT_MODE   InterruptMode,
  [in]           BOOLEAN           ShareVector,
  [in]           KAFFINITY         ProcessorEnableMask,
  [in]           BOOLEAN           FloatingSave
);

Parametri

[out] InterruptObject

Puntatore all'indirizzo dell'archiviazione fornita dal driver per un puntatore a un set di oggetti di interruzione. Questo puntatore deve essere passato nelle chiamate successive a KeSynchronizeExecution.

[in] ServiceRoutine

Puntatore al punto di ingresso per la routine InterruptService fornita dal driver.

[in, optional] ServiceContext

Puntatore al contesto determinato dal driver che verrà fornito alla routine InterruptService quando viene chiamato. L'area ServiceContext deve essere in memoria residente: nell'estensione del dispositivo di un oggetto dispositivo creato dal driver, nell'estensione del controller di un oggetto controller creato dal driver o in un pool non a pagina allocato dal driver del dispositivo. Per informazioni dettagliate, vedere Fornire informazioni sul contesto ISR .

[in, optional] SpinLock

Puntatore a un blocco di rotazione inizializzato, per il quale il driver fornisce l'archiviazione, che verrà usato per sincronizzare l'accesso ai dati determinati dal driver condivisi da altre routine driver. Questo parametro è necessario se l'ISR gestisce più di un vettore o se il driver ha più di un ISR. In caso contrario, il driver non deve allocare l'archiviazione per un blocco di spin di interruzione e il puntatore di input è NULL.

[in] Vector

Specifica il vettore di interruzione passato nella risorsa di interruzione al membro u.Interrupt.Vector di CM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] Irql

Specifica la risorsa DIRQL passata nella risorsa di interruzione al membro u.Interrupt.Level di CM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] SynchronizeIrql

Specifica il valore DIRQL in corrispondenza del quale verrà eseguito l'ISR. Se l'ISR gestisce più di un vettore di interruzione o il driver ha più di un ISR, questo valore deve essere il più alto dei valori irql passati a u.Interrupt.Level in ogni risorsa di interruzione. In caso contrario, i valori Irql e SyncIrql sono identici.

[in] InterruptMode

Specifica se l'interruzione del dispositivo è LevelSensitive o Latched.

[in] ShareVector

Specifica se il vettore di interruzione è condivisibile.

[in] ProcessorEnableMask

Specifica un valore KAFFINITY che rappresenta il set di processori in cui possono verificarsi interruzioni del dispositivo in questa piattaforma. Questo valore viene passato nella risorsa di interruzione in u.Interrupt.Affinity.

[in] FloatingSave

Specifica se salvare lo stack a virgola mobile quando il dispositivo interrompe. Per le piattaforme basate su x86 e basate su Itanium, questo valore deve essere impostato su FALSE. Per altre informazioni sul salvataggio dello stato a virgola mobile e MMX, vedere Uso di virgola mobile o MMX in un driver WDM.

Valore restituito

IoConnectInterrupt può restituire uno dei valori NTSTATUS seguenti:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER: non sono stati specificati processori.

STATUS_INSUFFICIENT_RESOURCES: non c'è stato un pool di pagine sufficiente.

Commenti

I nuovi driver devono usare la routine IoConnectInterruptEx , che è più semplice da usare. I driver per i dispositivi che supportano gli interruzioni con segnale di messaggio (MSI) devono usare IoConnectInterruptEx.

Un driver PnP deve chiamare IoConnectInterrupt come parte dell'avvio del dispositivo, prima di completare la richiesta di IRP_MN_START_DEVICE PnP.

Quando un driver riceve una richiesta di IRP_MN_START_DEVICE, il driver riceve rispettivamente risorse hardware non elaborate e tradotte nella struttura Parameters.StartDevice.AllocateResources e Parameters.StartDevice.AllocateResourcesTranslate della struttura IO_STACK_LOCATION dell'IRP. Per connettere l'interruzione, il driver usa le risorse in AllocateResourcesTranslated.List.PartialResourceList.PartialDescriptors[]. Il driver deve analizzare la matrice di descrittori parziali per le risorse di tipo CmResourceTypeInterrupt.

Se il driver fornisce l'archiviazione per SpinLock, deve chiamare KeInitializeSpinLock prima di passare il blocco di spin di interruzione a IoConnectInterrupt.

Al ritorno da una chiamata riuscita a IoConnectInterrupt, il chiamante ISR può essere chiamato se gli interruzioni sono abilitati nel dispositivo del driver o se ShareVector è stato impostato su TRUE. I driver non devono abilitare gli interruzioni fino a quando non viene restituito IoConnectInterrupt .

Requisiti

   
Client minimo supportato Disponibile a partire da Windows 2000.
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDDIs(storport), IrqlIoPassive2(wdm), PowerIrpDDis(wdm)

Vedi anche

CM_PARTIAL_RESOURCE_DESCRIPTOR

IO_STACK_LOCATION

IoDisconnectInterrupt

KeInitializeSpinLock

KeSynchronizeExecution