BypassIO 작업 지원
Windows 11부터 모든 미니 필터는 BypassIO 작업에 대한 지원을 추가해야 합니다. BypassIO 작업은 다음을 사용하여 FltFsControlFile 또는 ZwFsControlFile을 호출하여 요청됩니다.
- FSCTL_MANAGE_BYPASS_IO 제어 코드입니다.
- InputBuffer 매개 변수가 가리키는 FS_BPIO_INPUT 구조의 요청 관련 정보입니다 .
- 시스템이 작업 결과를 반환하는 OutputBuffer 매개 변수가 가리키는 호출자 할당 FS_BPIO_OUTPUT 구조체입니다.
이 페이지에서는 각 BypassIO 작업에 대한 세부 정보를 제공합니다. 작업 요청은 FS_BPIO_INPUT Operation 멤버에서 FS_BPIO_OPERATIONS 값으로 지정됩니다.
BypassIO에 대한 자세한 내용은 필터에 대한 BypassIO를 참조 하세요.
FS_BPIO_OP_ENABLE 요청
이 요청은 사용자 또는 커널 모드에서 올 수 있습니다. 캐시되지 않은 쓰기 에 대한 BypassIO는 현재 지원되지 않습니다.
FS_BPIO_OP_ENABLE 지정된 파일에 대해 시스템이 BypassIO를 사용하도록 요청합니다. 즉, 드라이버에 해당 파일에 대한 캐시되지 않은 읽기가 모두 표시되지 않을 수 있습니다.
BypassIO는 파일 열기별 개념입니다. 즉, FS_BPIO_OP_ENABLE 요청은 사용 요청과 연결된 파일 개체에만 영향을 미치며 동일한 파일 또는 스트림에서 열리는 다른 요청의 동작을 변경하지 않습니다. 동일한 파일 개체에 대해 여러 개의 사용 가능 요청이 전송되는 경우 첫 번째 요청만 의미가 있으며 모든 후속 요청은 무시됩니다.
드라이버의 사전 작업 콜백에서:
드라이버가 지정된 파일에 대해 BypassIO를 지원할 수 있는 경우 요청을 스택 아래로 전달해야 합니다.
드라이버가 지정된 파일에 대해 BypassIO를 지원할 수 없는 경우 다음 정보를 사용하여 FltVetoBypassIo를 호출해야 합니다.
- FltObjects 매개 변수가 가리키는 FLT_RELATED_OBJECTS 구조에 있는 드라이버의 이름입니다.
- OperationStatus 매개 변수에서 사용 요청을 거부하는 이유를 설명하는 NTSTATUS 오류 코드입니다.
- FailureReason 매개 변수에서 사용 요청을 거부한 이유에 대한 세부 정보가 포함된 고유한 설명 문자열입니다.
FltVetoBypassIo는 미니 필터가 FS_BPIO_OUTPUT 구조에서 사용 요청을 거부한 이유를 설명하는 드라이버 이름, 오류 코드 및 문자열을 작성하고 상태, 필터 제공 이유 및 필터의 이름을 사용하여 ETW 이벤트를 이벤트 로그에 씁니다.
FltVetoBypassIo가 성공하면 미니 필터가 STATUS_SUCCESS FSCTL_MANAGE_BYPASS_IO 완료해야 합니다. 그렇지 않으면 FltVetoBypassIo가 반환한 오류를 반환해야 합니다.
사후 작업 중에 드라이버는 아래의 모든 드라이버가 BypassIO를 지원할 수 있는지 여부를 확인할 수 있습니다. 그렇다면 드라이버는 파일에 필요한 상태를 유지하고 완료 처리를 계속해야 합니다. BypassIO 사용 상태와 호환되지 않을 수 있는 요청을 제대로 처리하기 위해 상태를 유지하는 것은 필터 및 파일 시스템의 책임입니다.
참고 항목
파일 시스템 스택의 모든 필터는 사전 작업 중에 BypassIO 사용 요청을 거부할 수 있지만 가능한 한 활성화된 상태로 유지하는 것이 좋습니다.
파일 시스템은 다음 유형의 파일에 대해 BypassIO 사용 요청을 자동으로 거부합니다.
- 디렉터리(디렉터리의 대체 데이터 스트림은 BypassIO를 사용할 수 있습니다.)
- 볼륨(DASD가 열립니다)
- NTFS 압축 파일
- NTFS로 암호화된 파일
- 스파스 파일
- 페이징 파일
- DAX 볼륨의 모든 파일
대부분의 필터는 BypassIO가 특정 스트림에서 사용하도록 설정된 상태를 유지할 필요가 없습니다. 대신 FsRtlGetBypassIoOpenCount를 호출 하여 이 정보를 쿼리할 수 있습니다.
FS_BPIO_OP_ENABLE 예제: 암호화 필터
암호화 필터가 파일에 대한 FS_BPIO_OP_ENABLE 작업을 수신하는 경우:
파일이 이미 암호화된 경우 필터는 FltVetoBypassIo를 호출하여 BypassIO 작업을 거부해야 하며, 적절한 상태와 다음과 같은 진단 메시지를 제공해야 합니다.
- OpStatus = STATUS_NOT_SUPPORTED_WITH_ENCRYPTION
- FailureReason = "암호화된 파일이 지원되지 않음"
파일이 현재 암호화되지 않은 경우 필터는 BypassIO를 허용해야 합니다. 이 파일을 암호화하기 위해 나중에 요청하면 필터에서 FS_BPIO_OP_STREAM_PAUSE 작업을 사용하여 BypassIO를 사용하지 않도록 설정할 수 있습니다.
FS_BPIO_OP_DISABLE 요청
이 요청은 사용자 또는 커널 모드에서 올 수 있습니다. 이를 통해 드라이버는 연결된 BypassIO 상태를 정리할 수 있습니다.
드라이버가 이전에 이 파일에서 BypassIO를 사용하도록 허용했고 이제 파일에 대한 BypassIO 지원을 해제해야 하는 경우 연결된 핸들을 사용하여 FS_BPIO_OP_DISABLE FSCTL_MANAGE_BYPASS_IO 작업을 파일 시스템 스택의 맨 위로 보내야 합니다. 이 조건이 발생할 수 있는 경우의 예는 이 파일을 암호화하라는 요청을 받은 암호화 드라이버입니다.
드라이버가 FS_BPIO_OP_DISABLE 수신하지만 현재 BypassIO를 사용하도록 설정하지 않은 경우 요청을 무시해야 합니다. 현재 BypassIO를 사용하도록 설정하지 않은 파일에서 이 작업을 보내는 경우 무시해야 합니다.
이 작업은 실패하면 안 됩니다.
FS_BPIO_OP_QUERY 요청
이 요청은 사용자 또는 커널 모드에서 올 수 있습니다.
필터는 FS_BPIO_OP_ENABLE 작업과 유사한 FS_BPIO_OP_QUERY 요청을 처리해야 하며, FltVetoBypassIo를 호출하여 적절한 매개 변수에 설명된 것과 동일한 진단 정보를 사용하여 적절하게 거부권을 행사해야 합니다. 주요 차이점은 드라이버가 QUERY 중에 BypassIO ENABLE 상태를 입력하지 않는다는 것입니다.
FS_BPIO_OP_QUERY 작업은 디렉터리 및 볼륨 핸들에서 보낼 수 있습니다(디렉터리 또는 볼륨 핸들에서는 FS_BPIO_OP_ENABLE 요청을 보낼 수 없습니다).
쿼리 예제: 암호화 필터
암호화 필터가 파일에 대한 FS_BPIO_OP_QUERY 작업을 수신하는 경우:
파일이 이미 암호화된 경우 필터는 FltVetoBypassIo를 호출하여 BypassIO 작업을 거부하여 다음과 같은 적절한 상태 및 진단 메시지를 제공해야 합니다.
- OpStatus = STATUS_NOT_SUPPORTED_WITH_ENCRYPTION
- FailureReason = "암호화된 파일이 지원되지 않음"
파일이 현재 암호화되지 않은 경우 필터는 쿼리 요청에 성공해야 합니다.
FS_BPIO_OP_VOLUME_STACK_PAUSE 요청
이 요청은 사용자 또는 커널 모드에서 올 수 있습니다.
볼륨 스택 드라이버가 이전에 볼륨에서 BypassIO를 사용하도록 허용하고 이제 BypassIO를 중지해야 하는 경우(예: 일부 외부 요청으로 인해) 드라이버는 볼륨 스택의 맨 위에 FS_BPIO_OP_VOLUME_STACK_PAUSE FSCTL_MANAGE_BYPASS_IO 작업을 전송하여 파일 시스템에 이 볼륨의 볼륨 및 스토리지 스택에서 BypassIO를 중지하도록 알려야 합니다. 파일 시스템은 이 볼륨에서 모든 활성 BypassIO 작업을 드레이닝한 다음 반환합니다. 볼륨 스택 드라이버는 외부 요청을 처리할 수 있습니다.
그러면 모든 활성 BypassIO 사용 파일이 스토리지 스택 수준 BypassIO 작업을 중지합니다. 이 작업 요청:
- 볼륨 핸들 또는 지정된 볼륨에 대한 파일 핸들에서 보낼 수 있습니다.
- 동일한 볼륨으로 여러 번 보낼 수 있습니다.
- 볼륨에 BypassIO 사용 파일이 없는 경우 보낼 수 있습니다.
BypassIO는 파일 시스템 스택에서 계속 작동합니다.
이 작업은 실패하면 안 됩니다.
볼륨 스택 일시 중지 예제
BitLocker 는 볼륨에서 암호화를 사용하도록 설정해야 하는 경우 이 작업을 사용하는 구성 요소의 예입니다.
또 다른 예는 다음 시나리오입니다. Volsnap에서 활성 볼륨 스냅샷이 없는 볼륨에서 BypassIO를 사용하도록 허용했다고 가정합니다. 나중에 볼륨 스냅샷을 만들도록 요청했습니다. Volsnap 은 계속하기 전에 다음 작업을 수행합니다.
- 시스템이 볼륨 스택에서 BypassIO를 사용하지 않도록 설정하도록 요청하는 FS_BPIO_OP_VOLUME_STACK_PAUSE 작업을 스택 맨 위로 보냅니다. 새 스냅샷을 만들 때마다 이 작업을 수행합니다. 반환이 성공하면 이제 BypassIO가 비활성화되고 지정된 볼륨에서 드레이닝됩니다.
- 스냅샷 만들기 요청을 처리합니다.
그런 다음 Volsnap은 이 볼륨에 대한 향후 모든 BPIO_OP_ENABLE 및 BPIO_OP_QUERY 요청을 거부해야 합니다.
FS_BPIO_OP_VOLUME_STACK_RESUME 요청
볼륨 스택 드라이버는 지정된 볼륨에서 BypassIO 처리를 다시 시작하기 위해 이 FSCTL 작업을 파일 시스템으로 보냅니다. 드라이버에서 FS_BPIO_OP_VOLUME_STACK_PAUSE 보내는 시나리오가 더 이상 활성화되지 않은 경우 이 작업을 보냅니다. BypassIO가 현재 사용하도록 설정되거나 일시 중지되지 않은 경우에도 이 작업을 보낼 수 있습니다.
이 요청은 사용자 또는 커널 모드에서 올 수 있습니다.
이 작업은 실패하면 안 됩니다.
볼륨 스택 다시 시작 예제
이전에 설명한 볼륨 스택 일시 중지 시나리오를 사용하여 볼륨에 더 이상 활성 스냅샷이 없다고 가정합니다. Volsnap은 마지막 스냅샷이 제거된 후에만 FS_BPIO_OP_VOLUME_STACK_RESUME 보냅니다.
FS_BPIO_OP_STREAM_PAUSE 요청
필터는 스트림에서 BypassIO를 일시 중지하는 FS_BPIO_OP_STREAM_PAUSE 작업을 보낼 수 있습니다. 이 요청은 사용자 또는 커널 모드에서 올 수 있습니다. 모든 활성 BypassIO 사용 파일은 BypassIO 작업을 중지합니다.
특히 이전에 스트림에서 BypassIO를 사용하도록 허용한 후 나중에 파일 또는 디렉터리 암호화 요청과 같은 외부 요청으로 인해 BypassIO를 중지해야 하는 필터의 경우 필터 스택 아래로 FS_BPIO_OP_STREAM_PAUSE 보내 지정된 스트림에서 BypassIO를 중지하도록 파일 시스템에 지시할 수 있습니다. 필터는 이 작업을 스택의 맨 위로 보내면 안 됩니다.
파일 시스템이 반환되기 전에 스트림에서 열려 있는 모든 BypassIO 핸들을 일시 중지하고 스트림에 대한 모든 활성 BypassIO 작업을 완료합니다. 이러한 작업을 수행하면 반환할 때 필터가 수행해야 하는 파일 작업을 수행할 수 있습니다.
이 작업은 동일한 스트림에 여러 번 보낼 수 있습니다. 파일 시스템은 현재 BypassIO를 사용하도록 설정되지 않은 스트림에서 전송된 경우 이를 무시합니다.
필터가 스트림 일시 중지 작업을 수행하는 경우 BypassIO는 볼륨 및 스토리지 스택에서 계속됩니다.
이 작업은 실패하면 안 됩니다.
스트림 일시 중지 예제: 암호화 필터
암호화 필터를 사용하면 암호화되지 않은 스트림에서 BypassIO를 사용하도록 설정할 수 있었지만 나중에 이 스트림을 암호화하라는 요청을 받았다고 가정해 보겠습니다.
암호화 필터가 진행되기 전에 FsRtlGetBypassIoOpenCount를 호출하여 BypassIO가 이 스트림에서 활성 상태인지 여부를 확인해야 합니다. 그렇다면 암호화 필터는 시스템에서 BypassIO를 사용하지 않도록 설정하는 FS_BPIO_OP_STREAM_PAUSE 작업을 보냅니다. 반환이 성공하면 BypassIO가 비활성화되고 드레이닝되므로 필터가 암호화 요청을 안전하게 수행할 수 있습니다. 가능한 경합 조건을 제거하려면 필터가 향후 모든 FS_BPIO_OP_ENABLE 거부하고 현재 암호화된 스트림에 대한 요청을 FS_BPIO_OP_QUERY 합니다.
FS_BPIO_OP_STREAM_RESUME 요청
필터가 FS_BPIO_OP_STREAM_PAUSE 작업을 보내도록 한 시나리오가 더 이상 없으면 필터는 파일 시스템에 FS_BPIO_OP_STREAM_RESUME 작업을 전송하여 지정된 스트림의 BypassIO 처리를 다시 시작합니다. 이 요청은 사용자 또는 커널 모드에서 올 수 있습니다.
BypassIO가 현재 사용하도록 설정되거나 일시 중지되지 않은 경우 이 작업이 전송되면 무시됩니다.
일시 중지 및 다시 시작은 참조 계산되지 않습니다. 대신 다시 시작 시 파일 시스템은 파일 시스템 스택의 맨 위에 FS_BPIO_OP_QUERY 요청을 실행하여 나머지 필터가 여전히 차단되고 있는지 확인합니다. 파일 시스템은 스택의 모든 필터가 BypassIO를 차단하지 않는 경우에만 BypassIO를 다시 시작합니다.
이 작업은 실패하면 안 됩니다.
스트림 다시 시작 예제: 암호화 필터
앞에서 설명한 FS_BPIO_OP_STREAM_PAUSE 시나리오를 사용하면 FS_BPIO_OP_STREAM_PAUSE 호출 후 이전에 암호화된 파일이 더 이상 암호화되지 않는다고 가정합니다. 그런 다음 필터는 FS_BPIO_OP_STREAM_RESUME 작업을 전송하여 BypassIO가 해당 스트림에서 다시 시작할 수 있도록 해야 합니다.
FS_BPIO_OP_GET_INFO 요청
이 요청은 사용자 또는 커널 모드에서 올 수 있습니다. 파일 시스템은 FS_BPIO_INFO 구조의 볼륨에 대한 BypassIO에 대한 정보를 반환합니다.