Freigeben über


WdfInterruptCreate-Funktion (wdfinterrupt.h)

[Gilt für KMDF und UMDF]

Die WdfInterruptCreate-Methode erstellt ein Framework-Interruptobjekt.

Syntax

NTSTATUS WdfInterruptCreate(
  [in]           WDFDEVICE              Device,
  [in]           PWDF_INTERRUPT_CONFIG  Configuration,
  [in, optional] PWDF_OBJECT_ATTRIBUTES Attributes,
  [out]          WDFINTERRUPT           *Interrupt
);

Parameter

[in] Device

Ein Handle für ein Framework-Geräteobjekt.

[in] Configuration

Ein Zeiger auf eine WDF_INTERRUPT_CONFIG-Struktur , die durch einen Aufruf von WDF_INTERRUPT_CONFIG_INIT initialisiert wurde.

[in, optional] Attributes

Ein Zeiger auf eine WDF_OBJECT_ATTRIBUTES-Struktur , die Objektattribute für das Framework-Interruptobjekt angibt. (Weitere Informationen finden Sie unter Hinweise.) Dieser Parameter ist optional und kann WDF_NO_OBJECT_ATTRIBUTES werden.

[out] Interrupt

Ein Zeiger auf eine Position, die ein Handle auf das neue Interruptobjekt empfängt.

Rückgabewert

WdfInterruptCreate gibt STATUS_SUCCESS zurück, wenn der Vorgang erfolgreich ist. Andernfalls gibt diese Methode möglicherweise einen der folgenden Werte zurück.

Rückgabecode Beschreibung
STATUS_INFO_LENGTH_MISMATCH
Die Größe der WDF_INTERRUPT_CONFIG-Struktur ist falsch.
STATUS_INVALID_PARAMETER
Ein ungültiger Parameter wurde angegeben.
STATUS_INVALID_DEVICE_STATE

WdfInterruptCreate wurde aufgerufen, nachdem das Gerät gestartet wurde.

WdfInterruptCreate gibt diesen Wert auch zurück, wenn die EVT_WDF_DEVICE_PREPARE_HARDWARE Rückrufroutine des Treibers WdfInterruptCreate aufruft , wobei die Member InterruptRaw und InterruptTranslated der WDF_INTERRUPT_CONFIG Struktur auf NULL festgelegt sind.

STATUS_INSUFFICIENT_RESOURCES
Es war nicht genügend Arbeitsspeicher vorhanden.
STATUS_WDF_PARENT_ASSIGNMENT_NOT_ALLOWED
In KMDF-Version 1.9 oder früher hat der Treiber einen Wert nicht NULL für das ParentObject-Element der WDF_OBJECT_ATTRIBUTES-Struktur angegeben.

In KMDF Version 1.11 oder höher hat der Treiber einen anderen Wert als ein Frameworkgerät oder eine Warteschlange für das ParentObject-Element der WDF_OBJECT_ATTRIBUTES-Struktur angegeben.

STATUS_WDF_INCOMPATIBLE_EXECUTION_LEVEL
Das AutomaticSerialization-Element der WDF_INTERRUPT_CONFIG-Struktur ist auf TRUE festgelegt, und zwar auf:
  • Die Ausführungsebene des übergeordneten Objekts des Interrupts ist WdfExecutionLevelPassive , und der Treiber hat EvtInterruptDpc bereitgestellt.
  • Die Ausführungsebene des übergeordneten Objekts des Interrupts ist WdfExecutionLevelDispatch , und der Treiber hat EvtInterruptWorkItem bereitgestellt.
Weitere Informationen finden Sie unter WDF_INTERRUPT_CONFIG.
STATUS_NOT_SUPPORTED
Der Treiber hat die Behandlung von Unterbrechungen auf passiver Ebene auf einer Plattform früher als Windows 8 angefordert.
 

Eine Liste mit anderen Rückgabewerten, die von der WdfInterruptCreate-Methode möglicherweise zurückgegeben werden, finden Sie unter Fehler beim Erstellen von Frameworkobjekten.

Diese Methode kann auch andere NTSTATUS-Werte zurückgeben.

Eine Fehlerüberprüfung tritt auf, wenn der Treiber ein ungültiges Objekthandle bereitstellt.

Hinweise

