estructura CM_RESOURCE_LIST (wdm.h)
La estructura CM_RESOURCE_LIST especifica todos los recursos de hardware del sistema asignados a un dispositivo.
Sintaxis
typedef struct _CM_RESOURCE_LIST {
ULONG Count;
CM_FULL_RESOURCE_DESCRIPTOR List[1];
} CM_RESOURCE_LIST, *PCM_RESOURCE_LIST;
Miembros
Count
Número de descriptores de recursos completos especificados por esta estructura de CM_RESOURCE_LIST . El miembro List es el encabezado del primer descriptor de recursos completo. Para los controladores WDM, Count siempre es 1.
List[1]
Estructura CM_FULL_RESOURCE_DESCRIPTOR que actúa como encabezado para el primer descriptor de recursos completo. Si la estructura de CM_RESOURCE_LIST contiene más de un descriptor de recursos completo, el segundo descriptor de recursos completo sigue inmediatamente el primero en memoria, etc. El tamaño de cada descriptor de recursos completo depende de la longitud de la matriz CM_PARTIAL_RESOURCE_DESCRIPTOR que contiene. Para obtener más información, vea la sección Comentarios que se muestra más adelante.
Comentarios
Esta estructura describe la asignación de recursos de hardware a un dispositivo. Un IRP_MN_START_DEVICE IRP usa esta estructura para especificar los recursos que el administrador de Plug and Play asigna a un dispositivo. Los controladores para dispositivos heredados usan esta estructura para pasar sus requisitos de recursos a la rutina IoReportResourceForDetection . Para obtener más información sobre la asignación de recursos de hardware, consulte Recursos de hardware.
La estructura CM_RESOURCE_LIST es un encabezado para una estructura de datos mayor, de tamaño variable, que contiene uno o varios descriptores de recursos completos. Todos los datos de esta estructura más grande ocupan un bloque contiguo de memoria. Cada descriptor de recursos completo ocupa un subbloqueo dentro del bloque más grande.
Un descriptor de recursos completo comienza con una estructura de CM_FULL_RESOURCE_DESCRIPTOR , que actúa como encabezado para una matriz de estructuras de CM_PARTIAL_RESOURCE_DESCRIPTOR . La longitud de esta matriz determina el tamaño del descriptor de recursos completo. El último miembro de la estructura CM_FULL_RESOURCE_DESCRIPTOR es una estructura CM_PARTIAL_RESOURCE_LIST que contiene, como último miembro, el primer elemento de esta matriz. Si la matriz contiene más de un elemento, los elementos restantes siguen inmediatamente, en memoria, el final de la estructura CM_PARTIAL_RESOURCE_LIST , que también es el final de la estructura CM_FULL_RESOURCE_DESCRIPTOR .
El código de controlador puede usar la aritmética de puntero para pasar de un descriptor de recursos completo a la siguiente. Por ejemplo, si un parámetro denominado list es un puntero a la estructura CM_FULL_RESOURCE_DESCRIPTOR al principio de un descriptor de recursos completo, la lista se puede actualizar para que apunte al inicio del siguiente descriptor de recursos completo de la siguiente manera:
list = (PCM_FULL_RESOURCE_DESCRIPTOR)(list->PartialResourceList.PartialDescriptors +
list->PartialResourceList.Count);
En este ejemplo, list->PartialResourceList.PartialDescriptors
es un puntero al inicio de la matriz de CM_PARTIAL_RESOURCE_DESCRIPTOR y list->PartialResourceList.Count
es el número de elementos de la matriz. Para obtener más información sobre los miembros PartialDescriptors y Count , vea CM_PARTIAL_RESOURCE_LIST.
Ejemplos
Todos los controladores PnP deben controlar IRP_MN_START_DEVICE IRP. Normalmente, el controlador de un controlador para este IRP recorre las listas de recursos asignados a los que apuntan los miembros Parameters.StartDevice.AssignResources y Parameters.StartDevice.AssignResourcesTranslated de la estructura IO_STACK_LOCATION del IRP. El ejemplo de código siguiente contiene una función denominada GetAssignedResources, a la que se llama en el controlador para recorrer cada lista. Esta función comprueba que los recursos necesarios se especifican en la lista y configura el dispositivo para usar los recursos.
La función GetAssignedResources devuelve TRUE si se realiza correctamente. De lo contrario, devuelve FALSE (probablemente de la instrucción switch , aunque se omiten los detalles para simplificar el ejemplo 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 |
---|---|
Header | wdm.h (incluya Wdm.h, Ntddk.h, Ntifs.h, Wudfwdm.h) |