Функция WdfWorkItemCreate (wdfworkitem.h)
[Применимо к KMDF и UMDF]
Метод WdfWorkItemCreate создает объект рабочего элемента платформы, который впоследствии можно добавить в очередь рабочих элементов системы.
Синтаксис
NTSTATUS WdfWorkItemCreate(
[in] PWDF_WORKITEM_CONFIG Config,
[in] PWDF_OBJECT_ATTRIBUTES Attributes,
[out] WDFWORKITEM *WorkItem
);
Параметры
[in] Config
Указатель на структуру, выделенную вызывающим объектом WDF_WORKITEM_CONFIG, которую драйвер должен инициализировать путем вызова WDF_WORKITEM_CONFIG_INIT.
[in] Attributes
Указатель на структуру, выделенную вызывающим объектом, WDF_OBJECT_ATTRIBUTES, которая задает атрибуты для объекта рабочего элемента.
[out] WorkItem
Указатель на переменную, которая получает дескриптор к новому объекту рабочего элемента.
Возвращаемое значение
WdfWorkItemCreate возвращает STATUS_SUCCESS, если операция выполнена успешно. В противном случае этот метод может вернуть одно из следующих значений:
Возвращаемый код | Описание |
---|---|
|
Указан недопустимый параметр. |
|
Родительский объект рабочего элемента не является объектом устройства или предком объекта устройства. |
|
Для создания объекта рабочего элемента недостаточно системных ресурсов. |
|
Элемент AutomaticSerialization в структуре WDF_WORKITEM_CONFIG, на которую указывает параметр Config, TRUE, но уровень выполнения родительского объекта не WdfExecutionLevelPassive. |
|
Параметр атрибутов был NULLили элемент ParentObject структуры WDF_OBJECT_ATTRIBUTES, которая атрибутов null. |
Замечания
Когда драйвер вызывает WdfWorkItemCreate для создания рабочего элемента, обычно он сохраняет сведения, относящиеся к элементам, в памяти контекста объекта рабочего элемента. Функция обратного вызова драйвера EvtWorkItem, которая выполняет задачи рабочего элемента, может получить доступ к этой информации, чтобы определить задачи, которые он должен выполнять. (Дополнительные сведения о хранении сведений в памяти контекста см. в разделе Контекстное пространство объектов Платформы.)
После хранения сведений о рабочем элементе драйвер должен вызвать WdfWorkItemEnqueue, чтобы добавить рабочий элемент в очередь рабочих элементов системы. Когда рабочий поток системы становится доступным, поток удаляет рабочий элемент из очереди и вызывает функцию обратного вызова EvtWorkItem.
При создании объекта рабочего элемента драйвер должен указать родительский объект для объекта рабочего элемента в элементе ParentObject структуры WDF_OBJECT_ATTRIBUTES. Родительский объект должен быть объектом устройства платформы или любым объектом, цепочка родителей которого приводит к объекту устройства платформы. Платформа удаляет объект рабочего элемента при удалении объекта устройства.
Чтобы удалить объект рабочего элемента ранее, драйвер может вызвать WdfObjectDelete, как описано в Using Framework Work Items.
Драйвер может получить родительский объект рабочего элемента, вызвав WdfWorkItemGetParentObject.
Если драйвер предоставляет EvtCleanupCallback или EvtDeqlCallback функции обратного вызова для объекта рабочего элемента, обратите внимание, что платформа вызывает эти функции обратного вызова в IRQL = PASSIVE_LEVEL.
Дополнительные сведения о рабочих элементах см. в разделе Using Framework Work Items.
Примеры
Следующий пример кода инициализирует структуру WDF_OBJECT_ATTRIBUTES, инициализирует структуру WDF_WORKITEM_CONFIG и вызывает WdfWorkItemCreate.
NTSTATUS status = STATUS_SUCCESS;
PWORKER_ITEM_CONTEXT context;
WDF_OBJECT_ATTRIBUTES attributes;
WDF_WORKITEM_CONFIG workitemConfig;
WDFWORKITEM hWorkItem;
WDF_OBJECT_ATTRIBUTES_INIT(&attributes);
WDF_OBJECT_ATTRIBUTES_SET_CONTEXT_TYPE(
&attributes,
WORKER_ITEM_CONTEXT
);
attributes.ParentObject = FdoData->WdfDevice;
WDF_WORKITEM_CONFIG_INIT(
&workitemConfig,
CallbackFunction
);
status = WdfWorkItemCreate(
&workitemConfig,
&attributes,
&hWorkItem
);
if (!NT_SUCCESS(status)) {
return status;
}
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
минимальная версия KMDF | 1.0 |
минимальная версия UMDF | 2.0 |
заголовка | wdfworkitem.h (include Wdf.h) |
библиотеки | Wdf01000.sys (KMDF); WUDFx02000.dll (UMDF) |
IRQL | <= DISPATCH_LEVEL |
правил соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf) |