다음을 통해 공유


IRP_MN_REGINFO

Microsoft Windows 98 및 Microsoft Windows 2000에서 WMI를 지원하는 드라이버는 이 IRP를 처리해야 합니다. (Windows XP를 지원하는 드라이버도 IRP_MN_REGINFO_EX IRP를 처리해야 합니다.) 드라이버는 WMI 요청 처리에 설명된 대로 WmiSystemControl 을 호출하거나 IRP 자체를 처리 하여 WMI IRP를 처리할 수 있습니다.

주 코드

IRP_MJ_SYSTEM_CONTROL

보낸 경우

Windows 98 및 Windows 2000에서 WMI는 드라이버가 IoWMIRegistrationControl을 호출한 후 드라이버의 등록 정보를 쿼리하거나 업데이트하기 위해 이 IRP를 보냅니다. Windows XP 이상에서 WMI는 대신 IRP_MN_REGINFO_EX 요청을 보냅니다.

WMI는 시스템 스레드의 컨텍스트에서 IRQL = PASSIVE_LEVEL 이 IRP를 보냅니다.

입력 매개 변수

Parameters.WMI.ProviderId 는 요청에 응답해야 하는 드라이버의 디바이스 개체를 가리킵니다. 이 포인터는 IRP에서 드라이버의 I/O 스택 위치에 있습니다.

Parameters.WMI.DataPath는 등록 정보를 쿼리하거나 WMIUPDATE를 업데이트하기 위해 WMIREGISTER로 설정됩니다.

