Uso di oggetti del dispositivo di controllo
Un oggetto dispositivo di controllo è un oggetto del framework che non supporta Plug and Play (PnP) o operazioni di gestione dell'alimentazione. I driver possono usare oggetti dispositivo di controllo per rappresentare dispositivi software-only virtuali o dispositivi hardware legacy (ovvero dispositivi che non forniscono capacità di gestione PnP o dell'alimentazione).
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 del collegamento simbolico a un elemento API, ad esempio Microsoft Win32 funzione CreateFile.
Il framework non collega oggetti di dispositivi di controllo a uno stack di dispositivo . Pertanto, quando un'applicazione invia una richiesta di I/O a un oggetto dispositivo di controllo, il gestore di 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 di oggetti dispositivo di controllo
Due usi tipici per i dispositivi di controllo sono:
Un driver di filtro per un dispositivo PnP, se il driver supporta un set di codici di controllo I/O personalizzati per l'uso nelle 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 di 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 dell'oggetto dispositivo di controllo per inviare i codici di controllo I/O direttamente al driver di filtro.
Si noti che un modo migliore per il driver filtro di evitare il problema è agire come driver del bus ed enumerare i dispositivi figlio che operano in modalità grezza. 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.
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 ulteriori informazioni sul supporto di dispositivi non PnP, vedere Uso del framework del driver Kernel-Mode con driver non PnP.
Creazione di un oggetto Dispositivo di controllo
Per creare un oggetto dispositivo di controllo, un driver deve:
Chiamare WdfControlDeviceInitAllocate per ottenere una struttura WDFDEVICE_INIT.
Chiamare i metodi di inizializzazione degli oggetti, in base alle esigenze, per inizializzare la struttura WDFDEVICE_INIT. Il driver può chiamare solo i metodi di inizializzazione seguenti:
- WdfControlDeviceInitSetShutdownNotification
- WdfDeviceInitAssignName
- WdfDeviceInitAssignSDDLString
- WdfDeviceInitAssignWdmIrpPreprocessCallback
- WdfDeviceInitSetCharacteristics
- WdfDeviceInitSetDeviceClass
- WdfDeviceInitSetExclusive
- WdfDeviceInitSetFileObjectConfig
- WdfDeviceInitSetIoInCallerContextCallback
- WdfDeviceInitSetIoType
- WdfDeviceInitSetRequestAttributes
Chiamare WdfDeviceCreate, che usa il contenuto della struttura WDFDEVICE_INIT per creare un oggetto dispositivo framework.
Completare le operazioni di inizializzazione seguenti:
- Creare una coda di I/O predefinita per il dispositivo, se necessario.
- Chiamare WdfDeviceConfigureRequestDispatching, se necessario.
- Chiamare WdfDeviceCreateSymbolicLink per creare un nome di collegamento simbolico che le applicazioni possono usare per accedere al dispositivo di controllo.
Chiamare WdfControlFinishInitializing.
Regole per l'utilizzo di oggetti dei dispositivi 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 framework che enumerare i dispositivi figlio.
I driver non possono passare l'handle dell'oggetto dispositivo di controllo ai metodi framework che supportano le interfacce del dispositivo .
I driver possono creare code di I/O e registrare i gestori delle richieste per le code, ma il framework non consente alle code di essere gestito dall'alimentazione.
I driver possono creare oggetti file per controllare gli oggetti dispositivo.
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 di 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 di 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 un 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 che appartengono alla classe di installazione. Per ulteriori informazioni sulla chiamata di WdfDeviceInitSetDeviceClass, consultare Controllo dell'accesso ai dispositivi nei driver Framework-Based.
Ricezione della notifica dell'arresto del sistema
Poiché gli oggetti dispositivo di controllo non supportano PnP, il driver non può registrare le funzioni di callback che informano il driver quando lo stato di alimentazione di un dispositivo cambia. Tuttavia, il driver può chiamare WdfControlDeviceInitSetShutdownNotification per registrare la funzione di callback EvtDeviceShutdownNotification. Questa funzione di callback informa il driver quando il sistema sta per perdere la sua potenza.
Eliminazione di un oggetto Dispositivo di controllo
Alcuni driver devono eliminare gli oggetti del dispositivo di controllo prima che il driver venga scaricato, 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 infine chiamare WdfObjectDelete in IRQL = PASSIVE_LEVEL per eliminare gli oggetti dispositivo di controllo.
Se il driver crea entrambi i tipi di oggetti del 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 dispositivo di controllo fino a quando il framework non ha eliminato gli altri oggetti dispositivo. Per determinare quando il framework ha eliminato gli altri oggetti 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 gestione dell'alimentazione, non è necessario che il driver elimini gli oggetti dispositivo di controllo.
In questo caso, il framework elimina gli oggetti dispositivo di controllo dopo che la funzione di callback del driver EvtDriverUnload restituisce.