Функция WdfWorkItemFlush (wdfworkitem.h)

[Относится к KMDF и UMDF]

Метод WdfWorkItemFlush возвращается после обслуживания указанного рабочего элемента.

Синтаксис

void WdfWorkItemFlush(
  [in] WDFWORKITEM WorkItem
);

Параметры

[in] WorkItem

Дескриптор объекта рабочего элемента платформы, полученного при предыдущем вызове WdfWorkItemCreate.

Возвращаемое значение

None

Remarks

Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.

Если был вызван метод WdfWorkItemEnqueue и драйвер вызывает метод WdfWorkItemFlush , метод не возвращается, пока системный рабочий поток не удалит указанный рабочий элемент из очереди рабочих элементов и не вызовет функцию обратного вызова EvtWorkItem драйвера, а функция обратного вызова EvtWorkItem впоследствии возвратит после обработки рабочего элемента. Обратите внимание, что WdfWorkItemFlush ожидает завершения уже запущенной функции обратного вызова EvtWorkItem .

Если WdfWorkItemEnqueue не был вызван, вызов WdfWorkItemFlush завершается немедленно.

Недопустимо вызывать WdfWorkItemFlush из обратного вызова рабочего элемента или из кода, который он вызывает, который выполняется в том же системном рабочем потоке. Действительно, если средство проверки драйверов включено, WDF врывается в отладчик, чтобы предупредить, что это приведет к взаимоблокировке. С другой стороны, вызов WdfObjectDelete для объекта рабочего элемента из обратных вызовов вполне удобен.

Большинству драйверов, использующих рабочие элементы, не требуется вызывать WdfWorkItemFlush. Драйвер может вызвать WdfWorkItemFlush , если ему необходимо синхронизировать завершение рабочих элементов с удалением удаленного целевого объекта ввода-вывода. В этом случае драйвер может вызывать WdfWorkItemFlush из функции обратного вызова EvtIoTargetQueryRemove .

Дополнительные сведения о рабочих элементах см. в разделе Использование рабочих элементов платформы.

Примеры

В следующем примере кода используется функция обратного вызова EvtIoTargetQueryRemove из примера драйвера Тостера .

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;
}

Требования

Требование Значение
Целевая платформа Универсальное
Минимальная версия KMDF 1,0
Минимальная версия UMDF 2,0
Верхняя часть wdfworkitem.h (включая Wdf.h)
Библиотека Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF)
IRQL PASSIVE_LEVEL
Правила соответствия DDI DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf)

См. также раздел

EvtWorkItem