Condividi tramite


Funzione IoRegisterPlugPlayNotification (wdm.h)

La routine IoRegisterPlugPlayNotification registra una routine di callback di notifica Plug and Play (PnP) da chiamare quando si verifica un evento PnP della categoria specificata.

Sintassi

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

Parametri

[in] EventCategory

Specifica un valore di enumerazione da IO_NOTIFICATION_EVENT_CATEGORY che indica la categoria dell'evento PnP per cui viene registrata la routine di callback.

[in] EventCategoryFlags

Flag bit che modificano l'operazione di registrazione. I valori possibili sono:

PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES

Valido solo con EventCategory di EventCategoryDeviceInterfaceChange. Se impostato, il gestore PnP chiama la routine di callback del driver per ogni istanza dell'interfaccia del dispositivo attualmente registrata e attiva e registra la routine di callback per gli arrivi futuri o le rimozioni delle istanze dell'interfaccia del dispositivo.

[in, optional] EventCategoryData

Puntatore a ulteriori informazioni sugli eventi per i quali viene registrata CallbackRoutine . Le informazioni variano per valori EventCategory diversi:

  • Quando EventCategory è EventCategoryDeviceInterfaceChange, EventCategoryData deve puntare a un GUID che specifica una classe di interfaccia dispositivo. CallbackRoutine verrà chiamato quando un'interfaccia di tale classe è abilitata o rimossa.

  • Quando EventCategory è EventCategoryHardwareProfileChange, EventCategoryData deve essere NULL.

  • Quando EventCategory è EventCategoryTargetDeviceChange, EventCategoryData deve puntare all'oggetto file per cui viene richiesta la notifica PnP.

[in] DriverObject

Puntatore all'oggetto driver del chiamante.

Per assicurarsi che il driver rimanga caricato mentre è registrato per la notifica PnP, questa chiamata incrementa il conteggio dei riferimenti in DriverObject. Il gestore PnP decrementa il conteggio dei riferimenti quando questa registrazione viene rimossa.

Per EventCategoryTargetDeviceChange, DriverObject non deve essere l'oggetto driver del dispositivo di destinazione; deve essere invece l'oggetto driver del driver che implementa CallbackRoutine.

[in] CallbackRoutine

Puntatore alla routine di callback di notifica PnP da chiamare quando si verifica l'evento PnP specificato.

Il prototipo di funzione per questa routine di callback è definito come segue:

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

NotificationStructure della routine di callback è specifico del valore EventCategory, come illustrato nella tabella seguente.

Categoria evento Struttura delle notifiche
EventCategoryDeviceInterfaceChange DEVICE_INTERFACE_CHANGE_NOTIFICATION
EventCategoryHardwareProfileChange HWPROFILE_CHANGE_NOTIFICATION
EventCategoryTargetDeviceChange TARGET_DEVICE_REMOVAL_NOTIFICATION

Per altre informazioni, vedere Uso della notifica PnP e TARGET_DEVICE_CUSTOM_NOTIFICATION.

Il parametro Context della routine di callback contiene i dati di contesto forniti dal driver durante la registrazione.

Per informazioni sull'inclusione di una dichiarazione di funzione per la routine di callback che soddisfa i requisiti di Static Driver Verifier (SDV), vedere Esempi.

Il gestore PnP chiama routine di callback del driver in IRQL = PASSIVE_LEVEL.

[in, optional] Context

Puntatore a un buffer allocato dal chiamante contenente il contesto che il gestore PnP passa alla routine di callback.

[out] NotificationEntry

Puntatore a un valore opaco restituito da questa chiamata che identifica la registrazione. Passare questo valore alla routine IoUnregisterPlugPlayNotificationEx per rimuovere la registrazione.

Valore restituito

IoRegisterPlugPlayNotification restituisce STATUS_SUCCESS o uno stato di errore appropriato.

Commenti

Un driver esegue la registrazione per una categoria di eventi. Ogni categoria include uno o più tipi di eventi PnP.

Un driver può registrare routine di callback diverse per categorie di eventi diverse o può registrare una singola routine di callback. Una singola routine di callback può eseguire il cast di NotificationStructure a un PLUGPLAY_NOTIFICATION_HEADER e usare il campo Evento per determinare il tipo esatto della struttura di notifica.

