Condividi tramite


Funzione WdfWorkItemFlush (wdfworkitem.h)

[Si applica a KMDF e UMDF]

Il metodo WdfWorkItemFlush restituisce dopo il servizio di un elemento di lavoro specificato.

Sintassi

void WdfWorkItemFlush(
  [in] WDFWORKITEM WorkItem
);

Parametri

[in] WorkItem

Handle per un oggetto elemento di lavoro del framework ottenuto da una chiamata precedente a WdfWorkItemCreare.

Valore restituito

Nessuno

Osservazioni

Se il driver fornisce un handle di oggetto non valido, si verifica un controllo di bug.

Se è stato chiamato WdfWorkItemEnqueue e il driver chiama il metodo WdfWorkItemFlush, Il metodo non restituisce finché un thread di lavoro di sistema non ha rimosso l'elemento di lavoro specificato dalla coda dell'elemento di lavoro e chiamato il evtWorkItem del driver funzione di callback e la funzione di callback EvtWorkItem viene successivamente restituita dopo l'elaborazione dell'elemento di lavoro. Si noti che WdfWorkItemFlush attende il completamento di una funzione di callback già in esecuzione EvtWorkItem.

Se WdfWorkItemEnqueue non è stato chiamato, la chiamata WdfWorkItemFlush viene completata immediatamente.

È illegale chiamare WdfWorkItemFlush dal callback dell'elemento di lavoro o dal codice che chiama che viene eseguito sullo stesso thread di lavoro di sistema. In effetti, se il verificatore del driver è abilitato, WDF si interrompe nel debugger per avvisare che in questo modo si verificherà un deadlock. D'altra parte, chiamare WdfObjectDelete sull'oggetto elemento di lavoro dall'interno del callback è perfettamente corretto.

La maggior parte dei driver che usano elementi di lavoro non deve chiamare WdfWorkItemFlush. Un driver potrebbe chiamare WdfWorkItemFlush se deve sincronizzare il completamento degli elementi di lavoro con la rimozione di una destinazione di I/O remota. In questo caso, il driver può chiamare WdfWorkItemFlush dall'interno del relativo EvtIoTargetQueryRemove funzione di callback.

Per altre informazioni sugli elementi di lavoro, vedere Using Framework Work Items.

Esempi

L'esempio di codice seguente è un EvtIoTargetQueryRemove funzione di callback dal driver di esempio Toast.

NTSTATUS
ToastMon_EvtIoTargetQueryRemove(
    WDFIOTARGET IoTarget
)
{
    PTARGET_DEVICE_INFO  targetDeviceInfo = NULL;
    //
    // Get the I/O target object's context.
    //
    targetDeviceInfo = GetTargetDeviceInfo(IoTarget);
    //
    // Ensure that the I/O target's work item
    // has been processed before closing the target.
    //
    WdfWorkItemFlush(targetDeviceInfo->WorkItem);
    WdfIoTargetCloseForQueryRemove(IoTarget);

    return STATUS_SUCCESS;
}

Fabbisogno

Requisito Valore
piattaforma di destinazione Universale
versione minima di KMDF 1.0
versione minima di UMDF 2.0
intestazione wdfworkitem.h (include Wdf.h)
libreria Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
regole di conformità DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

Vedere anche

EvtWorkItem