Uso degli elementi di lavoro

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.

Un elemento di lavoro è un'attività eseguita da un driver in una funzione di callback di eventi OnWorkItem . Queste funzioni vengono eseguite in modo asincrono.

I driver UMDF usano in genere elementi di lavoro se un OnInterruptIsr deve eseguire un'elaborazione aggiuntiva senza ritardare l'esecuzione della richiesta di servizio di interrupt perché la riga di interruzione può essere condivisa da più dispositivi.

In genere, la funzione di callback OnInterruptIsr di un driver crea un oggetto elemento di lavoro e la aggiunge alla coda dell'elemento di lavoro del sistema. Successivamente, un thread threadpool dequeue l'oggetto e chiama la funzione di callback OnWorkItem dell'elemento di lavoro.

Configurazione di un elemento di lavoro

Per configurare un elemento di lavoro, il driver deve:

  1. Creare l'elemento di lavoro.

    Il driver chiama IWDFDevice3::CreateWorkItem per creare un oggetto elemento di lavoro e per identificare una funzione di callback OnWorkItem che elabora l'elemento di lavoro.

  2. Archiviare informazioni sull'elemento di lavoro.

    In genere, i driver usano la memoria di contesto dell'oggetto elemento di lavoro per archiviare informazioni sull'attività che deve essere eseguita dalla funzione di callback OnWorkItem . Quando viene chiamata la funzione di callback OnWorkItem , può recuperare le informazioni accedendo a questa memoria di contesto. Per informazioni su come allocare e accedere alla memoria del contesto, vedereIWDFObject::AssignContext.

  3. Aggiungere l'elemento di lavoro alla coda dell'elemento di lavoro del sistema.

    Il driver chiama IWDFWorkItem::Enqueue, che aggiunge l'elemento di lavoro del driver alla coda dell'elemento di lavoro.

Quando il driver chiama IWDFDevice3::CreateWorkItem, può facoltativamente fornire un oggetto padre ,ad esempio un oggetto dispositivo o un oggetto coda. Quando il sistema elimina tale oggetto, elimina anche tutti gli elementi di lavoro esistenti associati all'oggetto .

Uso della funzione di callback WorkItem

Dopo aver aggiunto l'elemento di lavoro alla coda dell'elemento di lavoro, rimane nella coda fino a quando non diventa disponibile un thread di lavoro di sistema. Il thread di lavoro di sistema rimuove l'elemento di lavoro dalla coda e quindi chiama la funzione di callback OnWorkItem del driver, passando l'oggetto elemento di lavoro come input.

In genere, la funzione di callback OnWorkItem esegue i passaggi seguenti:

  1. Ottiene informazioni fornite dal driver sull'elemento di lavoro accedendo alla memoria del contesto dell'oggetto elemento di lavoro.
  2. Esegue l'attività specificata. Se necessario, la funzione di callback può chiamare IWDFWorkItem::GetParentObject per determinare l'oggetto padre dell'elemento di lavoro.
  3. Se il driver riscriva l'elemento di lavoro, indica che l'handle per l'elemento di lavoro è ora disponibile per il riutilizzo.

Alcuni driver potrebbero dover chiamare IWDFWorkItem::Flush per scaricare gli elementi di lavoro dalla coda degli elementi di lavoro. Se un driver chiama il metodo Flush , il metodo non restituisce finché un thread di lavoro non ha rimosso l'elemento di lavoro specificato dalla coda dell'elemento di lavoro e ha chiamato la funzione di callback OnWorkItem del driver e la funzione di callback OnWorkItem ha successivamente restituito dopo l'elaborazione dell'elemento di lavoro.