Функция 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) |