Uso di oggetti dispositivo di controllo

Un oggetto dispositivo di controllo è un oggetto dispositivo framework che non supporta Plug and Play (PnP) o operazioni di risparmio energia. I driver possono usare gli oggetti dispositivo di controllo per rappresentare dispositivi virtuali o dispositivi hardware legacy solo software, ovvero i dispositivi che non forniscono funzionalità di PnP o risparmio energia.

Un driver che crea un oggetto dispositivo di controllo crea in genere un collegamento simbolico per l'oggetto dispositivo. Le applicazioni possono inviare richieste di I/O all'oggetto dispositivo di controllo passando il nome di collegamento simbolico a un elemento API, ad esempio la funzione CreateFile Microsoft Win32.

Il framework non collega gli oggetti del dispositivo a uno stack di dispositivi. Pertanto, quando un'applicazione invia una richiesta di I/O a un oggetto dispositivo di controllo, la gestione I/O recapita la richiesta direttamente al driver che ha creato l'oggetto dispositivo di controllo, anziché al driver nella parte superiore dello stack. Tuttavia, un driver aggiuntivo può chiamare IoAttachDevice per collegare un oggetto dispositivo sopra l'oggetto dispositivo di controllo. In questo caso, il driver aggiuntivo riceve prima la richiesta di I/O.

Uso degli oggetti dispositivo di controllo

Due usi tipici per i dispositivi di controllo sono:

  1. Driver di filtro per un dispositivo PnP, se il driver supporta un set di codici di controllo di I/O personalizzati da usare per le applicazioni.

    Se un'applicazione ha tentato di inviare i codici di controllo I/O personalizzati all'inizio dello stack di driver (usando, ad esempio, il nome di collegamento simbolico di un'interfaccia del dispositivo), un driver sopra il driver di filtro potrebbe non riuscire la richiesta di I/O se il driver non riconosce i codici di controllo I/O personalizzati. Per evitare questo problema, il driver di filtro può creare un oggetto dispositivo di controllo. Le applicazioni possono usare il nome simbolico del collegamento simbolico dell'oggetto dispositivo di controllo per inviare codici di controllo I/O direttamente al driver di filtro.

    Si noti che un modo migliore per il driver di filtro per evitare il problema consiste nell'agire come driver del bus ed enumerare i dispositivi figlio che operano in modalità non elaborata. In altre parole, per ogni dispositivo supportato dal driver di filtro, il driver può creare un oggetto dispositivo fisico (PDO) che non richiede un driver di funzione. Il driver chiama WdfPdoInitAssignRawDevice e WdfDeviceInitAssignName per ognuno di questi dispositivi e l'applicazione può identificare un dispositivo in base al nome quando invia un codice di controllo I/O personalizzato.

  2. Driver per un dispositivo che non supporta PnP.

    Tale driver deve usare oggetti dispositivo di controllo, perché gli oggetti dispositivo per tali dispositivi non risiedono in uno stack di dispositivi e non forniscono funzionalità PnP. Per altre informazioni sul supporto di dispositivi non PnP, vedere Uso di Kernel-Mode Driver Framework con driver non PnP.

Creazione di un oggetto Device Control

Per creare un oggetto dispositivo di controllo, un driver deve:

  1. Chiamare WdfControlDeviceInitAllocate per ottenere una struttura WDFDEVICE_INIT .

  2. Chiamare i metodi di inizializzazione degli oggetti, in base alle esigenze, per inizializzare la struttura di WDFDEVICE_INIT. Il driver può chiamare solo i seguenti metodi di inizializzazione:

  3. Chiamare WdfDeviceCreate, che usa il contenuto della struttura WDFDEVICE_INIT per creare un oggetto dispositivo framework.

  4. Completare le operazioni di inizializzazione seguenti:

  5. Chiamare WdfControlFinishInitializing.

Regole per l'uso di oggetti dispositivo di controllo

I driver che creano oggetti dispositivo di controllo devono rispettare le regole seguenti:

  • I driver non possono passare l'handle dell'oggetto dispositivo di controllo ai metodi del framework che enumera i dispositivi figlio.

  • I driver non possono passare l'handle dell'oggetto dispositivo di controllo ai metodi del framework che supportano le interfacce del dispositivo.

  • I driver possono creare code di I/O e registrare gestori di richieste per le code, ma il framework non consente la gestione delle code.

  • I driver possono creare oggetti file per gli oggetti dispositivo di controllo.

Denominazione di un oggetto Dispositivo di controllo

Tutti gli oggetti dispositivo di controllo devono essere denominati. In genere, il driver chiamerà WdfDeviceInitAssignName per assegnare un nome del dispositivo e quindi chiamare WdfDeviceCreateSymbolicLink per creare un nome di collegamento simbolico che le applicazioni possono usare per accedere all'oggetto.

Se il driver non chiama WdfDeviceInitAssignName per assegnare un nome del dispositivo, il framework genera automaticamente un nome per i dispositivi di controllo, ma il driver non può chiamare WdfDeviceCreateSymbolicLink.

Il driver può chiamare WdfDeviceInitSetDeviceClass per specificare una classe di installazione del dispositivo per un dispositivo di controllo. La classe di installazione del dispositivo identifica una sezione del Registro di sistema che contiene informazioni fornite dall'amministratore sui dispositivi appartenenti alla classe di installazione. Per altre informazioni sulla chiamata a WdfDeviceInitSetDeviceClass, vedere Controllo dell'accesso ai dispositivi in Framework-Based driver.

Ricezione della notifica di arresto del sistema

Poiché gli oggetti dispositivo di controllo non supportano PnP, il driver non può registrare funzioni di callback che informano il driver quando lo stato di alimentazione di un dispositivo cambia. Tuttavia, il driver può chiamare WdfControlDeviceInitSetShutdownNotification per registrare una funzione di callback EvtDeviceShutdownNotification . Questa funzione di callback informa il driver quando il sistema sta per perdere la sua potenza.

Eliminazione di un oggetto Device Control

Alcuni driver devono eliminare gli oggetti del dispositivo di controllo prima del caricamento del driver, come indicato di seguito:

  • Se il driver crea oggetti dispositivo di controllo (che non supportano PnP o risparmio energia) e se il driver crea anche oggetti dispositivo framework che supportano PnP e risparmio energia, il driver deve chiamare eventualmente WdfObjectDelete in IRQL = PASSIVE_LEVEL per eliminare gli oggetti del dispositivo di controllo.

    Se il driver crea entrambi i tipi di oggetti dispositivo, il sistema operativo non può scaricare il driver finché il driver non ha eliminato gli oggetti del dispositivo di controllo.

    Tuttavia, il driver non deve eliminare gli oggetti del dispositivo di controllo fino a quando il framework non ha eliminato gli altri oggetti del dispositivo. Per determinare quando il framework ha eliminato gli altri oggetti del dispositivo, il driver deve fornire funzioni EvtCleanupCallback per tali oggetti.

  • Se il driver crea oggetti dispositivo di controllo, ma non crea oggetti dispositivo framework che supportano PnP e risparmio energia, il driver non deve eliminare gli oggetti del dispositivo di controllo.

    In questo caso, il framework elimina gli oggetti del dispositivo di controllo dopo che la funzione di callback EvtDriverUnload del driver restituisce.