Compartir a través de


Función IoRegisterPlugPlayNotification (wdm.h)

La rutina IoRegisterPlugPlayNotification registra una rutina de devolución de llamada de notificación Plug and Play (PnP) que se llamará cuando se produce un evento PnP de la categoría especificada.

Sintaxis

NTSTATUS IoRegisterPlugPlayNotification(
  [in]           IO_NOTIFICATION_EVENT_CATEGORY        EventCategory,
  [in]           ULONG                                 EventCategoryFlags,
  [in, optional] PVOID                                 EventCategoryData,
  [in]           PDRIVER_OBJECT                        DriverObject,
  [in]           PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
  [in, optional] __drv_aliasesMem PVOID                Context,
  [out]          PVOID                                 *NotificationEntry
);

Parámetros

[in] EventCategory

Especifica un valor de enumeración de IO_NOTIFICATION_EVENT_CATEGORY que indica la categoría del evento PnP para el que se está registrando la rutina de devolución de llamada.

[in] EventCategoryFlags

Marcar bits que modifican la operación de registro. Entre los valores posibles se incluyen:

PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES

Solo es válido con un EventCategory de EventCategoryDeviceInterfaceChange. Si se establece, el administrador de PnP llama a la rutina de devolución de llamada del controlador para cada instancia de interfaz de dispositivo registrada actualmente y activa y registra la rutina de devolución de llamada para futuras llegadas o eliminaciones de instancias de interfaz de dispositivo.

[in, optional] EventCategoryData

Puntero a información adicional sobre los eventos para los que se está registrando CallbackRoutine. La información varía para distintos valores de EventCategory:

  • Cuando EventCategory es EventCategoryDeviceInterfaceChange, EventCategoryData debe apuntar a un GUID que especifique una clase de interfaz de dispositivo. callbackRoutine se llamará cuando se habilite o quite una interfaz de esa clase.

  • Cuando eventCategory EventCategoryHardwareProfileChange, eventCategoryData debe ser null.

  • Cuando EventCategory es EventCategoryTargetDeviceChange, EventCategoryData debe apuntar al objeto de archivo para el que se solicita la notificación PnP.

[in] DriverObject

Puntero al objeto de controlador del autor de la llamada.

Para asegurarse de que el controlador permanece cargado mientras está registrado para la notificación de PnP, esta llamada incrementa el recuento de referencias de DriverObject. El administrador de PnP disminuye el recuento de referencias cuando se quita este registro.

Para EventCategoryTargetDeviceChange, DriverObject no debe ser el objeto de controlador del dispositivo de destino; en su lugar, debe ser el objeto de controlador del controlador que implementa CallbackRoutine.

[in] CallbackRoutine

Puntero a la rutina de devolución de llamada de notificación PnP a la que se llamará cuando se produce el evento PnP especificado.

El prototipo de función para esta rutina de devolución de llamada se define de la siguiente manera:

typedef NTSTATUS
  DRIVER_NOTIFICATION_CALLBACK_ROUTINE(
    _In_ PVOID NotificationStructure,
    _Inout_opt_ PVOID Context
    );

La rutina de devolución de llamada NotificationStructure es específica del valor de EventCategory, como se muestra en la tabla siguiente.

Categoría de eventos Estructura de notificaciones
EventCategoryDeviceInterfaceChange DEVICE_INTERFACE_CHANGE_NOTIFICATION
EventCategoryHardwareProfileChange HWPROFILE_CHANGE_NOTIFICATION
EventCategoryTargetDeviceChange TARGET_DEVICE_REMOVAL_NOTIFICATION

Para obtener más información, consulte Using PnP Notification and TARGET_DEVICE_CUSTOM_NOTIFICATION.

El parámetro context de la rutina de devolución de llamada contiene los datos de contexto proporcionados durante el registro.

Para obtener información sobre cómo incluir una declaración de función para la rutina de devolución de llamada que cumple los requisitos de static Driver Verifier (SDV), consulte Ejemplos.

El administrador de PnP llama a las rutinas de devolución de llamada del controlador en IRQL = PASSIVE_LEVEL.

[in, optional] Context

Puntero a un búfer asignado por el autor de la llamada que contiene el contexto que el administrador de PnP pasa a la rutina de devolución de llamada.

[out] NotificationEntry

Puntero a un valor opaco devuelto por esta llamada que identifica el registro. Pase este valor a la rutina IoUnregisterPlugPlayNotificationEx para quitar el registro.

Valor devuelto

ioRegisterPlugPlayNotification devuelve STATUS_SUCCESS o un estado de error adecuado.

Observaciones

Un controlador se registra para una categoría de eventos. Cada categoría incluye uno o varios tipos de eventos PnP.

