IRP_MJ_PNP(FS 및 필터 드라이버)

보낸 경우

플러그 앤 플레이 관리자는 시스템에서 플러그 앤 플레이 작업이 발생할 때마다 IRP_MJ_PNP 요청을 보냅니다. 다른 운영 체제 구성 요소 및 기타 커널 모드 드라이버는 부 함수 코드에 따라 특정 IRP_MJ_PNP 요청을 보낼 수도 있습니다.

드라이버에 대한 플러그 앤 플레이 IRP 처리 요구 사항에 대한 자세한 내용은 플러그 앤 플레이 참조하세요.

IRP_MJ_PNP 부 함수 코드에 대한 참조 정보는 플러그 앤 플레이 부 IRP를 참조하세요.

작업: 파일 시스템 드라이버

파일 시스템은 요청된 작업을 확인하기 위해 부 함수 코드를 검사 합니다. 파일 시스템은 다음과 같은 부 함수 코드를 처리해야 합니다.

코드 Description
IRP_MN_CANCEL_REMOVE_DEVICE 이전 쿼리 제거 디바이스 요청이 취소되었음을 나타냅니다. 이 요청은 취소와 관련된 정리를 수행해야 하는 경우 파일 시스템에 경고하기 위해 전송됩니다.
IRP_MN_QUERY_REMOVE_DEVICE 디바이스를 제거하려고 했음을 나타냅니다. 파일 시스템이 디바이스에 탑재된 경우 PnP 관리자는 이 요청을 파일 시스템 및 파일 시스템 필터로 보냅니다. 디바이스에 대한 열린 핸들이 있는 경우 파일 시스템은 일반적으로 쿼리 제거 요청에 실패합니다. 그렇지 않은 경우 파일 시스템은 일반적으로 볼륨을 잠가 향후 만들기 요청이 성공하지 못하도록 합니다. 탑재된 파일 시스템이 쿼리 제거 요청을 지원하지 않는 경우 PnP 관리자는 디바이스에 대한 쿼리 제거 요청에 실패합니다.
IRP_MN_REMOVE_DEVICE 디바이스를 제거하려고 했음을 나타냅니다. 파일 시스템이 디바이스에 탑재된 경우 PnP 관리자는 이 IRP를 파일 시스템 및 파일 시스템 필터로 보냅니다. 파일 시스템은 이 IRP를 디바이스의 스토리지 드라이버에 즉시 전달하여 파일 시스템이 볼륨을 분리하는 완료 루틴을 설정해야 합니다.
IRP_MN_START_DEVICE 디바이스가 시작 중임을 나타냅니다. 파일 시스템은 이 IRP를 디바이스의 스토리지 드라이버에 전달해야 합니다.
IRP_MN_SURPRISE_REMOVAL 디바이스가 제거되었음을 나타냅니다. 파일 시스템이 디바이스에 탑재된 경우 PnP 관리자는 이 IRP를 파일 시스템 및 파일 시스템 필터로 보냅니다. 파일 시스템은 이 IRP를 디바이스의 스토리지 드라이버에 즉시 전달하여 파일 시스템이 볼륨을 분리하는 완료 루틴을 설정해야 합니다.

작업: 레거시 파일 시스템 필터 드라이버

