BypassIO 작업 지원

Windows 11 모든 미니 필터는 BypassIO 작업에 대한 지원을 추가해야 합니다. BypassIO 작업은 다음을 사용하여 FltFsControlFile 또는 ZwFsControlFile 을 호출하여 요청됩니다.

  • FSCTL_MANAGE_BYPASS_IO 제어 코드입니다.
  • InputBuffer 매개 변수가 가리키는 FS_BPIO_INPUT 구조의 요청 관련 정보입니다.
  • 시스템에서 작업의 결과를 반환하는 OutputBuffer 매개 변수가 가리키는 호출자 할당 FS_BPIO_OUTPUT 구조체입니다.

이 페이지에서는 각 BypassIO 작업에 대한 세부 정보를 제공합니다. 작업 요청은 FS_BPIO_INPUTOperation 멤버에서 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_DISABLEFSCTL_MANAGE_BYPASS_IO 작업을 파일 시스템 스택의 맨 위로 보내야 합니다. 이 조건이 발생할 수 있는 경우의 예는 이 파일을 암호화하라는 요청을 받은 암호화 드라이버입니다.

드라이버가 FS_BPIO_OP_DISABLE 수신하지만 현재 BypassIO를 사용하도록 설정하지 않은 경우 요청을 무시해야 합니다. 현재 BypassIO를 사용하도록 설정하지 않은 파일에서 이 작업을 보내는 경우 무시해야 합니다.

이 작업은 실패하면 안 됩니다.

FS_BPIO_OP_QUERY 요청

이 요청은 사용자 또는 커널 모드에서 올 수 있습니다.

필터는 FS_BPIO_OP_ENABLE 작업과 유사한 FS_BPIO_OP_QUERY 요청을 처리해야 하며, FltVetoBypassIo 를 호출하여 적절한 매개 변수에 설명된 것과 동일한 진단 정보를 사용하여 적절하게 거부권을 행사해야 합니다. 주요 차이점은 드라이버가 쿼리 중에 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_ENABLEBPIO_OP_QUERY 요청을 거부해야 합니다.

FS_BPIO_OP_VOLUME_STACK_RESUME 요청

볼륨 스택 드라이버는 이 FSCTL 작업을 파일 시스템으로 보내 지정된 볼륨에서 BypassIO 처리를 다시 시작합니다. 드라이버가 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 호출 후 이전에 암호화된 파일이 더 이상 암호화되지 않는다고 말합니다. 그런 다음 필터는 해당 스트림에서 BypassIO를 다시 시작할 수 있도록 FS_BPIO_OP_STREAM_RESUME 작업을 보내야 합니다.

FS_BPIO_OP_GET_INFO 요청

이 요청은 사용자 또는 커널 모드에서 올 수 있습니다. 파일 시스템은 FS_BPIO_INFO 구조의 볼륨에 대한 BypassIO에 대한 정보를 반환합니다.