Функция WdfWorkItemFlush (wdfworkitem.h)
[Применимо к KMDF и UMDF]
Метод WdfWorkItemFlush возвращается после обслуживания указанного рабочего элемента.
Синтаксис
void WdfWorkItemFlush(
[in] WDFWORKITEM WorkItem
);
Параметры
[in] WorkItem
Дескриптор объекта рабочего элемента платформы, полученный из предыдущего вызова WdfWorkItemCreate.
Возвращаемое значение
Никакой
Замечания
Ошибка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Если был вызван WdfWorkItemEnqueue, а драйвер вызывает метод WdfWorkItemFlush, Метод не возвращается, пока системный рабочий поток не удаляет указанный рабочий элемент из очереди рабочих элементов и вызывает функцию обратного вызова драйвера EvtWorkItem, а функция обратного вызова EvtWorkItem впоследствии возвращается после обработки рабочего элемента. Обратите внимание, что WdfWorkItemFlush ожидает завершения функции обратного вызова EvtWorkItem.
Если WdfWorkItemEnqueue не вызывается, вызов WdfWorkItemFlush завершается немедленно.
Недопустимо вызывать WdfWorkItemFlush из обратного вызова рабочего элемента или из кода, который выполняется в одном рабочем потоке системы. Действительно, если средство проверки драйвера включено, WDF прерывается в отладчик, чтобы предупредить, что это приведет к взаимоблокировке. С другой стороны, вызов WdfObjectDelete в объекте рабочего элемента из обратного вызова совершенно хорошо.
Большинству драйверов, использующих рабочие элементы, не нужно вызывать WdfWorkItemFlush. Драйвер может вызывать WdfWorkItemFlush, если он должен синхронизировать выполнение рабочих элементов с удалением удаленного целевого объекта ввода-вывода. В этом случае драйвер может вызывать WdfWorkItemFlush из функции обратного вызова EvtIoTargetQueryRemove.
Дополнительные сведения о рабочих элементах см. в разделе Using Framework Work Items.
Примеры
В следующем примере кода используется функция обратного вызова EvtIoTargetQueryRemov e из примера драйвера Тостера.
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 (include Wdf.h) |
библиотеки | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | PASSIVE_LEVEL |
правил соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |