다음을 통해 공유


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 구조체로 시작합니다. 이 배열의 길이는 목록의 크기를 결정하며, 이는 대체 목록마다 다를 수 있습니다. 드라이버 코드는 포인터 산술 연산을 사용하여 한 대체 목록에서 다음 목록으로 단계별로 실행할 수 있습니다. 예를 들어 목록 매개 변수가 하나의 대체 목록 시작 부분에 있는 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