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 |
---|---|
|
El tamaño de la estructura WDF_INTERRUPT_CONFIG es incorrecto. |
|
Se especificó un parámetro no válido. |
|
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. |
|
No había memoria suficiente. |
|
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 . |
|
El miembro AutomaticSerialization de la estructura WDF_INTERRUPT_CONFIG se establece en TRUE y:
|
|
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) |