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.PartialDescriptorsCM_PARTIAL_RESOURCE_DESCRIPTOR 배열의 시작 부분에 대한 포인터이며 list->PartialResourceList.Count 는 배열의 요소 수입니다. PartialDescriptorsCount 멤버에 대한 자세한 내용은 CM_PARTIAL_RESOURCE_LIST 참조하세요.

예제

모든 PnP 드라이버는 IRP_MN_START_DEVICE IRP를 처리해야 합니다. 일반적으로 이 IRP에 대한 드라이버 처리기는 IRP에서 IO_STACK_LOCATION 구조체Parameters.StartDevice.AllocatedResourcesParameters.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 포함)

추가 정보

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