функция обратного вызова 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 |
См. также раздел
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по