Condividi tramite


Creazione e utilizzo di oggetti file Driver-Created

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 info, vedi Introduzione con UMDF.

Se il driver deve creare e inviare una richiesta di I/O indipendente dall'applicazione al driver successivo nello stack (destinazione di I/O predefinita), il driver deve creare e chiudere i propri oggetti file.

Creazione di un oggetto File

Il driver deve chiamare il metodo IWDFDevice::CreateWdfFile per creare un oggetto file per l'uso del driver. Quando il driver chiama IWDFDevice::CreateWdfFile, il framework invia una richiesta di creazione al driver successivo nello stack. Il driver successivo nello stack potrebbe essere in modalità kernel o in modalità utente.

Questa elaborazione delle richieste di creazione file è diversa nel modello di driver Windows (WDM). In WDM, una chiamata alla funzione ZwCreateFile fa sì che un IRP di creazione venga recato all'inizio dello stack in modalità kernel. La figura seguente illustra l'elaborazione di richieste create-file in UMDF rispetto a WDM:

gestione delle richieste create-file in umdf rispetto a wdm.

Chiamando IWDFDevice::CreateWdfFile, il driver può creare un oggetto file e quindi inviare richieste di I/O durante l'avvio del dispositivo, prima dell'avvio dell'intero stack.

Il driver successivo nello stack deve determinare se può gestire la richiesta di creazione file o se deve inoltrare ulteriormente la richiesta nello stack.

Dopo aver chiamato IWDFDevice::CreateWdfFile, un driver non può annullare l'operazione di creazione.

Utilizzo dell'oggetto File

Per inviare una richiesta di lettura asincrona al driver successivo in pila sotto di esso, il driver può usare il modello seguente.

  1. Chiamare IWDFDevice::CreateWdfFile per creare l'oggetto file.
  2. Chiamare IWDFDevice::GetDefaultIoTarget per recuperare l'interfaccia che rappresenta il driver di livello inferiore.
  3. Chiamare IWDFDevice::CreateRequest per creare un oggetto IWDFIoRequest non formattato .
  4. Chiamare IWDFIoRequest::SetCompletionCallback per registrare un'interfaccia IRequestCallbackRequestCompletion per il metodo OnCompletion che il framework chiama al termine di una richiesta di I/O.
  5. Chiamare IWDFIoTarget::FormatRequestForRead, fornendo un puntatore all'interfaccia IWDFDriverCreatedFile nel parametro pFile .
  6. Chiamare IWDFIoRequest::Send per inviare la richiesta.

Chiusura dell'oggetto File

Il driver che ha chiamato IWDFDevice::CreateWdfFile deve chiamare successivamente IWDFDriverCreatedFile::Close.

In genere, il driver chiama IWDFDriverCreatedFile::Close dal metodo di callback IPnpCallbackHardware::OnReleaseHardware o IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup .

Quando il driver chiama IWDFDriverCreatedFile::Close, il framework chiama il metodo IFileCallbackCleanup::OnCleanupFile del driver successivo. In questo metodo, il driver successivo deve annullare o completare tutte le richieste di I/O in sospeso associate all'oggetto file. Il framework annulla quindi tutte le richieste di I/O create dal driver che ha chiamato IWDFDevice::CreateWdfFile. Il framework non annulla le richieste di I/O che i driver inferiori nello stack potrebbero avere associato all'oggetto file. È responsabilità del conducente annullare tali richieste. L'oggetto file viene chiuso solo dopo il completamento di tutte le richieste di I/O associate.

Il framework chiama quindi il metodo IFileCallbackClose::OnCloseFile del driver successivo. A questo punto, il framework garantisce che il driver successivo non riceva richieste di I/O aggiuntive per questo oggetto file.

Dopo che il framework chiama OnCloseFile, elimina definitivamente l'interfaccia IWDFFile che rappresenta l'oggetto file.

Se gli oggetti file creati dal driver rimangono dopo la restituzione dei metodi di rimozione del dispositivo del driver ,ad esempio IPnpCallbackHardware::OnReleaseHardware e IPnpCallbackSelfManagedIo::OnSelfManagedIoCleanup, il framework genera un arresto del driver. Per informazioni sulla risoluzione di questo problema, vedere Determinazione del motivo per cui UMDF indica i file in sospeso in fase di rimozione del dispositivo.