Compartilhar via


Função IoRegisterPlugPlayNotification (wdm.h)

A rotina IoRegisterPlugPlayNotification registra uma rotina de retorno de chamada de notificação de Plug and Play (PnP) a ser chamada quando ocorre um evento PnP da categoria especificada.

Sintaxe

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 um valor de enumeração de IO_NOTIFICATION_EVENT_CATEGORY que indica a categoria do evento PnP para o qual a rotina de retorno de chamada está sendo registrada.

[in] EventCategoryFlags

Sinalizar bits que modificam a operação de registro. Os valores possíveis incluem:

PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES

Válido somente com um EventCategory de EventCategoryDeviceInterfaceChange. Se definido, o gerenciador PnP chamará a rotina de retorno de chamada do driver para cada instância de interface do dispositivo atualmente registrada e ativa e registrará a rotina de retorno de chamada para chegadas futuras ou remoções de instâncias de interface do dispositivo.

[in, optional] EventCategoryData

Um ponteiro para obter mais informações sobre os eventos para os quais CallbackRoutine está sendo registrado. As informações variam para diferentes valores EventCategory :

  • Quando EventCategory é EventCategoryDeviceInterfaceChange, EventCategoryData deve apontar para um GUID que especifica uma classe de interface do dispositivo. CallbackRoutine será chamado quando uma interface dessa classe estiver habilitada ou removida.

  • Quando EventCategory é EventCategoryHardwareProfileChange, EventCategoryData deve ser NULL.

  • Quando EventCategory é EventCategoryTargetDeviceChange, EventCategoryData deve apontar para o objeto de arquivo para o qual a notificação PnP é solicitada.

[in] DriverObject

Um ponteiro para o objeto de driver do chamador.

Para garantir que o driver permaneça carregado enquanto está registrado para notificação PnP, essa chamada incrementa a contagem de referência em DriverObject. O gerenciador PnP diminui a contagem de referência quando esse registro é removido.

Para EventCategoryTargetDeviceChange, DriverObject não deve ser o objeto driver do dispositivo de destino; em vez disso, ele deve ser o objeto driver do driver que implementa CallbackRoutine.

[in] CallbackRoutine

Um ponteiro para a rotina de retorno de chamada de notificação PnP a ser chamada quando o evento PnP especificado ocorrer.

O protótipo de função para essa rotina de retorno de chamada é definido da seguinte maneira:

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

O NotificationStructure da rotina de retorno de chamada é específico para o valor EventCategory, conforme mostrado na tabela a seguir.

Categoria de evento Estrutura de notificação
EventCategoryDeviceInterfaceChange DEVICE_INTERFACE_CHANGE_NOTIFICATION
EventCategoryHardwareProfileChange HWPROFILE_CHANGE_NOTIFICATION
EventCategoryTargetDeviceChange TARGET_DEVICE_REMOVAL_NOTIFICATION

Para obter mais informações, consulte Usando a notificação PnP e TARGET_DEVICE_CUSTOM_NOTIFICATION.

O parâmetro Context da rotina de retorno de chamada contém os dados de contexto fornecidos pelo driver durante o registro.

Para obter informações sobre como incluir uma declaração de função para a rotina de retorno de chamada que atende aos requisitos do SDV ( Verificador de Driver Estático ), consulte Exemplos.

O gerenciador PnP chama rotinas de retorno de chamada do driver em IRQL = PASSIVE_LEVEL.

[in, optional] Context

Um ponteiro para um buffer alocado pelo chamador que contém o contexto que o gerenciador PnP passa para a rotina de retorno de chamada.

[out] NotificationEntry

Um ponteiro para um valor opaco retornado por essa chamada que identifica o registro. Passe esse valor para a rotina IoUnregisterPlugPlayNotificationEx para remover o registro.

Retornar valor

IoRegisterPlugPlayNotification retorna STATUS_SUCCESS ou um erro apropriado status.

Comentários

Um driver se registra para uma categoria de evento. Cada categoria inclui um ou mais tipos de eventos PnP.

Um driver pode registrar diferentes rotinas de retorno de chamada para diferentes categorias de evento ou pode registrar uma única rotina de retorno de chamada. Uma única rotina de retorno de chamada pode converter NotificationStructure em um PLUGPLAY_NOTIFICATION_HEADER e usar o campo Evento para determinar o tipo exato da estrutura de notificação.

