Condividi tramite


Uso delle interfacce di dispositivo nei driver UMDF

Avviso

UMDF 2 è la versione più recente di UMDF e sostituisce UMDF 1. Tutti i nuovi driver UMDF devono essere scritti usando UMDF 2. Non vengono aggiunte nuove funzionalità a UMDF 1 ed è disponibile un supporto limitato per UMDF 1 nelle versioni più recenti di Windows 10. I driver di Windows universali devono usare UMDF 2.

Gli esempi di UMDF 1 archiviati sono disponibili nell'aggiornamento degli esempi di driver di Windows 11 versione 22H2 - Maggio 2022.

Per altre informazioni, vedi Introduzione a UMDF.

Un'interfaccia del dispositivo è un collegamento simbolico a un dispositivo Plug and Play (PnP) che un'applicazione può usare per accedere al dispositivo. Un'applicazione in modalità utente può passare il nome del collegamento simbolico dell'interfaccia a un elemento API, ad esempio la funzione CreateFile Di Microsoft Win32. Per ottenere il nome del collegamento simbolico di un'interfaccia del dispositivo, l'applicazione in modalità utente può chiamare le funzioni SetupDi . Per altre informazioni sulle funzioni SetupDi, vedere Funzioni dell'interfaccia del dispositivo SetupDi.

Ogni interfaccia del dispositivo appartiene a una classe di interfaccia del dispositivo. Ad esempio, uno stack di driver per un dispositivo CD-ROM potrebbe fornire un'interfaccia appartenente alla classe GUID_DEVINTERFACE_CDROM. Uno dei driver del dispositivo CD-ROM registra un'istanza della classe GUID_DEVINTERFACE_CDROM per informare il sistema e le applicazioni che è disponibile un dispositivo CD-ROM. Per altre informazioni sulle classi di interfaccia del dispositivo, vedere Introduzione alle interfacce del dispositivo.

Registrazione di un'interfaccia dispositivo

Per registrare un'istanza di una classe di interfaccia del dispositivo, un driver basato su UMDF può chiamare IWDFDevice::CreateDeviceInterface dall'interno della relativa funzione di callback IDriverEntry::OnDeviceAdd . Se il driver supporta più istanze dell'interfaccia, può assegnare una stringa di riferimento univoca a ogni istanza.

Abilitazione e disabilitazione di un'interfaccia del dispositivo

Se la creazione ha esito positivo, il framework abilita e disabilita automaticamente l'interfaccia in base allo stato PnP del dispositivo.

Inoltre, un driver può disabilitare e riabilitare un'interfaccia del dispositivo in base alle esigenze. Ad esempio, se un driver determina che il dispositivo ha smesso di rispondere, il driver può chiamare IWDFDevice::AssignDeviceInterfaceState per disabilitare le interfacce del dispositivo e impedire alle applicazioni di ottenere nuovi handle all'interfaccia. Gli handle esistenti per l'interfaccia non sono interessati. Se il dispositivo diventa disponibile in un secondo momento, il driver può chiamare nuovamente IWDFDevice::AssignDeviceInterfaceState per riabilitare le interfacce.

Ricezione di richieste di accesso a un'interfaccia del dispositivo

Quando un'applicazione richiede l'accesso all'interfaccia del dispositivo di un driver, il framework chiama la funzione di callback IQueueCallbackCreate::OnCreateFile . Il driver può chiamare IWDFFile::RetrieveFileName per ottenere il nome del dispositivo o del file a cui accede l'applicazione. Se il driver ha specificato una stringa di riferimento quando ha registrato l'interfaccia del dispositivo, il sistema operativo include la stringa di riferimento nel nome del file o del dispositivo restituito da IWDFFile::RetrieveFileName .

Creazione di eventi del dispositivo

Il driver basato su UMDF può creare eventi personalizzati specifici del dispositivo (chiamati eventi del dispositivo) chiamando IWDFDevice::P ostEvent. Un driver registrato per l'uso di qualsiasi interfaccia del dispositivo può ricevere notifiche degli eventi personalizzati di un dispositivo. I driver basati su UMDF ricevono tali notifiche fornendo una funzione di callback IRemoteInterfaceCallbackEvent::OnRemoteInterfaceEvent .

Gli eventi personalizzati sono univoci per il dispositivo. Sia lo sviluppatore del driver che crea l'evento che lo sviluppatore del driver che riceve l'evento deve comprendere il significato dell'evento.

Accesso all'interfaccia del dispositivo di un altro driver

Se si vuole che il driver basato su UMDF invii richieste di I/O a un'interfaccia di dispositivo fornita da un altro driver, è possibile creare una destinazione di I/O remota che rappresenta l'interfaccia del dispositivo.

Prima di tutto, il driver deve registrarsi per ricevere una notifica quando è disponibile un'interfaccia del dispositivo. Eseguire la procedura descritta di seguito:

  1. Quando il driver chiama IWDFDriver::CreateDevice, il driver può fornire un'interfaccia IPnpCallbackRemoteInterfaceNotification . La funzione di callback IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival di questa interfaccia informa il driver quando sono disponibili le interfacce del dispositivo.

  2. Dopo che il driver chiama IWDFDriver::CreateDevice, può chiamare IWDFDevice2::RegisterRemoteInterfaceNotification per ogni interfaccia del dispositivo che verrà usata dal driver.

Successivamente, il framework chiama la funzione di callback IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival ogni volta che un'interfaccia del dispositivo specificata diventa disponibile. La funzione di callback può chiamare IWDFRemoteInterfaceInitialize::GetInterfaceGuid e IWDFRemoteInterfaceInitialize::RetrieveSymbolicLink per determinare quale interfaccia del dispositivo è arrivata.

La funzione di callback IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival deve in genere eseguire le operazioni seguenti:

  1. Chiamare IWDFDevice2::CreateRemoteInterface per creare un oggetto interfaccia remota, fornendo facoltativamente interfacce IRemoteInterfaceCallbackEvent e IRemoteInterfaceCallbackRemoval .

  2. Chiamare IWDFDevice2::CreateRemoteTarget per creare un oggetto di destinazione remoto, fornendo facoltativamente un'interfaccia IRemoteTargetCallbackRemoval .

  3. Chiama IWDFRemoteTarget::OpenRemoteInterface per connettere l'interfaccia del dispositivo alla destinazione remota.

    Se l'interfaccia del dispositivo è una creata dall'enumeratore software SWENUM, il driver deve chiamare OpenRemoteInterface da un elemento di lavoro. Ad esempio, vedere la funzione QueueUserWorkItem in Windows SDK.

Ora il driver può formattare e inviare richieste di I/O alla destinazione di I/O remota.

Oltre alla funzione di callback IPnpCallbackRemoteInterfaceNotification::OnRemoteInterfaceArrival , un driver basato su UMDF può fornire due funzioni di callback aggiuntive per ricevere notifiche di eventi dell'interfaccia del dispositivo: