IRP_MJ_PNP(IFS)
보낸 경우
플러그 앤 플레이 관리자는 시스템에서 플러그 앤 플레이 작업이 발생할 때마다 IRP_MJ_PNP 요청을 보냅니다. 다른 운영 체제 구성 요소뿐만 아니라 다른 커널 모드 드라이버도 부 함수 코드에 따라 특정 IRP_MJ_PNP 요청을 보낼 수 있습니다.
드라이버에 대한 플러그 앤 플레이 IRP 처리 요구 사항에 대한 자세한 내용은 플러그 앤 플레이 참조하세요.
IRP_MJ_PNP 부 함수 코드에 대한 참조 정보는 플러그 앤 플레이 부 IRP를 참조하세요.
작업: 파일 시스템 드라이버
파일 시스템은 부 함수 코드를 확인하여 요청된 작업을 결정해야 합니다. 파일 시스템은 다음과 같은 부 함수 코드를 처리해야 합니다.
| 용어 | 설명 |
|---|---|
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는 스택 아래로 안전하게 전달되거나(스토리지 디바이스 스택에 의해 실패) 취소 제거 또는 제거 디바이스 요청이 수신될 때까지 큐에 보관할 수 있습니다.
필터가 IRP_MN_QUERY_REMOVE_DEVICE 요청에 대한 응답으로 볼륨에 대한 열려 있는 모든 핸들을 이미 닫은 후 IRP_MN_CANCEL_REMOVE_DEVICE 요청을 수신하는 경우 핸들을 다시 열 수 있습니다. 그러나 필터는 IRP가 스택 아래의 드라이버에 의해 성공적으로 완료된 후에만 완료 루틴에서 이 작업을 수행할 수 있습니다.
필터가 IRP_MN_REMOVE_DEVICE 요청을 수신하는 경우 IRP_MN_QUERY_REMOVE_DEVICE 요청을 받은 이후 큐에 IRP를 보관하지 않는 한 일반적으로 IRP에서 처리를 수행할 필요가 없습니다. 큐에 IRP를 보관하는 경우 필터는 IRP를 스택의 다음 하위 드라이버로 전달하기 전에 볼륨 및 <ifail></i>에 대한 모든 IRP를 큐에서 제거해야 합니다.
IRP_MN_SURPRISE_REMOVAL 요청을 받으면 필터는 다음을 수행해야 합니다.
파일 시스템에서 미해결 참조가 없을 때까지 스택을 정리할 수 없으므로 열려 있는 모든 핸들을 볼륨에 닫습니다.
필터가 큐에 IRP를 보관하는 경우 실패하거나 스택 아래로 전달할 수 있습니다(스토리지 디바이스 스택에 의해 실패).
매개 변수
파일 시스템 또는 필터 드라이버는 지정된 IRP를 사용하여 IoGetCurrentIrpStackLocation 을 호출하여 IRP의 자체 스택 위치에 대한 포인터를 가져옵니다. 이 포인터는 다음 목록에 IrpSp로 표시됩니다. (IRP는 Irp로 표시됩니다.) 드라이버는 IRP의 다음 멤버 및 IRP 스택 위치에 설정된 정보를 사용하여 플러그 앤 플레이 요청을 처리할 수 있습니다.
DeviceObject
대상 디바이스 개체에 대한 포인터입니다.
Irp-IoStatus>
요청된 작업에 대한 최종 완료 상태 및 정보를 수신하는 IO_STATUS_BLOCK 구조체에 대한 포인터입니다.
IrpSp-FileObject>
이 포인터는 PnP IRP의 경우 NULL 이어야 합니다.
IrpSp-MajorFunction>
IRP_MJ_PNP 지정합니다.
- IRP_MN_CANCEL_REMOVE_DEVICE
- IRP_MN_QUERY_REMOVE_DEVICE
- IRP_MN_REMOVE_DEVICE
- IRP_MN_START_DEVICE
- IRP_MN_SURPRISE_REMOVAL