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


структура CM_RESOURCE_LIST (wdm.h)

Структура CM_RESOURCE_LIST определяет все системные аппаратные ресурсы, назначенные устройству.

Синтаксис

typedef struct _CM_RESOURCE_LIST {
  ULONG                       Count;
  CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;

Члены

Count

Количество полных дескрипторов ресурсов, указанных в этой CM_RESOURCE_LIST структуре. Элемент List — это заголовок для первого полного дескриптора ресурсов. Для драйверов WDM число всегда равно 1.

List[1]

Структура CM_FULL_RESOURCE_DESCRIPTOR , которая служит заголовком для первого полного дескриптора ресурсов. Если структура CM_RESOURCE_LIST содержит более одного полного дескриптора ресурсов, то второй полный дескриптор ресурса сразу же следует за первым в памяти и т. д. Размер каждого полного дескриптора ресурсов зависит от длины массива CM_PARTIAL_RESOURCE_DESCRIPTOR , который он содержит. Дополнительные сведения см. в разделе "Примечания".

Комментарии

Эта структура описывает назначение аппаратных ресурсов устройству. IRP_MN_START_DEVICE IRP использует эту структуру для указания ресурсов, которые диспетчер Plug and Play назначает устройству. Драйверы для устаревших устройств используют эту структуру для передачи требований к ресурсам в подпрограмму IoReportResourceForDetection . Дополнительные сведения о выделении аппаратных ресурсов см. в разделе Аппаратные ресурсы.

Структура CM_RESOURCE_LIST — это заголовок для более крупной структуры данных переменного размера, которая содержит один или несколько полных дескрипторов ресурсов. Все данные в этой более крупной структуре занимают непрерывный блок памяти. Каждый полный дескриптор ресурсов занимает подблок в более крупном блоке.

Полный дескриптор ресурсов начинается со структуры CM_FULL_RESOURCE_DESCRIPTOR , которая служит заголовком для массива CM_PARTIAL_RESOURCE_DESCRIPTOR структур. Длина этого массива определяет размер полного дескриптора ресурса. Последний элемент в структуре CM_FULL_RESOURCE_DESCRIPTOR является CM_PARTIAL_RESOURCE_LIST структурой, которая содержит в качестве последнего элемента первый элемент в этом массиве. Если массив содержит несколько элементов, остальные элементы в памяти сразу же следуют за концом структуры CM_PARTIAL_RESOURCE_LIST , которая также является концом структуры CM_FULL_RESOURCE_DESCRIPTOR .

Код драйвера может использовать арифметику указателя для шага от одного полного дескриптора ресурса к следующему. Например, если параметр list является указателем на структуру CM_FULL_RESOURCE_DESCRIPTOR в начале одного полного дескриптора ресурсов, список можно обновить так, чтобы он указывал на начало следующего полного дескриптора ресурсов следующим образом:

list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
                                        list->PartialResourceList.Count);

В этом примере list->PartialResourceList.PartialDescriptors — это указатель на начало массива CM_PARTIAL_RESOURCE_DESCRIPTOR , а list->PartialResourceList.Count — количество элементов в массиве. Дополнительные сведения об элементах PartialDescriptors и Count см. в разделе CM_PARTIAL_RESOURCE_LIST.

Примеры

Все драйверы PnP должны обрабатывать IRP_MN_START_DEVICE IRP. Как правило, обработчик драйвера для этого IRP обрабатывает списки назначенных ресурсов, на которые указывают элементы Parameters.StartDevice.AllocatedResources и Parameters.StartDevice.AllocatedResourcesTranslatedструктуры IO_STACK_LOCATION в IRP. В следующем примере кода содержится функция с именем GetAssignedResources, вызываемая в обработчике для обхода каждого списка. Эта функция проверяет, указаны ли необходимые ресурсы в списке, и настраивает устройство для использования ресурсов.

Функция GetAssignedResources возвращает значение TRUE , если она завершается успешно. В противном случае возвращается значение FALSE (вероятно, из инструкции switch , хотя сведения опущены для упрощения примера кода).

/* Process the assigned hardware resources. */

BOOLEAN GetAssignedResources(PCM_RESOURCE_LIST reslist)
{
    PCM_FULL_RESOURCE_DESCRIPTOR list;

    list = reslist->List;

    for (int ix = 0; ix < reslist->Count; ++ix)
    {
        /* Process resources in CM_FULL_RESOURCE_DESCRIPTOR block number ix. */

        for (int jx = 0; jx < list->PartialResourceList.Count; ++jx)
        {
            PCM_PARTIAL_RESOURCE_DESCRIPTOR desc;

            desc = list->PartialResourceList.PartialDescriptors + jx;

            switch (desc->Type)
            {
                /* Process element jx in PartialDescriptors array. */

                ...

            }
        }

        /* Advance to next CM_FULL_RESOURCE_DESCRIPTOR block in memory. */

        list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors + 
                                              list->PartialResourceList.Count);
    }

    return TRUE;
}

Требования

Требование Значение
Заголовок wdm.h (включая Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h)

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

CM_FLOPPY_DEVICE_DATA

CM_FULL_RESOURCE_DESCRIPTOR

CM_KEYBOARD_DEVICE_DATA

CM_PARTIAL_RESOURCE_LIST

CM_RESOURCE_LIST

CM_SCSI_DEVICE_DATA

CM_SERIAL_DEVICE_DATA

IRP_MN_START_DEVICE

IoConnectInterrupt

IoGetDeviceProperty

IoReportResourceForDetection