Un controlador puede registrar diferentes rutinas de devolución de llamada para diferentes categorías de eventos o puede registrar una sola rutina de devolución de llamada. Una única rutina de devolución de llamada puede convertir el NotificationStructure a un PLUGPLAY_NOTIFICATION_HEADER y usar el campo evento de para determinar el tipo exacto de la estructura de notificación.

Si el autor de la llamada especifica PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, el sistema operativo podría llamar a la rutina de devolución de llamada de notificación PnP dos veces para una sola evento EventCategoryDeviceInterfaceChange para una interfaz existente. Puede omitir de forma segura la segunda llamada a la devolución de llamada. El sistema operativo no llamará a la devolución de llamada más de dos veces para un único evento.

Las rutinas de devolución de llamada de notificación PnP deben completar sus tareas lo antes posible y devolver el control al administrador de PnP, para evitar retrasos en notificar a otros controladores y aplicaciones que se han registrado para el evento.

El administrador de PnP no quita una referencia en el objeto de archivo cuando un controlador se registra para recibir una notificación de un evento eventCategoryTargetDeviceChange . Si la rutina de devolución de llamada de notificación PnP del controlador requiere acceso al objeto de archivo, el controlador debe sacar una referencia adicional en el objeto de archivo antes de llamar a IoRegisterPlugPlayNotification.

Normalmente, los controladores de Kernel-Mode Driver Framework (KMDF) deben llamar a ioRegisterPlugPlayNotification desde su EvtDeviceSelfManagedIoInit función de devolución de llamada y deben llamar a IoUnregisterPlugPlayNotification desde su EvtDeviceSelfManagedIoCleanup función de devolución de llamada. Estos controladores no deben llamar ioRegisterPlugPlayNotification desde su función de devolución de llamada EvtDriverDeviceAdd; De lo contrario, PnP podría llamar a la rutina de devolución de llamada de notificación PnP antes de que PnP inicie la pila de controladores, en cuyo caso el controlador no estará preparado para controlar la notificación.

Para obtener más información, vea Using PnP Notification.

Ejemplos

Para definir una rutina de devolución de llamada de notificación PnP, primero debe proporcionar una declaración de función que identifique el tipo de rutina de devolución de llamada que va a definir. Windows proporciona un conjunto de tipos de función de devolución de llamada para controladores. Declarar una función mediante los tipos de función de devolución de llamada ayuda a Análisis de código para controladores, comprobador de controladores estáticos (SDV) y otras herramientas de comprobación encuentran errores y es un requisito para escribir controladores para el sistema operativo Windows.

Por ejemplo, para definir una rutina de devolución de llamada de notificación PnP denominada MyCallbackRoutine, use el tipo de DRIVER_NOTIFICATION_CALLBACK_ROUTINE tal y como se muestra en este ejemplo de código:

DRIVER_NOTIFICATION_CALLBACK_ROUTINE MyCallbackRoutine;

A continuación, implemente la rutina de devolución de llamada de la siguiente manera:

_Use_decl_annotations_
NTSTATUS
  MyCallbackRoutine(
    PVOID NotificationStructure,
    PVOID Context
    )
  {
      // Function body
  }

El tipo de función DRIVER_NOTIFICATION_CALLBACK_ROUTINE se define en el archivo de encabezado Wdm.h. Para identificar con más precisión los errores al ejecutar las herramientas de análisis de código, asegúrese de agregar la anotación Use_decl_annotations a la definición de función. La anotación Use_decl_annotations garantiza que se usen las anotaciones que se aplican al tipo de función DRIVER_NOTIFICATION_CALLBACK_ROUTINE en el archivo de encabezado. Para obtener más información sobre los requisitos de las declaraciones de función, vea Declarar funciones mediante tipos de rol de función para controladores WDM. Para obtener información sobre _Use_decl_annotations_, vea Anotación del comportamiento de la función.

Requisitos

Requisito Valor
de la plataforma de destino de Universal
encabezado de wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL PASSIVE_LEVEL
reglas de cumplimiento de DDI HwStorPortProhibitedDIs(storport), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), powerIrpDDis(wdm)

Consulte también

usar de notificación de PnP

DEVICE_INTERFACE_CHANGE_NOTIFICATION

EvtDeviceSelfManagedIoCleanup

EvtDeviceSelfManagedIoInit

EvtDriverDeviceAdd

HWPROFILE_CHANGE_NOTIFICATION

IoUnregisterPlugPlayNotification

IoUnregisterPlugPlayNotificationEx

PLUGPLAY_NOTIFICATION_HEADER

TARGET_DEVICE_CUSTOM_NOTIFICATION

TARGET_DEVICE_REMOVAL_NOTIFICATION