파일 시스템 필터 드라이버는 다음 지침에 따라 PnP IRP를 처리해야 합니다.

  • 사용자가 볼륨을 정상적으로 제거하려고 하면 PnP 관리자가 IRP_MN_QUERY_REMOVE_DEVICE 요청을 보냅니다. 이 IRP를 수신할 때 필터는 볼륨의 열려 있는 모든 핸들을 닫고 IRP를 스택의 다음 하위 드라이버로 전달해야 합니다. 이 단계는 중요합니다. 드라이버가 열려 있는 모든 핸들을 닫지 못하면 볼륨이 분리되지 않습니다. 그러면 물리적 디바이스가 배출되지 않습니다.

    IRP_MN_QUERY_REMOVE_DEVICE 요청을 받으면 FAT 파일 시스템은 안전하게 제거할 수 있는 모든 볼륨을 즉시 분리합니다. 따라서 FAT 볼륨에 연결된 모든 필터는 필터의 완료 루틴이 호출되기 전에 해당 필터 디바이스 개체가 해제될 것으로 예상해야 합니다. NTFS 파일 시스템에서는 이 작업을 수행하지 않습니다. 따라서 NTFS 볼륨에 연결된 필터는 필터의 완료 루틴이 호출될 때 해당 디바이스 개체가 볼륨에 계속 연결될 것으로 예상할 수 있습니다.

  • IRP_MN_QUERY_REMOVE_DEVICE 요청 후에 수신되지만 IRP_MN_CANCEL_REMOVE_DEVICE 또는 IRP_MN_REMOVE_DEVICE 요청이 수신되기 전에 수신되는 IRP는 스토리지 디바이스 스택이 실패하도록 스택 아래로 안전하게 전달하거나, cancel-remove 또는 remove-device 요청이 수신될 때까지 큐에 보관할 수 있습니다.

  • 필터가 IRP_MN_QUERY_REMOVE_DEVICE 요청에 대한 응답으로 볼륨에 대해 열려 있는 모든 핸들을 이미 닫은 후 IRP_MN_CANCEL_REMOVE_DEVICE 요청을 받으면 핸들을 다시 열 수 있습니다. 그러나 필터는 IRP가 스택의 드라이버에 의해 성공적으로 완료된 후에만 이 작업을 완료 루틴에서 다시 열 수 있습니다.

  • 필터가 IRP_MN_REMOVE_DEVICE 요청을 수신하는 경우 IRP_MN_QUERY_REMOVE_DEVICE 요청을 받은 이후 큐에 IRP를 보관하지 않는 한 일반적으로 IRP에서 처리를 수행할 필요가 없습니다. 큐에 IRP가 있는 경우 필터는 볼륨에 대한 모든 IRP를 큐에서 제거하고 실패한 후 IRP 를 스택의 다음 하위 드라이버로 전달해야 합니다.

  • IRP_MN_SURPRISE_REMOVAL 요청을 수신할 때 필터는 다음 작업을 수행해야 합니다.

    • 파일 시스템에서 미해결 참조가 없을 때까지 스택을 클린 수 없으므로 열려 있는 모든 핸들을 볼륨에 닫습니다.

    • 필터가 큐에 IRP를 보관하는 경우 실패하거나 스토리지 디바이스 스택에 대한 스택을 전달하여 실패할 수 있습니다.

매개 변수

파일 시스템 또는 필터 드라이버는 지정된 IRP에 대해 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. 다음 매개 변수에서 IrpIRP 를 가리키고 IrpSpIO_STACK_LOCATION 가리킵니다. 드라이버는 IRP 및 IRP 스택 위치의 다음 멤버에 설정된 정보를 사용하여 플러그 앤 플레이 요청을 처리할 수 있습니다.

  • DeviceObject 는 대상 디바이스 개체에 대한 포인터입니다.

  • Irp->IoStatus는 최종 완료 상태 수신하는 IO_STATUS_BLOCK 구조와 요청된 작업에 대한 정보를 가리킵니다.

  • IrpSp->FileObject 는 PnP IRP에 대해 NULL 을 가리킵니다.

  • IrpSp->MajorFunction 은 IRP_MJ_PNP 설정됩니다.

  • IrpSp->MinorFunction 은 다음 값 중 하나로 설정됩니다.

    • IRP_MN_CANCEL_REMOVE_DEVICE
    • IRP_MN_QUERY_REMOVE_DEVICE
    • IRP_MN_REMOVE_DEVICE
    • IRP_MN_START_DEVICE
    • IRP_MN_SURPRISE_REMOVAL

추가 정보

IO_STACK_LOCATION

IO_STATUS_BLOCK

IoGetCurrentIrpStackLocation

IRP

IRP_MJ_PNP(WDK 커널 참조)

IRP_MN_CANCEL_REMOVE_DEVICE

IRP_MN_QUERY_REMOVE_DEVICE

IRP_MN_REMOVE_DEVICE

IRP_MN_START_DEVICE

IRP_MN_SURPRISE_REMOVAL