Se il chiamante specifica PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, il sistema operativo potrebbe chiamare due volte la routine di callback di notifica PnP per un singolo evento EventCategoryDeviceInterfaceChange per un'interfaccia esistente. È possibile ignorare in modo sicuro la seconda chiamata al callback. Il sistema operativo non chiamerà il callback più di due volte per un singolo evento.

Le routine di callback delle notifiche PnP devono completare le attività il più rapidamente possibile e restituire il controllo al gestore PnP, per evitare ritardi nella notifica ad altri driver e applicazioni registrati per l'evento.

La gestione PnP non rimuove un riferimento sull'oggetto file quando un driver esegue la registrazione per la notifica di un evento EventCategoryTargetDeviceChange . Se la routine di callback di notifica PnP del driver richiede l'accesso all'oggetto file, il driver deve rimuovere un riferimento aggiuntivo sull'oggetto file prima di chiamare IoRegisterPlugPlayNotification.

In genere, i driver Kernel-Mode Driver Framework (KMDF) devono chiamare IoRegisterPlugPlayNotification dalla funzione di callback EvtDeviceSelfManagedIoInit e devono chiamare IoUnregisterPlugPlayNotification dalla funzione di callback EvtDeviceSelfManagedIoCleanup . Questi driver non devono chiamare IoRegisterPlugPlayNotification dalla funzione di callback EvtDriverDeviceAdd ; in caso contrario, la routine di callback di notifica PnP potrebbe essere chiamata prima che lo stack di driver venga avviato da PnP, nel qual caso il driver non sarà pronto a gestire la notifica.

Per altre informazioni, vedere Uso della notifica PnP.

Esempio

Per definire una routine di callback di notifica PnP, è necessario innanzitutto fornire una dichiarazione di funzione che identifica il tipo di routine di callback che si sta definendo. Windows fornisce un set di tipi di funzione di callback per i driver. La dichiarazione di una funzione tramite i tipi di funzione di callback consente di analizzare il codice per i driver, l'SDV ( Static Driver Verifier ) e altri strumenti di verifica di trovare errori ed è un requisito per la scrittura di driver per il sistema operativo Windows.

Ad esempio, per definire una routine di callback di notifica PnP denominata MyCallbackRoutine, usare il tipo di DRIVER_NOTIFICATION_CALLBACK_ROUTINE, come illustrato nell'esempio di codice seguente:

DRIVER_NOTIFICATION_CALLBACK_ROUTINE MyCallbackRoutine;

Implementare quindi la routine di callback come indicato di seguito:

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

Il tipo di funzione DRIVER_NOTIFICATION_CALLBACK_ROUTINE è definito nel file di intestazione Wdm.h. Per identificare in modo più accurato gli errori quando si eseguono gli strumenti di analisi del codice, assicurarsi di aggiungere l'annotazione Use_decl_annotations alla definizione della funzione. L'annotazione Use_decl_annotations garantisce che vengano utilizzate le annotazioni applicate al tipo di funzione DRIVER_NOTIFICATION_CALLBACK_ROUTINE nel file di intestazione. Per altre informazioni sui requisiti per le dichiarazioni di funzione, vedere Dichiarazione di funzioni tramite tipi di ruolo di funzione per i driver WDM. Per informazioni su _Use_decl_annotations_, vedere Annotazione del comportamento della funzione.

Requisiti

Requisito Valore
Piattaforma di destinazione Universale
Intestazione wdm.h (include Wdm.h, Ntddk.h, Ntifs.h)
Libreria NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
Regole di conformità DDI HwStorPortProhibitedDDIs(storport), MarkPower(wdm), MarkPowerDown(wdm), MarkQueryRelations(wdm), MarkStartDevice(wdm), PowerIrpDDis(wdm)

Vedi anche

Uso della notifica PnP

DEVICE_INTERFACE_CHANGE_NOTIFICATION

EvtDeviceSelfManagedIoCleanup

EvtDeviceSelfManagedIoInit

EvtDriverDeviceAdd

HWPROFILE_CHANGE_NOTIFICATION

IoUnregisterPlugPlayNotification

IoUnregisterPlugPlayNotificationEx

PLUGPLAY_NOTIFICATION_HEADER

TARGET_DEVICE_CUSTOM_NOTIFICATION

TARGET_DEVICE_REMOVAL_NOTIFICATION