다음을 통해 공유


IRP_MN_DEVICE_USAGE_NOTIFICATION

시스템 구성 요소는 이 IRP를 보내 디바이스가 특수 파일을 지원할 수 있는지 여부를 드라이버에 요청합니다. 특수 파일에는 페이징 파일, 덤프 파일 및 최대 절전 모드 파일이 포함됩니다. 디바이스의 모든 드라이버가 IRP에 성공하면 시스템에서 특수 파일을 만듭니다. 또한 시스템은 이 IRP를 전송하여 드라이버에 디바이스에서 특수 파일이 제거되었음을 알릴 수 있습니다.

디바이스에 페이징 파일, 덤프 파일 또는 최대 절전 모드 파일이 포함될 수 있는 경우 함수 드라이버는 이 IRP를 처리해야 합니다. 필터링하는 함수 드라이버가 IRP를 처리하는 경우 필터 드라이버는 이 IRP를 처리해야 합니다. 버스 드라이버는 어댑터 또는 컨트롤러(버스 FDO) 및 자식 디바이스(자식 PDO)에 대해 이 IRP를 처리해야 합니다.

0x16

주 코드

IRP_MJ_PNP

보낸 경우

시스템에서 페이징 파일, 덤프 파일 또는 최대 절전 모드 파일을 만들거나 삭제할 때 이 IRP를 보냅니다. 디바이스에 기존 부모-자식 관계를 벗어나는 전원 관리 관계가 있는 경우 드라이버는 이 IRP를 보내 디바이스 사용 정보를 다른 디바이스 스택으로 전파할 수 있습니다. 자세한 내용은 IRP_MN_QUERY_DEVICE_RELATIONSPowerRelations 요청에 대한 설명을 참조하세요.

시스템 구성 요소 및 드라이버는 임의 스레드 컨텍스트에서 IRQL PASSIVE_LEVEL 이 IRP를 보냅니다.

입력 매개 변수

IO_STACK_LOCATION 구조체의 Parameters.UsageNotification.InPath 멤버는 BOOLEAN입니다. 이 매개 변수가 TRUE이면 시스템에서 디바이스에 페이징, 크래시 덤프 또는 최대 절전 모드 파일을 만듭니다. InPathFALSE이면 이러한 파일이 디바이스에서 제거됩니다.

Parameters.UsageNotification.Type 은 파일 종류를 나타내는 열거형입니다. 이 매개 변수에는 DeviceUsageTypePaging, DeviceUsageTypeDumpFile 또는 DeviceUsageTypeHibernation 값 중 하나가 있습니다.

출력 매개 변수

없음

I/O 상태 블록

드라이버는 Irp-IoStatus.Status>를 STATUS_SUCCESS 또는 적절한 오류 상태 설정합니다.

드라이버는 Irp-IoStatus.Information> 필드를 수정하지 않습니다. IRP를 보내는 구성 요소에서 설정한 대로 0으로 유지됩니다.

작업

드라이버는 IRP의 디바이스 스택 아래로 그리고 IRP의 방법으로 스택을 백업할 때 이 IRP를 처리합니다.

