Función WdfInterruptCreate (wdfinterrupt.h)

[Se aplica a KMDF y UMDF]

El método WdfInterruptCreate crea un objeto de interrupción de marco.

Sintaxis

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

Parámetros

[in] Device

Identificador de un objeto de dispositivo de marco.

[in] Configuration

Puntero a una estructura de WDF_INTERRUPT_CONFIG inicializada por una llamada a WDF_INTERRUPT_CONFIG_INIT.

[in, optional] Attributes

Puntero a una estructura WDF_OBJECT_ATTRIBUTES que especifica atributos de objeto para el objeto de interrupción del marco. (Vea comentarios para obtener información adicional). Este parámetro es opcional y puede ser WDF_NO_OBJECT_ATTRIBUTES.

[out] Interrupt

Puntero a una ubicación que recibe un identificador para el nuevo objeto de interrupción.

Valor devuelto

WdfInterruptCreate devuelve STATUS_SUCCESS si la operación se realiza correctamente. De lo contrario, este método podría devolver uno de los valores siguientes.

Código devuelto Descripción
STATUS_INFO_LENGTH_MISMATCH
El tamaño de la estructura WDF_INTERRUPT_CONFIG es incorrecto.
STATUS_INVALID_PARAMETER
Se especificó un parámetro no válido.
STATUS_INVALID_DEVICE_STATE

Se llamó a WdfInterruptCreate después de iniciar el dispositivo.

WdfInterruptCreate también devuelve este valor si la rutina de devolución de llamada del controlador EVT_WDF_DEVICE_PREPARE_HARDWARE llama a WdfInterruptCreate con los miembros InterruptRaw e InterruptTranslated de la estructura WDF_INTERRUPT_CONFIG establecida en NULL.

STATUS_INSUFFICIENT_RESOURCES
No había memoria suficiente.
STATUS_WDF_PARENT_ASSIGNMENT_NOT_ALLOWED
En la versión 1.9 o anterior de KMDF, el controlador especificó un valor distinto de NULL para el miembro ParentObject de la estructura WDF_OBJECT_ATTRIBUTES .

En la versión 1.11 o posterior de KMDF, el controlador especificó un valor distinto de un dispositivo de marco o cola para el miembro ParentObject de la estructura WDF_OBJECT_ATTRIBUTES .

STATUS_WDF_INCOMPATIBLE_EXECUTION_LEVEL
El miembro AutomaticSerialization de la estructura WDF_INTERRUPT_CONFIG se establece en TRUE y:
  • El nivel de ejecución del objeto primario de la interrupción es WdfExecutionLevelPassive y el controlador ha proporcionado EvtInterruptDpc.
  • El nivel de ejecución del objeto primario de la interrupción es WdfExecutionLevelDispatch y el controlador ha proporcionado EvtInterruptWorkItem.
Para obtener más información, consulte WDF_INTERRUPT_CONFIG.
STATUS_NOT_SUPPORTED
El controlador solicitó el control de interrupciones de nivel pasivo en una plataforma anterior a Windows 8.
 

Para obtener una lista de otros valores devueltos que puede devolver el método WdfInterruptCreate , vea Errores de creación de objetos de marco.

Este método también podría devolver otros valores NTSTATUS.

Se produce una comprobación de errores si el controlador proporciona un identificador de objeto no válido.

Comentarios

Los controladores suelen llamar al método WdfInterruptCreate desde una función de devolución de llamada EvtDriverDeviceAdd . A partir de kmdf versión 1.11 y UMDF versión 2.0, los controladores pueden llamar a WdfInterruptCreate desde EvtDevicePrepareHardware. Si el controlador llama a WdfInterruptCreate desde EvtDriverDeviceAdd, los miembros InterruptRaw e InterruptTranslated de la estructura WDF_INTERRUPT_CONFIG deben ser NULL. Si el controlador llama a WdfInterruptCreate desde EvtDevicePrepareHardware, estos miembros deben ser válidos.

Si va a crear un objeto de interrupción compatible con reactivación, como se describe en Uso de una interrupción para reactivar un dispositivo, debe llamar a WdfInterruptCreate desde EvtDevicePrepareHardware.

El controlador debe llamar a WdfInterruptCreate una vez para cada vector de interrupción que requiera su dispositivo. Si el dispositivo admite interrupciones señaladas por mensajes (MSI), el controlador debe crear un objeto de interrupción para cada mensaje que el dispositivo pueda admitir.

Una vez que el administrador de PnP asigna recursos del sistema al dispositivo, el marco almacena información sobre los recursos de interrupción asignados del dispositivo en los objetos de interrupción creados por el controlador. (Los controladores que no admiten Plug and Play no pueden usar objetos de interrupción).

Es posible que el sistema no asigne todos los recursos de interrupción que un dispositivo pueda admitir. Por ejemplo, un controlador crearía ocho objetos de interrupción para un dispositivo capaz de admitir ocho mensajes MSI. Sin embargo, el sistema puede asignar solo un mensaje al dispositivo. En ese caso, siete de los objetos de interrupción no se usarán.

Normalmente, el controlador debe almacenar información específica de la interrupción, como el contenido copiado de los registros de interrupciones del dispositivo, en el espacio de contexto del objeto de interrupción. La estructura WDF_OBJECT_ATTRIBUTES que el controlador pasa a WdfInterruptCreate debe describir el espacio de contexto.

En el caso de los controladores que usan la versión 1.9 del marco y versiones anteriores, el elemento primario de cada objeto de interrupción es el objeto de dispositivo al que pertenece la interrupción. El controlador no puede cambiar este elemento primario y el miembro ParentObject de la estructura WDF_OBJECT_ATTRIBUTES debe ser NULL. A partir de la versión 1.11, ParentObject puede ser un objeto de dispositivo de marco o un objeto de cola. Si el controlador especifica un elemento primario, el controlador debe establecer el miembro AutomaticSerialization de la estructura de configuración en TRUE. El controlador puede especificar un elemento primario para ambas interrupciones en DIRQL y interrupciones de nivel pasivo.

Si el controlador proporciona funciones de devolución de llamada EvtCleanupCallback o EvtDestroyCallback para el objeto de interrupción del marco, tenga en cuenta que el marco llama a estas funciones de devolución de llamada en IRQL = PASSIVE_LEVEL.

Para obtener más información sobre el control de interrupciones en controladores basados en marcos, consulte Control de interrupciones de hardware.

Ejemplos

En el ejemplo de código siguiente se inicializa una estructura de WDF_INTERRUPT_CONFIG y una estructura de WDF_OBJECT_ATTRIBUTES y, a continuación, se llama a 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
                            );

Requisitos

Requisito Value
Plataforma de destino Universal
Versión mínima de KMDF 1.0
Versión mínima de UMDF 2.0
Encabezado wdfinterrupt.h (incluir Wdf.h)
Library Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL <=DISPATCH_LEVEL
Reglas de cumplimiento de DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Consulte también

EvtDriverDeviceAdd

WDF_INTERRUPT_CONFIG

WDF_INTERRUPT_CONFIG_INIT

WDF_OBJECT_ATTRIBUTES

WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE