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) |