Funzione IoConnectInterrupt (wdm.h)

La routine IoConnectInterrupt registra la routine InterruptService (ISR) di un driver di dispositivo, in modo che venga chiamata quando un dispositivo interrompe su 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 di archiviazione fornito dal driver per un puntatore a un set di oggetti interrupt. 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 controller di un oggetto controller creato dal driver o in un pool non a pagina allocato dal driver di 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 del driver. Questo parametro è obbligatorio se l'ISR gestisce più di un vettore o se il driver ha più isr. In caso contrario, il driver non deve allocare spazio di archiviazione per un blocco di spin di interruzione e il puntatore di input è NULL.

[in] Vector

Specifica il vettore di interrupt passato nella risorsa interrupt nel membro u.Interrupt.Vector di CM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] Irql

Specifica il DIRQL passato nella risorsa interrupt nel membro u.Interrupt.Level di CM_PARTIAL_RESOURCE_DESCRIPTOR.

[in] SynchronizeIrql

Specifica l'identificatore DIRQL in cui verrà eseguito l'ISR. Se l'ISR gestisce più di un vettore di interrupt 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 interrupt. In caso contrario, i valori Irql e SynchronizeIrql sono identici.

[in] InterruptMode

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

[in] ShareVector

Specifica se il vettore di interrupt è 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 interrupt in u.Interrupt.Affinity.

[in] FloatingSave

Specifica se salvare lo stack a virgola mobile quando il dispositivo del driver viene interrotto. Per le piattaforme basate su x86 e Itanium, questo valore deve essere impostato su FALSE. Per altre informazioni sul salvataggio dello stato mmx e a virgola mobile, vedere Uso di mmx o a virgola mobile 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'era abbastanza pool non di paging.

Commenti

I nuovi driver devono usare la routine IoConnectInterruptEx , che è più facile da usare. I driver per i dispositivi che supportano interrupt 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 risorse hardware non elaborate e tradotte rispettivamente nei membri Parameters.StartDevice.AllocateResources e Parameters.StartDevice.AllocateResourcesTranslated della struttura IO_STACK_LOCATION di IRP. Per connettere l'interrupt, 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 lo spazio di archiviazione per SpinLock, deve chiamare KeInitializeSpinLock prima di passare il blocco di spin interrupt a IoConnectInterrupt.

Al termine della chiamata a IoConnectInterrupt, è possibile chiamare l'ISR del chiamante se gli interrupt sono abilitati nel dispositivo del driver o se ShareVector è stato impostato su TRUE. I driver non devono abilitare gli interrupt finché non viene restituito IoConnectInterrupt .

Requisiti

Requisito Valore
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