Parameters.WMI.BufferSizeParameters.WMI.Buffer에서 페이지가 없는 버퍼의 최대 크기를 나타냅니다. 크기는 (sizeof(WMIREGINFO) + (GuidCount * sizeof(WMIREGGUID)의 합계보다 크거나 같아야 합니다. 여기서 GuidCount는 드라이버에서 등록하는 데이터 블록 및 이벤트 블록의 수와 정적 instance 이름에 대한 공간(있는 경우)입니다.

출력 매개 변수

드라이버가 WmiSystemControl을 호출하여 WMI IRP를 처리하는 경우 WMI는 DpWmiQueryReginfo 루틴을 호출하여 드라이버의 데이터 블록에 대한 등록 정보를 가져옵니다.

그렇지 않으면 드라이버는 다음과 같이 Parameters.WMI.Buffer에서 WMIREGINFO 구조를 채웁니다.

  • BufferSizeWMIREGINFO 구조체의 크기(바이트)와 연결된 등록 데이터로 설정합니다.

  • 드라이버가 다른 드라이버를 대신하여 WMI 요청을 처리하는 경우 NextWmiRegInfo 를 이 WMIREGINFO 시작부터 다른 드라이버의 등록 정보를 포함하는 다른 WMIREGINFO 구조체의 시작 부분까지 오프셋(바이트)으로 설정합니다.

  • RegistryPath를 드라이버의 DriverEntry 루틴에 전달된 레지스트리 경로로 설정합니다.

  • Parameters.WMI.DatapathWMIREGISTER로 설정된 경우 MofResourceName을 이 WMIREGINFO의 시작 부분에서 오프셋으로 설정하여 이미지 파일에 드라이버의 MOF 리소스 이름을 포함하는 계산된 유니코드 문자열로 설정합니다.

  • GuidCount를 등록하거나 업데이트할 데이터 블록 및 이벤트 블록의 수로 설정합니다.

  • WmiRegGuid에서 드라이버가 노출하는 각 데이터 블록 또는 이벤트 블록에 하나씩 WMIREGGUID 구조체의 배열을 씁니다.

드라이버는 다음과 같이 각 WMIREGGUID 구조를 채웁니다.

  • Guid를 블록을 식별하는 GUID로 설정합니다.

  • instance 이름 및 블록의 다른 특성에 대한 정보를 제공하도록 플래그를 설정합니다. 예를 들어 블록이 정적 instance 이름으로 등록되는 경우 드라이버는 적절한 WMIREG_FLAG_INSTANCE_XXX 플래그로 플래그를 설정합니다.

블록이 정적 instance 이름으로 등록되는 경우 드라이버는 다음을 수행합니다.

  • InstanceCount를 인스턴스 수로 설정합니다.

  • 다음 멤버 중 하나를 블록의 정적 instance 이름 데이터로 오프셋(바이트)으로 설정합니다.

    • 드라이버가 WMIREG_FLAG_INSTANCE_LIST 플래그를 설정하는 경우 InstanceNameList를 정적 instance 이름 문자열 목록으로 오프셋으로 설정합니다. WMI는 이 목록에 대한 인덱스별 후속 요청의 인스턴스를 지정합니다.
    • 드라이버가 WMIREG_FLAG_INSTANCE_BASENAME 플래그를 설정하는 경우 BaseNameOffset 을 기본 이름 문자열로 오프셋으로 설정합니다. WMI는 이 문자열을 사용하여 블록에 대한 정적 instance 이름을 생성합니다.
    • 드라이버가 WMIREG_FLAG_INSTANCE_PDO 플래그를 설정하는 경우 Pdo 를 드라이버의 AddDevice 루틴에 전달된 PDO에 대한 포인터에 대한 오프셋으로 설정합니다. WMI는 PDO의 디바이스 instance 경로를 사용하여 블록에 대한 정적 instance 이름을 생성합니다.
  • instance 이름 문자열, 기본 이름 문자열 또는 PDO에 대한 포인터를 InstanceNameList, BaseName 또는 Pdo로 표시된 오프셋에 각각 씁니다.

드라이버가 다른 드라이버(예: 미니클래스 또는 미니포트 드라이버)를 대신하여 WMI 등록을 처리하는 경우 다른 WMIREGINFO 구조를 다른 드라이버의 등록 정보로 채우고 이전 구조의 NextWmiRegInfo 에 씁니다.

Parameters.WMI.Buffer의 버퍼가 너무 작아서 모든 데이터를 수신할 수 없는 경우 드라이버는 필요한 크기(바이트)를 Parameters.WMI.Buffer에 ULONG으로 쓰고 IRP에 실패하고 STATUS_BUFFER_TOO_SMALL 반환합니다.

I/O 상태 블록

드라이버가 WmiSystemControl을 호출하여 IRP를 처리하는 경우 WMI는 I/O 상태 블록에서 Irp-IoStatus.Status>Irp-IoStatus.Information>를 설정합니다.

그렇지 않으면 드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 또는 다음과 같은 적절한 오류 상태 설정합니다.

STATUS_BUFFER_TOO_SMALL

성공하면 드라이버는 Irp-IoStatus.Information>를 Parameters.WMI.Buffer 의 버퍼에 기록된 바이트 수 설정합니다.

작업

드라이버는 WMI 요청 처리에 설명된 대로 WmiSystemControl 을 호출하거나 IRP 자체를 처리 하여 WMI IRP를 처리할 수 있습니다.

드라이버가 WmiSystemControl을 호출하여 WMI IRP를 처리하는 경우 해당 루틴은 드라이버의 DpWmiQueryReginfo 루틴을 호출합니다.

드라이버가 IRP_MN_REGINFO 요청 자체를 처리하는 경우 Parameters.WMI.ProviderId 가 드라이버가 IoWMIRegistrationControl에 전달한 포인터와 동일한 디바이스 개체를 가리키는 경우에만 처리해야 합니다. 그렇지 않으면 드라이버는 다음 하위 드라이버에 요청을 전달해야 합니다.

요청을 처리하기 전에 드라이버는 Parameters.WMI.DataPath를 검사 WMI가 등록 정보(WMIREGISTER)를 쿼리하고 있는지 또는 업데이트(WMIUPDATE)를 요청하는지 확인해야 합니다.

WMI는 드라이버가 WMIREG_ACTION_REGISTER 또는 WMIREG_ACTION_REREGISTER 사용하여 IoWMIRegistrationControl 을 호출한 후 WMIREGISTER를 사용하여 이 IRP를 보냅니다. 이에 대한 응답으로 드라이버는 Parameters.WMI.Buffer 의 버퍼를 다음으로 채워야 합니다.

  • 드라이버의 레지스트리 경로, 해당 MOF 리소스의 이름 및 등록할 블록 수를 나타내는 WMIREGINFO 구조체입니다.

  • 등록할 각 블록에 대한하나의 WMIREGGUID 구조체입니다. 블록을 정적 instance 이름으로 등록하는 경우 드라이버는 해당 블록에 대한 WMIREGGUID 구조체에서 적절한 WMIREG_FLAG_INSTANCE_XXX 플래그를 설정합니다.

  • 모든 문자열 WMI는 정적 instance 이름을 생성해야 합니다.

WMI는 드라이버가 WMIREG_ACTION_UPDATE_GUIDS 사용하여 IoWmiRegistrationControl을 호출한 후 WMIUPDATE를 사용하여 이 IRP를 보냅니다. 이에 대한 응답으로 드라이버는 Parameters.WMI.Buffer 의 버퍼를 다음과 같이 WMIREGINFO 구조로 채워야 합니다.

  • 블록을 제거하기 위해 드라이버는 WMIREGGUID 구조에서 WMIREG_FLAG_REMOVE_GUID 설정합니다.

  • 블록을 추가하거나 업데이트하기 위해(예: 정적 instance 이름 변경) 드라이버는 WMIREG_FLAG_REMOVE_GUID 지우고 블록에 대한 새 등록 값 또는 업데이트된 등록 값을 제공합니다.

  • 정적 instance 이름으로 새 블록 또는 기존 블록을 등록하기 위해 드라이버는 적절한 WMIREG_FLAG_INSTANCE_XXX를 설정하고 WMI가 정적 instance 이름을 생성하는 데 필요한 모든 문자열을 제공합니다.

드라이버는 처음에 모든 블록을 등록하는 데 사용한 것처럼 동일한 WMIREGINFO 구조를 사용하여 블록을 제거, 추가 또는 업데이트할 수 있으며, 업데이트할 블록의 플래그와 데이터만 변경할 수 있습니다. 이러한 WMIREGINFO 구조체의 WMIREGGUID가 해당 블록을 처음 등록할 때 드라이버가 전달한 WMIREGGUID와 정확히 일치하는 경우 WMI는 블록 업데이트와 관련된 처리를 건너뜁니다.

WMI는 드라이버에서 추가 정보가 필요하지 않으므로 드라이버가 WMIREG_ACTION_DEREGISTER사용하여 IoWMIRegistrationControl 을 호출한 후에는 IRP_MN_REGINFO 요청을 보내지 않습니다. 드라이버는 일반적으로 IRP_MN_REMOVE_DEVICE 요청에 대한 응답으로 블록을 등록 취소합니다.

요구 사항

헤더

Wdm.h(Wdm.h, Ntddk.h 또는 Ntifs.h 포함)

추가 정보

DpWmiQueryReginfo

IoWMIRegistrationControl

WMILIB_CONTEXT

WMIREGGUID

WMIREGINFO

WmiSystemControl

IRP_MN_REGINFO_EX