estrutura CM_RESOURCE_LIST (wdm.h)
A estrutura CM_RESOURCE_LIST especifica todos os recursos de hardware do sistema atribuídos a um dispositivo.
Sintaxe
typedef struct _CM_RESOURCE_LIST {
ULONG Count;
CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
Membros
Count
O número de descritores de recursos completos especificados por essa estrutura CM_RESOURCE_LIST . O membro List é o cabeçalho do primeiro descritor de recurso completo. Para drivers WDM, Count é sempre 1.
List[1]
A estrutura CM_FULL_RESOURCE_DESCRIPTOR que serve como o cabeçalho para o primeiro descritor de recurso completo. Se a estrutura CM_RESOURCE_LIST contiver mais de um descritor de recurso completo, o segundo descritor de recurso completo seguirá imediatamente o primeiro na memória e assim por diante. O tamanho de cada descritor de recurso completo depende do comprimento da matriz de CM_PARTIAL_RESOURCE_DESCRIPTOR que ele contém. Para obter mais informações, consulte a seção Comentários a seguir.
Comentários
Essa estrutura descreve a atribuição de recursos de hardware a um dispositivo. Um IRP_MN_START_DEVICE IRP usa essa estrutura para especificar os recursos que o gerenciador de Plug and Play atribui a um dispositivo. Os drivers para dispositivos herdados usam essa estrutura para passar seus requisitos de recursos para a rotina IoReportResourceForDetection . Para obter mais informações sobre a alocação de recursos de hardware, consulte Recursos de hardware.
A estrutura CM_RESOURCE_LIST é um cabeçalho para uma estrutura de dados maior, de tamanho variável, que contém um ou mais descritores de recursos completos. Todos os dados nessa estrutura maior ocupam um bloco contíguo de memória. Cada descritor de recurso completo ocupa um subbloco dentro do bloco maior.
Um descritor de recurso completo começa com uma estrutura CM_FULL_RESOURCE_DESCRIPTOR , que serve como um cabeçalho para uma matriz de estruturas de CM_PARTIAL_RESOURCE_DESCRIPTOR . O comprimento dessa matriz determina o tamanho do descritor de recurso completo. O último membro na estrutura CM_FULL_RESOURCE_DESCRIPTOR é uma estrutura CM_PARTIAL_RESOURCE_LIST que contém, como seu último membro, o primeiro elemento nesta matriz. Se a matriz contiver mais de um elemento, os elementos restantes seguirão imediatamente, na memória, o final da estrutura CM_PARTIAL_RESOURCE_LIST , que também é o final da estrutura CM_FULL_RESOURCE_DESCRIPTOR .
O código do driver pode usar a aritmética de ponteiro para passar de um descritor de recurso completo para o próximo. Por exemplo, se um parâmetro chamado list for um ponteiro para a estrutura CM_FULL_RESOURCE_DESCRIPTOR no início de um descritor de recursos completo, a lista poderá ser atualizada para apontar para o início do próximo descritor de recursos completo da seguinte maneira:
list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
list->PartialResourceList.Count);
Neste exemplo, list->PartialResourceList.PartialDescriptors
é um ponteiro para o início da matriz CM_PARTIAL_RESOURCE_DESCRIPTOR e list->PartialResourceList.Count
é o número de elementos na matriz. Para obter mais informações sobre os membros PartialDescriptors e Count , consulte CM_PARTIAL_RESOURCE_LIST.
Exemplos
Todos os drivers PnP devem lidar com IRP_MN_START_DEVICE IRPs. Normalmente, um manipulador de driver para esse IRP percorre as listas de recursos atribuídos apontados pelos membros Parameters.StartDevice.AllocatedResources e Parameters.StartDevice.AllocatedResourcesTranslated da estrutura IO_STACK_LOCATION no IRP. O exemplo de código a seguir contém uma função, chamada GetAssignedResources, que é chamada no manipulador para percorrer cada lista. Essa função verifica se os recursos necessários são especificados na lista e configura o dispositivo para usar os recursos.
A função GetAssignedResources retornará TRUE se for bem-sucedida. Caso contrário, ele retornará FALSE (provavelmente da instrução switch , embora os detalhes sejam omitidos para simplificar o exemplo de código).
/* 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;
}
Requisitos
Requisito | Valor |
---|---|
Cabeçalho | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h) |