Поделиться через


структура 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)

См. также

IO_RESOURCE_DESCRIPTOR

IO_RESOURCE_LIST

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

IRP_MN_QUERY_RESOURCE_REQUIREMENTS