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