Treiber rufen in der Regel die WdfInterruptCreate-Methode von einer EvtDriverDeviceAdd-Rückruffunktion auf. Ab KMDF Version 1.11 und UMDF Version 2.0 können Treiber WdfInterruptCreate von EvtDevicePrepareHardware aufrufen. Wenn der Treiber WdfInterruptCreate von EvtDriverDeviceAdd aufruft, müssen die Member InterruptRaw und InterruptTranslated der WDF_INTERRUPT_CONFIG-Struktur NULL sein. Wenn der Treiber WdfInterruptCreate von EvtDevicePrepareHardware aufruft, müssen beide Elemente gültig sein.

Wenn Sie ein Wake-fähiges Interruptobjekt erstellen, wie unter Verwenden eines Interrupts zum Reaktivieren eines Geräts beschrieben, müssen Sie WdfInterruptCreate von EvtDevicePrepareHardware aufrufen.

Ihr Treiber muss WdfInterruptCreate einmal für jeden Interruptvektor aufrufen, den sein Gerät benötigt. Wenn das Gerät MSI (Message-Signaled Interrupts) unterstützt, muss der Treiber ein Interruptobjekt für jede Nachricht erstellen, die das Gerät unterstützen kann.

Nachdem der PnP-Manager dem Gerät Systemressourcen zugewiesen hat, speichert das Framework Informationen zu den dem Gerät zugewiesenen Interruptressourcen in den Interruptobjekten, die der Treiber erstellt hat. (Treiber, die Plug & Play nicht unterstützen, können keine Interruptobjekte verwenden.)

Das System weist möglicherweise nicht alle Interruptressourcen zu, die ein Gerät unterstützen kann. Ein Treiber würde beispielsweise acht Interruptobjekte für ein Gerät erstellen, das acht MSI-Nachrichten unterstützen kann. Das System weist dem Gerät jedoch möglicherweise nur eine Nachricht zu. In diesem Fall werden sieben der Interruptobjekte nicht verwendet.

In der Regel sollte Ihr Treiber interruptspezifische Informationen, z. B. den kopierten Inhalt von Geräteunterbrechungsregistern, im Kontextbereich des Interruptobjekts speichern. Die WDF_OBJECT_ATTRIBUTES Struktur, die der Treiber an WdfInterruptCreate übergibt, sollte den Kontextraum beschreiben.

Bei Treibern mit Frameworkversion 1.9 und früher ist das übergeordnete Element jedes Interruptobjekts das Geräteobjekt, zu dem der Interrupt gehört. Der Treiber kann dieses übergeordnete Element nicht ändern, und das ParentObject-Element der WDF_OBJECT_ATTRIBUTES-Struktur muss NULL sein. Ab Version 1.11 kann ParentObject ein Framework- oder Warteschlangenobjekt sein. Wenn der Treiber ein übergeordnetes Element angibt, muss der Treiber das Element AutomaticSerialization der Konfigurationsstruktur auf TRUE festlegen. Der Treiber kann sowohl für Interrupts auf DIRQL als auch für Interrupts auf passiver Ebene ein übergeordnetes Element angeben.

Wenn Ihr Treiber EvtCleanupCallback - oder EvtDestroyCallback-Rückruffunktionen für das Framework-Interruptobjekt bereitstellt, beachten Sie, dass das Framework diese Rückruffunktionen unter IRQL = PASSIVE_LEVEL aufruft.

Weitere Informationen zum Behandeln von Interrupts in frameworkbasierten Treibern finden Sie unter Behandeln von Hardwareunterbrechungen.

Beispiele

Im folgenden Codebeispiel werden eine WDF_INTERRUPT_CONFIG-Struktur und eine WDF_OBJECT_ATTRIBUTES-Struktur initialisiert und dann WdfInterruptCreate aufgerufen.

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

Anforderungen

Anforderung Wert
Zielplattform Universell
KMDF-Mindestversion 1.0
UMDF-Mindestversion 2.0
Kopfzeile wdfinterrupt.h (einschließen von Wdf.h)
Bibliothek Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
DDI-Complianceregeln DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Weitere Informationen

EvtDriverDeviceAdd

WDF_INTERRUPT_CONFIG

WDF_INTERRUPT_CONFIG_INIT

WDF_OBJECT_ATTRIBUTES

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE