Funzione WdfInterruptCreate (wdfinterrupt.h)
[Si applica a KMDF e UMDF]
Il metodo WdfInterruptCreate crea un oggetto interrupt del framework.
Sintassi
NTSTATUS WdfInterruptCreate(
[in] WDFDEVICE Device,
[in] PWDF_INTERRUPT_CONFIG Configuration,
[in, optional] PWDF_OBJECT_ATTRIBUTES Attributes,
[out] WDFINTERRUPT *Interrupt
);
Parametri
[in] Device
Handle per un oggetto dispositivo framework.
[in] Configuration
Puntatore a una struttura WDF_INTERRUPT_CONFIG inizializzata da una chiamata a WDF_INTERRUPT_CONFIG_INIT.
[in, optional] Attributes
Puntatore a una struttura WDF_OBJECT_ATTRIBUTES che specifica gli attributi dell'oggetto oggetto per l'oggetto interrupt del framework. Per ulteriori informazioni, vedere la sezione Note. Questo parametro è facoltativo e può essere WDF_NO_OBJECT_ATTRIBUTES.
[out] Interrupt
Puntatore a una posizione che riceve un handle per il nuovo oggetto interrupt.
Valore restituito
WdfInterruptCreate restituisce STATUS_SUCCESS se l'operazione ha esito positivo. In caso contrario, questo metodo potrebbe restituire uno dei valori seguenti.
Codice restituito | Descrizione |
---|---|
|
Le dimensioni della struttura WDF_INTERRUPT_CONFIG non sono corrette. |
|
È stato specificato un parametro non valido. |
|
WdfInterruptCreate è stato chiamato dopo l'avvio del dispositivo. WdfInterruptCreate restituisce anche questo valore se la routine di callback del driver EVT_WDF_DEVICE_PREPARE_HARDWARE chiama WdfInterruptCreate con i membri InterruptRaw e InterruptTranslated della struttura WDF_INTERRUPT_CONFIG impostata su NULL. |
|
Memoria insufficiente. |
|
In KMDF versione 1.9 o precedente, il driver ha specificato un valore non NULL per il membro ParentObject della struttura WDF_OBJECT_ATTRIBUTES .
In KMDF versione 1.11 o successiva, il driver ha specificato un valore diverso da un dispositivo framework o una coda per il membro ParentObject della struttura WDF_OBJECT_ATTRIBUTES . |
|
Il membro AutomaticSerialization della struttura WDF_INTERRUPT_CONFIG è impostato su TRUE e su entrambi:
|
|
Il driver ha richiesto la gestione degli interrupt a livello passivo in una piattaforma precedente a Windows 8. |
Per un elenco di altri valori restituiti che il metodo WdfInterruptCreate potrebbe restituire, vedere Errori di creazione di oggetti framework.
Questo metodo potrebbe anche restituire altri valori NTSTATUS.
Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.
Commenti
I driver in genere chiamano il metodo WdfInterruptCreate da una funzione di callback EvtDriverDeviceAdd . A partire da KMDF versione 1.11 e UMDF versione 2.0, i driver possono chiamare WdfInterruptCreate da EvtDevicePrepareHardware. Se il driver chiama WdfInterruptCreate da EvtDriverDeviceAdd, i membri InterruptRaw e InterruptTranslated della struttura WDF_INTERRUPT_CONFIG devono essere NULL. Se il driver chiama WdfInterruptCreate da EvtDevicePrepareHardware, questi membri devono essere entrambi validi.
Se si crea un oggetto interrupt con supporto per la riattivazione, come descritto in Uso di un interrupt per riattivare un dispositivo, è necessario chiamare WdfInterruptCreate da EvtDevicePrepareHardware.
Il driver deve chiamare WdfInterruptCreate una volta per ogni vettore di interrupt richiesto dal dispositivo. Se il dispositivo supporta interruzioni segnalate dai messaggi, il driver deve creare un oggetto interrupt per ogni messaggio che il dispositivo può supportare.
Dopo che il gestore PnP assegna le risorse di sistema al dispositivo, il framework archivia le informazioni sulle risorse di interrupt assegnate del dispositivo negli oggetti interrupt creati dal driver. I driver che non supportano Plug and Play non possono usare oggetti interrupt.
Il sistema potrebbe non assegnare tutte le risorse di interrupt che un dispositivo può supportare. Ad esempio, un driver crea otto oggetti interrupt per un dispositivo in grado di supportare otto messaggi MSI. Tuttavia, il sistema potrebbe assegnare un solo messaggio al dispositivo. In tal caso, sette degli oggetti interrupt saranno inutilizzati.
In genere, il driver deve archiviare informazioni specifiche di interrupt, ad esempio il contenuto copiato dei registri di interruzione del dispositivo, nello spazio di contesto dell'oggetto interrupt. La struttura WDF_OBJECT_ATTRIBUTES che il driver passa a WdfInterruptCreate deve descrivere lo spazio del contesto.
Per i driver che usano framework versione 1.9 e precedenti, l'elemento padre di ogni oggetto interrupt è l'oggetto dispositivo a cui appartiene l'interrupt. Il driver non può modificare questo elemento padre e il membro ParentObject della struttura WDF_OBJECT_ATTRIBUTES deve essere NULL. A partire dalla versione 1.11, ParentObject può essere un oggetto dispositivo framework o un oggetto coda. Se il driver specifica un elemento padre, il driver deve impostare il membro AutomaticSerialization della struttura di configurazione su TRUE. Il driver può specificare un elemento padre per entrambe le interruzioni a livello DIRQL e passivo.
Se il driver fornisce funzioni di callback EvtCleanupCallback o EvtDestroyCallback per l'oggetto interrupt del framework, si noti che il framework chiama queste funzioni di callback in IRQL = PASSIVE_LEVEL.
Per altre informazioni sulla gestione degli interrupt nei driver basati su framework, vedere Gestione degli interrupt hardware.
Esempio
Nell'esempio di codice seguente viene inizializzata una struttura WDF_INTERRUPT_CONFIG e una struttura WDF_OBJECT_ATTRIBUTES e quindi viene chiamata WdfInterruptCreate.
NTSTATUS status;
WDF_INTERRUPT_CONFIG interruptConfig;
WDF_OBJECT_ATTRIBUTES interruptAttributes;
WDF_INTERRUPT_CONFIG_INIT(
&interruptConfig,
MyEvtInterruptIsr,
MyEvtInterruptDpc
);
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(
&interruptAttributes,
INTERRUPT_DATA
);
status = WdfInterruptCreate(
device,
&interruptConfig,
&interruptAttributes,
&devExt->WdfInterrupt
);
Requisiti
Requisito | Valore |
---|---|
Piattaforma di destinazione | Universale |
Versione KMDF minima | 1.0 |
Versione UMDF minima | 2,0 |
Intestazione | wdfinterrupt.h (include Wdf.h) |
Libreria | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <=DISPATCH_LEVEL |
Regole di conformità DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |