функция обратного вызова EVT_URS_DEVICE_FILTER_RESOURCE_REQUIREMENTS (ursdevice.h)

Расширение класса двойной роли USB вызывает этот обратный вызов, чтобы драйвер клиента вставлял ресурсы из объекта resource-requirements-list в списки ресурсов, которые будут использоваться в течение жизненного времени каждой роли.

Синтаксис

EVT_URS_DEVICE_FILTER_RESOURCE_REQUIREMENTS EvtUrsDeviceFilterResourceRequirements;

NTSTATUS EvtUrsDeviceFilterResourceRequirements(
  [in] WDFDEVICE Device,
  [in] WDFIORESREQLIST IoResourceRequirementsList,
  [in] URSIORESLIST HostRoleResources,
  [in] URSIORESLIST FunctionRoleResources
)
{...}

Параметры

[in] Device

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

[in] IoResourceRequirementsList

Дескриптор объекта resource-requirements-list платформы, который представляет список требований к ресурсам устройства.

[in] HostRoleResources

Дескриптор списка ресурсов для устройства контроллера, когда оно работает в режиме узла.

[in] FunctionRoleResources

Дескриптор списка ресурсов для контроллера, когда он работает в режиме функции.

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

Если операция выполнена успешно, функция обратного вызова должна возвращать STATUS_SUCCESS или другое значение состояния, для которого NT_SUCCESS(status) равно TRUE. В противном случае он должен возвращать значение состояния, для которого NT_SUCCESS (status) равно FALSE.

Комментарии

Драйвер клиента регистрирует свою реализацию с помощью расширения класса двойных ролей USB, вызывая UrsDeviceInitialize после вызова WdfDeviceCreate , чтобы создать объект устройства платформы для контроллера. Расширение класса вызывает этот обратный вызов перед EvtDevicePrepareHardware. Обратный вызов вызывается в файле EvtDeviceFilterRemoveResourceRequirements расширения класса, который регистрируется от имени драйвера клиента. Клиент не должен реализовывать и регистрировать свои evtDeviceFilterRemoveResourceRequirements , так как он переопределяет реализацию расширения класса.

Каждая роль имеет определенное количество назначенных аппаратных ресурсов. Это могут быть память, прерывания и т. д. Ресурсы поддерживаются системой в списке требований к ресурсам , который содержит диапазон аппаратных ресурсов, в которых может работать устройство.

Дополнительные сведения о списках требований к ресурсам см. в разделе Обработка аппаратных ресурсов.

Расширение класса выделяет память для списка требований к ресурсам и списки ресурсов для ролей узлов и функций. Когда расширение класса вызывает реализацию EVT_URS_DEVICE_FILTER_RESOURCE_REQUIREMENTS драйвера клиента, оно передает дескриптор WDFIORESREQLIST в этот список требований вместе с дескрипторами URSIORESLIST для списков ресурсов роли узла и функции. В реализации драйвер клиента должен перечислить логические конфигурации в списке требований и проверка дескриптор ресурсов для каждой конфигурации, вызвав WdfIoResourceListGetDescriptor.

Если драйвер хочет использовать определенный ресурс, он может добавить связанный дескриптор ресурса в соответствующий список ресурсов, вызвав UrsIoResourceListAppendDescriptor.

Чтобы удалить дескриптор ресурса из списка требований, драйвер вызывает WdfIoResourceListRemove.

Примеры


EVT_URS_DEVICE_FILTER_RESOURCE_REQUIREMENTS EvtUrsFilterRemoveResourceRequirements;


_Function_class_(EVT_URS_DEVICE_FILTER_RESOURCE_REQUIREMENTS)
_IRQL_requires_same_
_IRQL_requires_max_(PASSIVE_LEVEL)
NTSTATUS
EvtUrsFilterRemoveResourceRequirements (
    _In_ WDFDEVICE Device,
    _In_ WDFIORESREQLIST IoResourceRequirementsList,
    _In_ URSIORESLIST HostRoleResources,
    _In_ URSIORESLIST FunctionRoleResources
    )
{
    NTSTATUS status;
    WDFIORESLIST resList;
    ULONG resListCount;
    ULONG resCount;
    ULONG currentResourceIndex;
    PIO_RESOURCE_DESCRIPTOR descriptor;
    BOOLEAN assignToHost;
    BOOLEAN assignToFunction;
    BOOLEAN keepAssigned;

    TRY {

        status = STATUS_SUCCESS;

        //
        // Currently does not support multiple logical configurations. Only the first one
        // is considered.
        //

        resListCount = WdfIoResourceRequirementsListGetCount(IoResourceRequirementsList);
        if (resListCount == 0) {
            // No logical resource configurations found.
            LEAVE;
        }

        // Enumerate through logical resource configurations.

        resList = WdfIoResourceRequirementsListGetIoResList(IoResourceRequirementsList, 0);
        resCount = WdfIoResourceListGetCount(resList);


        for (currentResourceIndex = 0; currentResourceIndex < resCount; ++currentResourceIndex) {

            descriptor = WdfIoResourceListGetDescriptor(resList, currentResourceIndex);

            if (descriptor->Type == CmResourceTypeConfigData) {

                //
                // This indicates the priority of this logical configuration.
                // This descriptor can be ignored.
                //

                keepAssigned = TRUE;
                assignToFunction = FALSE;
                assignToHost = FALSE;

            } else if ((descriptor->Type == CmResourceTypeMemory) ||
                       (descriptor->Type == CmResourceTypeMemoryLarge)) {

                //
                // This example client driver keeps the memory resources here. 
                //

                keepAssigned = TRUE;
                assignToFunction = TRUE;
                assignToHost = TRUE;

            } else {

                //
                // For all other resources, pass it to the child device nodes for host and function.
                //

                keepAssigned = FALSE;
                assignToHost = TRUE;
                assignToFunction = TRUE;
            }

            if (assignToHost != FALSE) {
                status = UrsIoResourceListAppendDescriptor(HostRoleResources, descriptor);
                if (!NT_SUCCESS(status)) {
                    // UrsIoResourceListAppendDescriptor for HostRoleResources failed.
                    LEAVE;
                }
            }

            if (assignToFunction != FALSE) {
                status = UrsIoResourceListAppendDescriptor(FunctionRoleResources, descriptor);
                if (!NT_SUCCESS(status)) {
                    // UrsIoResourceListAppendDescriptor for FunctionRoleResources failed.
                    LEAVE;
                }
            }

            if (keepAssigned == FALSE) {
                WdfIoResourceListRemove(resList, currentResourceIndex);
                --currentResourceIndex;
                --resCount;
            }
        }

    } FINALLY {
    }

    return status;
}

Требования

Требование Значение
Минимальная версия клиента Windows 10
Минимальная версия сервера Windows Server 2016
Целевая платформа Windows
Минимальная версия KMDF 1.15
Верхняя часть ursdevice.h (включая Urscx.h)
IRQL PASSIVE_LEVEL

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

Обработка аппаратных ресурсов

UrsDeviceInitialize

UrsIoResourceListAppendDescriptor

WdfIoResourceListRemove