드라이버는 다음과 같은 프로시저를 사용하여 이 IRP에 응답합니다.

  • Parameters.UsageNotification.InPathTRUE이면 디바이스가 특수 파일을 지원하는지 여부를 확인합니다.

    드라이버는 드라이버가 지원할 수 있는 특정 Parameters.UsageNotification.Type을 테스트해야 합니다. 나중에 추가 알림 유형이 추가될 수 있습니다.

    각 알림 유형을 지원하는 데 필요한 작업을 설명하는 아래 추가 정보를 참조하세요.

    Parameters.UsageNotification.InPathTRUE이고 드라이버가 디바이스에서 특수 파일을 지원할 수 없는 경우 드라이버는 오류 상태 IRP를 완료해야 합니다.

  • 디바이스가 특수 파일을 지원하는 경우:

    1. 디바이스에 이제 특수 파일이 포함되거나 더 이상 포함되지 않음을 반영하기 위해 적절한 조치를 취합니다.

      일반적으로 드라이버는 카운터를 증가 또는 감소합니다. 예를 들어 Parameters.UsageNotification.TypeDeviceUsageTypePaging 이고 Parameters.UsageNotification.InPathTRUE인 경우 디바이스의 페이징 파일 수를 증분합니다. 특정 드라이버 디스패치 루틴은 카운터를 검사 합니다.

      특수 파일이 포함된 디바이스는 사용하지 않도록 설정하면 안 됩니다. 드라이버는 IoInvalidateDeviceState를 호출하여 PnP 관리자에게 디바이스의 PnP 디바이스 상태 정보를 다시 쿼리하도록 요청할 수 있습니다. 결과 IRP_MN_QUERY_PNP_DEVICE_STATE IRP에 대한 응답으로 드라이버는 PNP_DEVICE_NOT_DISABLEABLE 플래그를 설정해야 합니다.

      InPathFALSE이면 드라이버는 디바이스의 디바이스 개체에서 DO_POWER_PAGABLE 비트를 설정합니다.

    2. 정보가 필요한 모든 관련 디바이스에 디바이스 사용량 정보를 전파합니다.

      IRP_MN_DEVICE_USAGE_NOTIFICATION IRP 처리의 일부로, 하나 이상의 다른 디바이스 스택에 정보를 전달하기 위해 드라이버가 필요할 수 있습니다. 이러한 드라이버는 새 IRP_MN_DEVICE_USAGE_NOTIFICATION IRP(또는 IRP)를 만들고 적절한 디바이스 스택(또는 스택)으로 보냅니다. 드라이버는 드라이버가 받은 디바이스 사용량 IRP 처리를 완료하기 전에 전송하는 모든 디바이스 사용 알림 IRP가 완료될 때까지 기다려야 합니다.

      관련 디바이스를 식별하는 방법은 디바이스 및 드라이버에 따라 다릅니다. 일반적으로 드라이버는 파일에 대한 I/O 요청을 보낼 다른 드라이버에 IRP를 보냅니다. 버스 드라이버가 자식 디바이스에 대해 이 요청을 처리하는 경우 디바이스의 부모에 대한 디바이스 스택에 사용 알림 IRP를 보내야 합니다.

      예를 들어 ftdisk가 5개 디스크 스트라이프 집합을 실행하는 경우 이러한 각 디바이스가 페이징 파일 작업을 처리해야 할 수 있으므로 이러한 5개 디스크 각각에 페이징 알림을 전파합니다.

    3. 함수 또는 필터 드라이버에서 IoCompletion 루틴을 설정합니다.

    4. 함수 또는 필터 드라이버에서 Irp-IoStatus.Status>를 STATUS_SUCCESS 설정하고, 다음 스택 위치를 설정하고, IRP를 IoCallDriver를 사용하여 다음 하위 드라이버에 전달합니다. IRP를 완료하지 마세요.

      자식 PDO에 대한 IRP를 처리하는 버스 드라이버에서 Irp-IoStatus.Status>를 설정하고 IRP(IoCompleteRequest)를 완료합니다.

    5. IRP 완료 처리 중:

      IoCompletion 루틴에서 하위 드라이버가 IRP에 실패했음을 감지하는 경우 함수 또는 필터 드라이버는 IRP에 대한 응답으로 수행된 모든 작업을 실행 취소하고 오류를 전파해야 합니다. 함수 또는 필터 드라이버가 사용량 정보를 다른 디바이스 스택으로 전파한 경우 드라이버는 다른 사용량 IRP를 해당 스택에 전송하여 오류를 알려야 합니다.

      상태 STATUS_SUCCESS InPath가 TRUE이면 DO_POWER_PAGABLE 비트를 지웁 수 있습니다.

