IO_RESOURCE_REQUIREMENTS_LIST 구조체(wdm.h)

IO_RESOURCE_REQUIREMENTS_LIST 구조는 디바이스에서 사용할 수 있는 리소스 구성 집합을 설명합니다. 각 구성은 디바이스에서 사용할 수 있는 다양한 유형의 원시 리소스 범위를 나타냅니다.

구문

typedef struct _IO_RESOURCE_REQUIREMENTS_LIST {
  ULONG            ListSize;
  INTERFACE_TYPE   InterfaceType;
  ULONG            BusNumber;
  ULONG            SlotNumber;
  ULONG            Reserved[3];
  ULONG            AlternativeLists;
  IO_RESOURCE_LIST List[1];
} IO_RESOURCE_REQUIREMENTS_LIST, *PIO_RESOURCE_REQUIREMENTS_LIST;

멤버

ListSize

IO_RESOURCE_REQUIREMENTS_LIST 구조체, 해당 IO_RESOURCE_LIST 배열 및 후자의 IO_RESOURCE_DESCRIPTOR 배열을 구성하는 총 바이트 수입니다.

InterfaceType

인터페이스 형식을 지정합니다. Wdm.h 또는 Ntddk.h에서 INTERFACE_TYPE 정의한 형식 중 하나여야 합니다. (WDM 드라이버에서 사용되지 않음)

BusNumber

시스템 할당 0부터 시작하는 버스 번호입니다. (WDM 드라이버에서 사용되지 않음)

SlotNumber

시스템 슬롯 번호입니다. (WDM 드라이버에서 사용되지 않음)

Reserved[3]

예약되어 있습니다.

AlternativeLists

IO_RESOURCE_REQUIREMENTS_LIST 구조에서 설명하는 하드웨어 리소스의 대체 목록(또는 구성)의 수입니다. 목록 멤버는 첫 번째 대체 목록의 헤더입니다.

List[1]

하드웨어 리소스의 첫 번째 대체 목록에 대한 헤더 역할을 하는 IO_RESOURCE_LIST 구조체입니다. IO_RESOURCE_REQUIREMENTS_LIST 구조에서 둘 이상의 대체 목록을 설명하는 경우 두 번째 대체 목록은 메모리의 첫 번째 대체 목록 바로 뒤를 따릅니다. 각 대체 목록의 크기는 포함된 IO_RESOURCE_DESCRIPTOR 배열의 길이에 따라 달라집니다. 자세한 내용은 아래 설명 부분을 참조하십시오.

설명

이 구조는 IRP_MN_FILTER_RESOURCE_REQUIREMENTSIRP_MN_QUERY_RESOURCE_REQUIREMENTS IRP에서 하드웨어 리소스의 하나 이상의 대체 구성을 설명하는 데 사용됩니다.

IO_RESOURCE_REQUIREMENTS_LIST 구조는 하나 이상의 대체 리소스 목록을 지정하는 변수 크기의 더 큰 데이터 구조에 대한 헤더입니다. 이 더 큰 구조의 모든 데이터는 ListSize 멤버에 의해 크기가 지정된 연속된 메모리 블록을 차지합니다. 각 대체 목록은 더 큰 블록 내의 하위 블록을 차지합니다.

각 대체 목록은 IO_RESOURCE_DESCRIPTOR 구조체 배열의 헤더 역할을 하는 IO_RESOURCE_LIST 구조체로 시작합니다. 이 배열의 길이는 목록의 크기를 결정하며, 이는 대체 목록마다 다를 수 있습니다. 드라이버 코드는 포인터 산술 연산을 사용하여 한 대체 목록에서 다음 목록으로 단계별로 실행할 수 있습니다. 예를 들어 list라는 매개 변수가 하나의 대체 목록 의 시작 부분에 있는 IO_RESOURCE_LIST 구조체에 대한 포인터인 경우 다음과 같이 목록을 업데이트하여 다음 목록의 시작을 가리킬 수 있습니다.

list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);

이 예제에서 는 list->DescriptorsIO_RESOURCE_DESCRIPTOR 배열의 시작 부분에 대한 포인터이고 list->Count 는 배열의 요소 수입니다. 설명자Count 멤버에 대한 자세한 내용은 IO_RESOURCE_LIST.

예제

드라이버에 IRP_MN_FILTER_RESOURCE_REQUIREMENTS IRP에 대한 처리기가 포함된 경우 처리기는 일반적으로 IRP의 IoStatus.Information 필드가 가리키는 리소스 목록을 안내합니다. 다음 코드 예제에는 목록을 안내하기 위해 처리기에서 호출되는 FilterResources라는 함수가 포함되어 있습니다. 이 함수는 특정 리소스가 목록에 지정되어 있는지 확인하거나 목록의 크기를 변경하지 않고 목록의 리소스 요구 사항을 변경합니다. 목록의 크기를 변경하는 함수는 업데이트된 목록에 대한 버퍼를 할당하고, 목록을 이 버퍼에 쓰고, IRP의 IoStatus.Information 필드를 업데이트하여 업데이트된 목록을 가리키고, 원래 목록이 포함된 버퍼를 해제해야 합니다.

FilterResources 함수는 목록에서 찾고 있는 리소스를 찾거나 목록의 크기를 변경하지 않는 목록을 변경하는 경우 TRUE 를 반환합니다(코드 예제를 단순화하기 위해 세부 정보가 생략되었지만 switch 문에서). 그렇지 않으면 FALSE를 반환합니다.

/* Modify the resource list in place (without changing its size). */

BOOLEAN FilterResources(PIO_RESOURCE_REQUIREMENTS_LIST reqlist)
{
    PIO_RESOURCE_LIST list;

    list = reqlist->List;

    for (int ix = 0; ix < reqlist->AlternativeLists; ++ix)
    {
        /* Process resources in IO_RESOURCE_LIST block number ix. */

        for (int jx = 0; jx < list->Count; ++jx)
        {
            PIO_RESOURCE_DESCRIPTOR desc; 

            desc = list->Descriptors + jx;

            switch (desc->Type)
            {
               /* Process element jx in Descriptors array. */

               ...

            }
        }

        /* Advance to next IO_RESOURCE_LIST block in memory. */

        list = (PIO_RESOURCE_LIST)(list->Descriptors + list->Count);
    }

    return FALSE;
}

요구 사항

요구 사항
헤더 wdm.h(Wdm.h, Ntddk.h, Ntifs.h, Miniport.h 포함)

추가 정보

IO_RESOURCE_DESCRIPTOR

IO_RESOURCE_LIST

IRP_MN_FILTER_RESOURCE_REQUIREMENTS

IRP_MN_QUERY_RESOURCE_REQUIREMENTS