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_REQUIREMENTS 및 IRP_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->Descriptors
IO_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 포함) |