структура 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 структур. Длина этого массива определяет размер списка, который может отличаться от одного альтернативного списка к другому. Код драйвера может использовать арифметические указатели для шага от одного альтернативного списка к другому. Например, если параметр list является указателем на структуру IO_RESOURCE_LIST в начале одного альтернативного списка, список можно обновить так, чтобы он указывал на начало следующего списка следующим образом:

list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);

В этом примере list->Descriptors — это указатель на начало массива IO_RESOURCE_DESCRIPTOR , а list->Count — количество элементов в массиве. Дополнительные сведения о дескрипторов и элементах Count см. в разделе IO_RESOURCE_LIST.

Примеры

Если драйвер содержит обработчик для IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP, обработчик обычно проходит список ресурсов, на который указывает поле IoStatus.Information в IRP. Следующий пример кода содержит функцию с именем FilterResources, которая вызывается в обработчике для обхода списка. Эта функция либо проверяет, указан ли определенный ресурс в списке, либо изменяет требования к ресурсам в списке, не изменяя размер списка. (Функция, которая изменяет размер списка, должна выделить буфер для обновленного списка, записать список в этот буфер, обновить поле IoStatus.Information в IRP, чтобы указать на обновленный список, и освободить буфер, содержащий исходный список.)

Функция FilterResources возвращает значение TRUE (вероятно, из инструкции switch , хотя сведения опущены для упрощения примера кода), если она находит ресурс, который она ищет в списке, или если она вносит изменения в список, не изменяющие размер списка. В противном случае возвращается значение 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 (включая Wdm.h, Ntddk.h, Ntifs.h, Miniport.h)

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

IO_RESOURCE_DESCRIPTOR

IO_RESOURCE_LIST

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

IRP_MN_QUERY_RESOURCE_REQUIREMENTS