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
STATUS_INFO_LENGTH_MISMATCH
Le dimensioni della struttura WDF_INTERRUPT_CONFIG non sono corrette.
STATUS_INVALID_PARAMETER
È stato specificato un parametro non valido.
STATUS_INVALID_DEVICE_STATE

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.

STATUS_INSUFFICIENT_RESOURCES
Memoria insufficiente.
STATUS_WDF_PARENT_ASSIGNMENT_NOT_ALLOWED
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 .

STATUS_WDF_INCOMPATIBLE_EXECUTION_LEVEL
Il membro AutomaticSerialization della struttura WDF_INTERRUPT_CONFIG è impostato su TRUE e su entrambi:
  • Il livello di esecuzione dell'oggetto padre dell'interrupt è WdfExecutionLevelPassive e il driver ha fornito EvtInterruptDpc.
  • Il livello di esecuzione dell'oggetto padre dell'interrupt è WdfExecutionLevelDispatch e il driver ha fornito EvtInterruptWorkItem.
Per altre informazioni, vedere WDF_INTERRUPT_CONFIG.
STATUS_NOT_SUPPORTED
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)

Vedi anche

EvtDriverDeviceAdd

WDF_INTERRUPT_CONFIG

WDF_INTERRUPT_CONFIG_INIT

WDF_OBJECT_ATTRIBUTES

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE