структура IO_RESOURCE_REQUIREMENTS_LIST (wdm.h)
Структура IO_RESOURCE_REQUIREMENTS_LIST описывает наборы конфигураций ресурсов, которые могут использоваться устройством. Каждая конфигурация представляет собой диапазон необработанных ресурсов различных типов, которые могут использоваться устройством.
Синтаксис
typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
ULONG ListSize;
INTERFACE_TYPE InterfaceType;
ULONG BusNumber;
ULONG SlotNumber;
ULONG Reserved[3];
ULONG AlternativeLists;
IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;
Члены
ListSize
Общее число байтов, составляющих структуру IO_RESOURCE_REQUIREMENTS_LIST, его массив IO_RESOURCE_LIST и массив IO_RESOURCE_DESCRIPTOR последнего.
InterfaceType
Указывает тип интерфейса. Это должен быть один из типов, определенных INTERFACE_TYPE, в Wdm.h или Ntddk.h. (Не используется драйверами WDM.)
BusNumber
Назначаемый системой номер шины, назначаемый от нуля. (Не используется драйверами WDM.)
SlotNumber
Номер системного слота. (Не используется драйверами WDM.)
Reserved[3]
Скрытный.
AlternativeLists
Количество альтернативных списков (или конфигураций) аппаратных ресурсов, описанных в этой IO_RESOURCE_REQUIREMENTS_LIST структуре. Элемент list является заголовком для первого альтернативного списка.
List[1]
Структура IO_RESOURCE_LIST, которая служит заголовком для первого альтернативного списка аппаратных ресурсов. Если структура IO_RESOURCE_REQUIREMENTS_LIST описывает несколько альтернативных списков, второй альтернативный список немедленно следует первому альтернативному списку в памяти и т. д. Размер каждого альтернативного списка зависит от длины массива IO_RESOURCE_DESCRIPTOR, который он содержит. Дополнительные сведения см. в следующем разделе "Примечания".
Замечания
Эта структура используется IRP_MN_FILTER_RESOURCE_REQUIREMENTS и IRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP для описания одной или нескольких альтернативных конфигураций аппаратных ресурсов.
Структура IO_RESOURCE_REQUIREMENTS_LIST — это заголовок для более крупной структуры данных, размер переменной, указывающий один или несколько альтернативных списков ресурсов. Все данные в этой более крупной структуре занимают непрерывный блок памяти, размер которого указывается элементом ListSize. Каждый альтернативный список занимает подблок в большом блоке.
Каждый альтернативный список начинается с IO_RESOURCE_LIST структуры, которая служит заголовком для массива IO_RESOURCE_DESCRIPTOR структур. Длина этого массива определяет размер списка, который может отличаться от одного альтернативного списка до следующего. Код драйвера может использовать арифметику указателя для шага из одного альтернативного списка к следующему. Например, если параметр с именем списка является указателем на структуру IO_RESOURCE_LIST в начале одного альтернативного списка, список можно обновить, чтобы указать начало следующего списка следующим образом:
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
В этом примере list->Descriptors
— это указатель на начало массива IO_RESOURCE_DESCRIPTOR, а list->Count
— количество элементов в массиве. Дополнительные сведения о дескрипторах и числа см. в IO_RESOURCE_LIST.
Примеры
Если драйвер содержит обработчик для IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP, обработчик обычно проходит список ресурсов, на который указывает поле IoStatus.Information в IRP. В следующем примере кода содержится функция с именем FilterResources, которая вызывается в обработчике для обхода списка. Эта функция либо проверяет, указан ли определенный ресурс в списке, либо изменяет требования к ресурсам в списке, не изменяя размер списка. (Функция, которая изменяет размер списка, потребуется выделить буфер для обновленного списка, записать список в этот буфер, обновить поле IoStatus.Information в IRP, чтобы указать обновленный список и освободить буфер, содержащий исходный список.)
Функция FilterResources возвращает TRUE (вероятно, из инструкции переключателя, хотя сведения опущены для упрощения примера кода), если он находит ресурс, который он ищет в списке, или если он вносит изменения в список, который не изменяет размер списка. В противном случае возвращается FALSE.
/* Modify the resource list in place (without changing its size). */
BOOLEAN FilterResources(PIO_RESOURCE_REQUIREMENTS_LIST reqlist)
{
PIO_RESOURCE_LIST list;
list = reqlist->List;
for (int ix = 0; ix < reqlist->AlternativeLists; ++ix)
{
/* Process resources in IO_RESOURCE_LIST block number ix. */
for (int jx = 0; jx < list->Count; ++jx)
{
PIO_RESOURCE_DESCRIPTOR desc;
desc = list->Descriptors + jx;
switch (desc->Type)
{
/* Process element jx in Descriptors array. */
...
}
}
/* Advance to next IO_RESOURCE_LIST block in memory. */
list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
}
return FALSE;
}
Требования
Требование | Ценность |
---|---|
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Miniport.h) |