IRP_MN_CHANGE_SINGLE_ITEM
WMI를 지원하는 모든 드라이버는 이 IRP를 처리해야 합니다. 드라이버는 WmiSystemControl 을 호출하거나 WMI 요청 처리에 설명된 대로 IRP 자체를 처리 하여 WMI IRP를 처리할 수 있습니다.
드라이버가 WmiSystemControl 을 호출하여 IRP_MN_CHANGE_SINGLE_ITEM 요청을 처리하는 경우 WMI는 해당 드라이버의 DpWmiSetDataItem 루틴을 호출합니다.
주 코드
보낸 경우
WMI는 데이터 블록의 단일 instance 단일 데이터 항목을 변경하기 위해 이 IRP를 보냅니다.
WMI는 임의 스레드 컨텍스트에서 IRQL = PASSIVE_LEVEL 이 IRP를 보냅니다.
입력 매개 변수
Parameters.WMI.ProviderId 는 요청에 응답해야 하는 드라이버의 디바이스 개체를 가리킵니다. 이 포인터는 IRP에서 드라이버의 I/O 스택 위치에 있습니다.
Parameters.WMI.DataPath 는 설정할 데이터 블록을 식별하는 GUID를 가리킵니다.
Parameters.WMI.BufferSize 는 Parameters.WMI.Buffer에서 페이지가 없는 버퍼의 크기를 나타냅니다.
Parameters.WMI.Buffer는 데이터 블록의 instance, 설정할 항목의 ID 및 새 데이터 값을 식별하는 WNODE_SINGLE_ITEM 구조를 가리킵니다.
출력 매개 변수
없음
I/O 상태 블록
드라이버가 WmiSystemControl을 호출하여 IRP를 처리하는 경우 WMI는 I/O 상태 블록에서 Irp-IoStatus.Status> 및 Irp-IoStatus.Information>를 설정합니다.
그렇지 않으면 드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 또는 다음과 같은 적절한 오류 상태 설정합니다.
STATUS_WMI_INSTANCE_NOT_FOUND
STATUS_WMI_ITEMID_NOT_FOUND
STATUS_WMI_GUID_NOT_FOUND
STATUS_WMI_READ_ONLY
STATUS_WMI_SET_FAILURE
성공하면 드라이버는 Irp-IoStatus.Information>를 0으로 설정합니다.
작업
드라이버가 WmiSystemControl을 호출하여 WMI IRP를 처리하는 경우 해당 루틴은 드라이버의 DpWmiSetDataItem 루틴을 호출하거나 드라이버가 루틴을 정의하지 않으면 STATUS_WMI_READ_ONLY 반환합니다.
드라이버가 IRP_MN_CHANGE_SINGLE_ITEM 요청 자체를 처리하는 경우 Parameters.WMI.ProviderId 가 드라이버가 IoWMIRegistrationControl에 전달한 포인터와 동일한 디바이스 개체를 가리키는 경우에만 처리해야 합니다. 그렇지 않으면 드라이버가 다음 하위 드라이버에 요청을 전달해야 합니다.
시스템에서 제공하는 사용자 모드 구성 요소에 이 기능이 필요하다고 확신하지 않는 한 IRP_MN_CHANGE_SINGLE_ITEM 대한 지원을 구현하지 마세요.
요청을 처리하기 전에 드라이버는 Parameters.WMI.DataPath 가 드라이버가 지원하는 GUID를 가리키는지 여부를 결정해야 합니다. 그렇지 않은 경우 드라이버는 IRP에 실패하고 STATUS_WMI_GUID_NOT_FOUND 반환해야 합니다.
드라이버가 데이터 블록을 지원하는 경우 다음과 같이 Parameters.WMI.Buffer가 instance 이름에 대해 가리키는 입력 WNODE_SINGLE_ITEM 구조를 검사 합니다.
WNODE_FLAG_STATIC_INSTANCE_NAMES WnodeHeader.Flags에서 설정된 경우 드라이버는 InstanceIndex를 해당 블록에 대한 드라이버의 정적 instance 이름 목록에 대한 인덱스로 사용합니다. WMI는 블록을 등록할 때 드라이버가 제공한 등록 데이터에서 인덱스를 가져옵니다.
WnodeHeader.Flags에서 WNODE_FLAG_STATIC_INSTANCE_NAMES 명확하면 드라이버는 OffsetInstanceName의 오프셋을 사용하여 입력 WNODE_SINGLE_ITEM 구조체에서 instance 이름 문자열을 찾습니다. OffsetInstanceName은 구조체 시작부터 instance 이름 문자열의 USHORT 크기 길이(문자 아님)까지의 오프셋(바이트)입니다. 이 길이는 NULL 종결자(있는 경우)를 포함하고 유니코드의 instance 이름 문자열을 포함합니다.
드라이버는 모든 입력 값의 유효성을 검사해야 합니다. 특히 드라이버는 IRP 요청 자체를 처리하는 경우 다음을 수행해야 합니다.
정적 이름의 경우 WNODE_SINGLE_ITEM 구조체의 InstanceIndex 멤버가 드라이버가 데이터 블록에 대해 지원하는 instance 인덱스 범위 내에 있는지 확인합니다.
동적 이름의 경우 instance 이름 문자열이 드라이버에서 지원하는 데이터 블록 instance 식별하는지 확인합니다.
WNODE_SINGLE_ITEM 구조체의 ItemId 멤버가 드라이버가 데이터 블록에 대해 지원하는 항목 식별자 범위 내에 있는지 확인합니다.
WNODE_SINGLE_ITEM 구조의 DataBlockOffset 및 SizeDataItem 멤버가 유효한 크기의 데이터 블록을 설명하고 버퍼의 내용이 데이터 항목에 유효한지 확인합니다.
지정된 데이터 항목이 드라이버가 호출자 시작 수정을 허용하는 항목인지 확인합니다. 즉, 드라이버는 읽기 전용으로 의도한 데이터 항목에 대한 수정을 허용해서는 안 됩니다.
스레드 컨텍스트가 시작 사용자 모드 애플리케이션의 컨텍스트라고 가정하지 마세요. 상위 수준 드라이버가 변경되었을 수 있습니다.
드라이버가 지정된 instance 찾을 수 없는 경우 IRP에 실패하고 STATUS_WMI_INSTANCE_NOT_FOUND 반환해야 합니다. 동적 instance 이름의 instance 경우 이 상태 드라이버가 instance 지원하지 않음을 나타냅니다. 따라서 WMI는 다른 데이터 공급자를 계속 쿼리하고 다른 공급자가 instance 찾지만 다른 이유로 요청을 처리할 수 없는 경우 데이터 소비자에게 적절한 오류를 반환할 수 있습니다.
드라이버가 instance 찾아 요청을 처리할 수 있는 경우 instance 데이터 항목을 WNODE_SINGLE_ITEM 값으로 설정합니다. 데이터 항목이 읽기 전용인 경우 드라이버는 항목을 변경하지 않고 IRP에 실패하고 STATUS_WMI_READ_ONLY 반환합니다.
instance 유효하지만 드라이버가 요청을 처리할 수 없는 경우 적절한 오류 상태 반환할 수 있습니다.
요구 사항
헤더 |
Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함) |