IoReportResourceForDetection 함수(ntddk.h)
IoReportResourceForDetection 루틴은 레거시 디바이스에 대한 구성 레지스트리의 하드웨어 리소스를 클레임합니다.
구문
NTSTATUS IoReportResourceForDetection(
[in] PDRIVER_OBJECT DriverObject,
[in, optional] PCM_RESOURCE_LIST DriverList,
[in, optional] ULONG DriverListSize,
[in, optional] PDEVICE_OBJECT DeviceObject,
[in, optional] PCM_RESOURCE_LIST DeviceList,
[in, optional] ULONG DeviceListSize,
[out] PBOOLEAN ConflictDetected
);
매개 변수
[in] DriverObject
드라이버의 DriverEntry 루틴에 입력된 드라이버 개체에 대한 포인터입니다.
[in, optional] DriverList
필요에 따라 드라이버가 모든 디바이스에 대해 동일한 리소스를 클레임하는 경우 드라이버의 리소스 목록을 포함하는 호출자 제공 버퍼를 가리킵니다. 호출자가 DeviceList를 지정하는 경우 이 매개 변수는 무시됩니다.
[in, optional] DriverListSize
선택적 DriverList의 크기(바이트)를 지정합니다. DriverList가 NULL인 경우 이 매개 변수는 0이어야 합니다.
[in, optional] DeviceObject
필요에 따라 드라이버가 리소스를 클레임하려는 디바이스를 나타내는 디바이스 개체를 가리킵니다.
[in, optional] DeviceList
필요에 따라 디바이스의 리소스 목록을 포함하는 호출자 제공 버퍼를 가리킵니다. 드라이버가 모든 디바이스에 대해 동일한 리소스를 클레임하는 경우 호출자는 DriverList 를 대신 지정할 수 있습니다.
[in, optional] DeviceListSize
선택적 DeviceList의 크기(바이트)를 지정합니다. DeviceList가 NULL인 경우 이 매개 변수는 0이어야 합니다.
[out] ConflictDetected
리소스를 사용할 수 없는 경우 반환 시 TRUE 로 설정된 호출자 제공 부울 값에 대한 포인터입니다.
반환 값
IoReportResourceForDetection 은 리소스가 요청되면 STATUS_SUCCESS 반환합니다. 가능한 오류 반환 값은 다음과 같습니다.
반환 코드 | 설명 |
---|---|
STATUS_CONFLICTING_ADDRESSES | 리소스가 이미 사용 중이거나 PnP 열거 가능 디바이스에 필요하기 때문에 리소스를 클레임할 수 없습니다. |
STATUS_UNSUCCESSFUL | DeviceList 또는 DriverList가 잘못되었습니다. |
설명
이 루틴은 PnP(플러그 앤 플레이)로 열거할 수 없는 이전 하드웨어를 검색하는 드라이버용입니다.
드라이버가 PnP 하드웨어만 지원하는 경우 검색되지 않으므로 IoReportResourceForDetection을 호출하지 않습니다. PnP 시스템은 각 PnP 디바이스를 열거하고, 디바이스에 리소스를 할당하고, IRP_MN_START_DEVICE 요청에서 해당 리소스를 디바이스의 드라이버에 전달합니다.
그러나 PnP 드라이버가 레거시 하드웨어를 지원하는 경우 디바이스를 검색하기 전에 IoReportResourceForDetection 을 호출하여 하드웨어 리소스를 클레임해야 합니다.
이 루틴의 호출자는 페이징된 메모리에서 할당 되고 변환되지 않은 원시 리소스로 구성된 DeviceList 또는 DriverList 의 CM_RESOURCE_LIST 지정합니다. 호출자는 메모리 해제를 담당합니다.
둘 이상의 레거시 카드 동시에 제어할 수 있는 드라이버는 DeviceObject, DeviceList 및 DeviceListSize 매개 변수를 사용하여 각 디바이스의 디바이스 개체에 대해 각 디바이스에 대한 리소스를 클레임해야 합니다. 이러한 드라이버는 해당 드라이버 개체에 대해 이러한 리소스를 클레임해서는 안 됩니다.
CM_RESOURCE_LIST 두 개의 변수 크기 배열을 포함합니다. 각 배열의 기본 크기는 1입니다. 두 배열에 둘 이상의 요소가 있는 경우 호출자는 메모리를 동적으로 할당하여 추가 요소를 포함해야 합니다. 배열에 추가 부분 리소스 설명자를 포함할 수 있는 CM_RESOURCE_LIST 마지막 전체 리소스 설명자를 제외하고 목록의 각 CM_FULL_RESOURCE_DESCRIPTOR CM_PARTIAL_RESOURCE_DESCRIPTOR 하나만 포함할 수 있습니다.
PnP 관리자의 도움을 받아 IoReportResourceForDetection은 요청된 리소스가 이미 클레임된 리소스와 충돌하는지 여부를 결정합니다.
충돌이 감지되면 이 루틴은 ConflictDetected 의 BOOLEAN을 TRUE 로 설정하고 STATUS_CONFLICTING_ADDRESSES 반환합니다.
충돌이 검색되지 않으면 이 루틴은 리소스를 클레임하고 ConflictDetected 의 BOOLEAN을 FALSE로 설정하고 STATUS_SUCCESS 반환합니다.
이 루틴이 성공하고 드라이버가 레거시 디바이스를 검색하는 경우 드라이버는 IoReportDetectedDevice를 호출하여 디바이스를 PnP 관리자에게 보고합니다. 이 호출에서 드라이버는 ResourceAssigned 를 TRUE 로 설정하므로 PnP 관리자는 리소스를 다시 클레임하지 않습니다.
드라이버가 이 루틴에 대한 호출로 요청한 리소스가 더 이상 필요하지 않은 경우 드라이버는 Count가 0인 DriverList 또는 DeviceList를 사용하여 이 루틴을 다시 호출합니다.
드라이버가 둘 이상의 디바이스에 대해 디바이스별 리소스를 클레임하는 경우 드라이버는 이러한 각 디바이스에 대해 이 루틴을 호출해야 합니다.
드라이버는 지정된 디바이스에 대해 이 루틴을 두 번 이상 호출할 수 있습니다. 하나의 리소스 집합이 실패하면 드라이버는 다른 리소스 집합이 있는 동일한 디바이스에 대해 루틴을 다시 호출할 수 있습니다. 리소스 집합이 성공하면 드라이버는 새 목록을 사용하여 이 루틴을 다시 호출할 수 있습니다. 새 목록이 이전 목록을 대체합니다.
IoReportResourceForDetection의 호출자는 시스템 스레드의 컨텍스트에서 IRQL = PASSIVE_LEVEL 실행되어야 합니다.
요구 사항
요구 사항 | 값 |
---|---|
대상 플랫폼 | 유니버설 |
헤더 | ntddk.h(Ntddk.h 포함) |
라이브러리 | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | PASSIVE_LEVEL(설명 섹션 참조) |