Se o chamador especificar PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, o sistema operacional poderá chamar a rotina de retorno de chamada de notificação PnP duas vezes para um único evento EventCategoryDeviceInterfaceChange para uma interface existente. Você pode ignorar com segurança a segunda chamada para o retorno de chamada. O sistema operacional não chamará o retorno de chamada mais de duas vezes para um único evento.

As rotinas de retorno de chamada de notificação PnP devem concluir suas tarefas o mais rápido possível e retornar o controle ao gerenciador PnP, para evitar atrasos na notificação de outros drivers e aplicativos registrados para o evento.

O gerenciador PnP não faz uma referência no objeto de arquivo quando um driver se registra para notificação de um evento EventCategoryTargetDeviceChange . Se a rotina de retorno de chamada de notificação PnP do driver exigir acesso ao objeto de arquivo, o driver deverá fazer uma referência extra no objeto de arquivo antes de chamar IoRegisterPlugPlayNotification.

Normalmente, Kernel-Mode drivers kmdf (Driver Framework) devem chamar IoRegisterPlugPlayNotification de sua função de retorno de chamada EvtDeviceSelfManagedIoInit e devem chamar IoUnregisterPlugPlayNotification de sua função de retorno de chamada EvtDeviceSelfManagedIoCleanup . Esses drivers não devem chamar IoRegisterPlugPlayNotification da função de retorno de chamada EvtDriverDeviceAdd ; caso contrário, a rotina de retorno de chamada de notificação PnP pode ser chamada antes que a pilha de driver seja iniciada pelo PnP, caso em que o driver não estará preparado para lidar com a notificação.

Para obter mais informações, consulte Usando a notificação PnP.

Exemplos

Para definir uma rotina de retorno de chamada de notificação PnP, primeiro você deve fornecer uma declaração de função que identifique o tipo de rotina de retorno de chamada que você está definindo. O Windows fornece um conjunto de tipos de função de retorno de chamada para drivers. Declarar uma função usando os tipos de função de retorno de chamada ajuda a Análise de Código para Drivers, SDV ( Verificador de Driver Estático ) e outras ferramentas de verificação a encontrar erros e é um requisito para gravar drivers para o sistema operacional Windows.

Por exemplo, para definir uma rotina de retorno de chamada de notificação PnP chamada MyCallbackRoutine, use o tipo DRIVER_NOTIFICATION_CALLBACK_ROUTINE conforme mostrado neste exemplo de código:

DRIVER_NOTIFICATION_CALLBACK_ROUTINE MyCallbackRoutine;

Em seguida, implemente sua rotina de retorno de chamada da seguinte maneira:

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

O tipo de função DRIVER_NOTIFICATION_CALLBACK_ROUTINE é definido no arquivo de cabeçalho Wdm.h. Para identificar erros com mais precisão ao executar as ferramentas de análise de código, adicione a anotação Use_decl_annotations à sua definição de função. A anotação Use_decl_annotations garante que as anotações aplicadas ao tipo de função DRIVER_NOTIFICATION_CALLBACK_ROUTINE no arquivo de cabeçalho sejam usadas. Para obter mais informações sobre os requisitos para declarações de função, consulte Declarando funções usando tipos de função de função para drivers WDM. Para obter informações sobre _Use_decl_annotations_, consulte Anotando o comportamento da função.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Biblioteca NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regras de conformidade de DDI HwStorPortProhibitedDIs(storport), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PowerIrpDDis(wdm)

Confira também

Usando a notificação PnP

DEVICE_INTERFACE_CHANGE_NOTIFICATION

EvtDeviceSelfManagedIoCleanup

EvtDeviceSelfManagedIoInit

EvtDriverDeviceAdd

HWPROFILE_CHANGE_NOTIFICATION

IoUnregisterPlugPlayNotification

IoUnregisterPlugPlayNotificationEx

PLUGPLAY_NOTIFICATION_HEADER

TARGET_DEVICE_CUSTOM_NOTIFICATION

TARGET_DEVICE_REMOVAL_NOTIFICATION