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 드라이버의 경우 Count 는 항상 1입니다.
List[1]
첫 번째 전체 리소스 설명자의 헤더 역할을 하는 CM_FULL_RESOURCE_DESCRIPTOR 구조체입니다. CM_RESOURCE_LIST 구조에 둘 이상의 전체 리소스 설명자가 포함된 경우 두 번째 전체 리소스 설명자는 메모리의 첫 번째 설명자 바로 뒤에 입니다. 각 전체 리소스 설명자의 크기는 포함된 CM_PARTIAL_RESOURCE_DESCRIPTOR 배열의 길이에 따라 달라집니다. 자세한 내용은 아래 설명 부분을 참조하십시오.
설명
이 구조에서는 디바이스에 하드웨어 리소스를 할당하는 방법을 설명합니다. IRP_MN_START_DEVICE IRP는 이 구조를 사용하여 플러그 앤 플레이 관리자가 디바이스에 할당하는 리소스를 지정합니다. 레거시 디바이스용 드라이버는 이 구조를 사용하여 리소스 요구 사항을 IoReportResourceForDetection 루틴에 전달합니다. 하드웨어 리소스 할당에 대한 자세한 내용은 하드웨어 리소스를 참조하세요.
CM_RESOURCE_LIST 구조는 하나 이상의 전체 리소스 설명자를 포함하는 변수 크기의 더 큰 데이터 구조에 대한 헤더입니다. 이 큰 구조의 모든 데이터는 연속 메모리 블록을 차지합니다. 각 전체 리소스 설명자는 더 큰 블록 내의 하위 블록을 차지합니다.
전체 리소스 설명자는 CM_PARTIAL_RESOURCE_DESCRIPTOR 구조 배열의 헤더 역할을 하는 CM_FULL_RESOURCE_DESCRIPTOR 구조체로 시작합니다. 이 배열의 길이는 전체 리소스 설명자의 크기를 결정합니다. CM_FULL_RESOURCE_DESCRIPTOR 구조체의 마지막 멤버는 이 배열의 첫 번째 요소인 마지막 멤버를 포함하는 CM_PARTIAL_RESOURCE_LIST 구조체입니다. 배열에 둘 이상의 요소가 포함된 경우 나머지 요소는 메모리에서 CM_FULL_RESOURCE_DESCRIPTOR 구조체의 끝이기도 한 CM_PARTIAL_RESOURCE_LIST 구조체의 끝을 즉시 따릅니다.
드라이버 코드는 포인터 산술 연산을 사용하여 전체 리소스 설명자에서 다음으로 단계별로 실행할 수 있습니다. 예를 들어 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에 대한 드라이버 처리기는 IRP에서 IO_STACK_LOCATION 구조체의 Parameters.StartDevice.AllocatedResources 및 Parameters.StartDevice.AllocatedResourcesTranslated 멤버가 가리키는 할당된 리소스 목록을 안내합니다. 다음 코드 예제에는 각 목록을 걷기 위해 처리기에서 호출되는 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 포함) |