플러그 앤 플레이 사소한 IRP를 처리하기 위한 일반 규칙은 플러그 앤 플레이 참조하세요.

디바이스에서 페이징, 크래시 덤프 및 최대 절전 모드 파일 지원

드라이버의 특수 파일 수가 0이 아닌 경우 드라이버는 디바이스(또는 하위 디바이스)에 특수 파일이 있는지를 지원해야 합니다.

디바이스에서 만든 DeviceUsageTypePaging 파일의 경우 드라이버는 다음을 수행해야 합니다.

디바이스의 DeviceUsageTypeDumpFile 파일의 경우 드라이버는 다음을 수행해야 합니다.

  • DispatchRead, DispatchWrite, DispatchDeviceControl 및 DispatchPower 루틴에 대한 메모리에 코드를 잠니다.

  • 디바이스를 D0 상태에서 벗어나지 마세요.

    유휴 검색을 위해 디바이스를 등록하지 마세요(PoRegisterDeviceForIdleDetection). 디바이스가 이미 등록된 경우 등록을 취소합니다. 드라이버가 디바이스에 대해 자체 유휴 검색을 수행하는 경우 해당 검색을 일시 중단합니다.

  • 디바이스에 대한 디바이스 개체의 DO_POWER_PAGABLE 비트를 지웁니다(IRP가 디바이스 스택 위로 올라가면).

  • 디바이스 에 대한 IRP_MN_QUERY_STOP_DEVICEIRP_MN_QUERY_REMOVE_DEVICE 요청에 실패합니다.

디바이스의 DeviceUsageTypeHibernation 파일의 경우 드라이버는 다음을 수행해야 합니다.

  • DispatchRead, DispatchWrite, DispatchDeviceControl 및 DispatchPower 루틴에 대한 메모리에 코드를 잠니다.

  • 드라이버가 시스템이 최대 절전 모드로 전환될 것임을 나타내는 S4 시스템 전원 IRP를 수신할 때 디바이스가 D0 상태인지 확인합니다.

  • S4 최대 절전 모드 작업의 일부인 D3 설정 전원 IRP에 대한 응답으로 디바이스의 전원을 낮추지 마세요. 자세한 내용은 시스템 전원 작업을 참조하세요.

    이러한 D3 설정 전원 IRP를 받으면 디바이스 전원을 끄고 전원 관리자(PoSetPowerState)에 알리는 것을 제외하고 디바이스를 D3 상태로 설정하는 데 필요한 모든 작업을 수행합니다. 디바이스는 최대 절전 모드 파일이 기록될 때까지 전원을 유지해야 합니다.

  • 디바이스에 대한 디바이스 개체의 DO_POWER_PAGABLE 비트를 지웁니다(IRP가 디바이스 스택 위로 올라가면).

  • 디바이스 에 대한 IRP_MN_QUERY_STOP_DEVICEIRP_MN_QUERY_REMOVE_DEVICE 요청에 실패합니다.

디바이스 전원 상태, 전원 IRP 및 드라이버의 전원 관리 지원에 대한 자세한 내용은 전원 관리를 참조하세요 .

이 IRP 보내기

드라이버는 IRP_MN_DEVICE_USAGE_INFORMATION IRP를 보낼 수 있지만 디바이스 사용량 정보를 다른 디바이스 스택으로 전파하기만 하면 됩니다. 드라이버는 디바이스 사용 정보의 초기 원본이 되지 않습니다.

요구 사항

헤더

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

추가 정보

DispatchDeviceControl

DispatchPower

DispatchRead

DispatchWrite

IoAdjustPagingPathCount

IoCallDriver

IoCompleteRequest

IO_STACK_LOCATION

IRP_MJ_PNP

IRP_MN_QUERY_DEVICE_RELATIONS

IRP_MN_QUERY_PNP_DEVICE_STATE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_QUERY_STOP_DEVICE

PoRegisterDeviceForIdleDetection

PoSetPowerState