파일 스트림, 스트림 컨텍스트 및 Per-Stream 컨텍스트

참고

최적의 안정성과 성능을 위해 레거시 파일 시스템 필터 드라이버 대신 필터 관리자 지원과 함께 파일 시스템 미니필터 드라이버를 사용합니다. 레거시 드라이버를 미니필터 드라이버로 포팅하려면 레거시 필터 드라이버 포팅에 대한 지침을 참조하세요.

파일 스트림은 파일 데이터를 보유하는 데 사용되는 바이트 시퀀스입니다. 일반적으로 파일에는 하나의 파일 스트림 즉, 파일의 기본 데이터 스트림만 있습니다. 그러나 여러 데이터 스트림을 지원하는 파일 시스템에서는 각 파일에 여러 파일 스트림이 있을 수 있습니다. 이러한 스트림 중 하나는 명명되지 않은 기본 데이터 스트림입니다. 다른 이름은 대체 데이터 스트림입니다. 파일을 열면 실제로 지정된 파일의 스트림이 열립니다.

파일 시스템이 처음으로 파일 스트림을 열면 FCB(파일 제어 블록) 또는 SCB(스트림 제어 블록)와 같은 파일 시스템별 스트림 컨텍스트 구조를 만들고 이 구조체의 주소를 결과 파일 개체의 FsContext 멤버에 저장합니다.

로컬 파일 시스템의 경우 이미 열린 파일 스트림이 다시 열려 있는 경우(예: 공유 읽기 액세스의 경우) I/O 하위 시스템은 다른 파일 개체를 만들지만 파일 시스템은 새 스트림 컨텍스트를 만들지 않습니다. 두 파일 개체 모두 동일한 스트림 컨텍스트 구조의 주소를 받습니다. 따라서 로컬 파일 시스템의 경우 스트림 컨텍스트 포인터는 파일 스트림을 고유하게 식별합니다.

스트림별 컨텍스트를 지원하는 네트워크 파일 시스템의 경우 이미 열려 있는 파일 스트림이 동일한 네트워크 공유 이름 또는 IP 주소를 사용하여 다시 열리는 경우 로컬 파일 시스템의 동작은 로컬 파일 시스템과 동일합니다. I/O 하위 시스템은 새 파일 개체를 만들지만 파일 시스템은 새 스트림 컨텍스트를 만들지 않습니다. 대신 두 파일 개체에 동일한 FsContext 포인터 값을 할당합니다. 그러나 다른 경로(예: 다른 공유 이름 또는 이전에 공유 이름을 사용하여 연 파일의 IP 주소)를 사용하여 파일 스트림을 연 경우 파일 시스템은 새 스트림 컨텍스트를 만듭니다. 따라서 스트림별 컨텍스트를 지원하는 네트워크 파일 시스템의 경우 FsContext 포인터는 파일 스트림을 고유하게 식별하지 않습니다.

스트림당 컨텍스트는 해당 멤버 중 하나로 FSRTL_PER_STREAM_CONTEXT 구조를 포함하는 필터 정의 구조체입니다. 필터 드라이버는 이 구조를 사용하여 파일 시스템이 여는 각 파일 스트림에 대한 정보를 추적합니다.

Per-Stream 컨텍스트에 대한 파일 시스템 지원

Windows XP 이상에서는 스트림별 컨텍스트를 지원하는 파일 시스템에서 FSRTL_ADVANCED_FCB_HEADER 구조를 포함하는 스트림 컨텍스트 구조를 사용해야 합니다.

파일 시스템은 특정 파일 스트림과 연결된 스트림별 컨텍스트의 전역 목록을 소유합니다. 파일 시스템에서 파일 스트림에 대한 새 스트림 컨텍스트(FSRTL_ADVANCED_FCB_HEADER 개체)를 만들 때 FsRtlSetupAdvancedHeader 를 호출하여 이 목록을 초기화합니다. 레거시 파일 시스템 필터 드라이버가 FsRtlInsertPerStreamContext를 호출하면 필터에서 만든 스트림별 컨텍스트가 전역 목록에 추가됩니다.

파일 시스템에서 파일 스트림에 대한 스트림 컨텍스트를 삭제하면 FsRtlTeardownPerStreamContexts 를 호출하여 필터가 파일 스트림과 연결된 모든 스트림별 컨텍스트를 해제합니다. 이 루틴은 전역 목록의 각 스트림별 컨텍스트에 대해 FreeCallback 루틴을 호출합니다. FreeCallback 루틴은 파일 스트림의 파일 개체가 이미 해제되었다고 가정해야 합니다.

파일 시스템이 지정된 파일 개체가 나타내는 파일 스트림에 대한 스트림별 컨텍스트를 지원하는지 여부를 쿼리하려면 파일 개체에서 FsRtlSupportsPerStreamContexts 를 호출합니다. 파일 시스템은 일부 형식의 파일에 대해 스트림별 컨텍스트를 지원할 수 있지만 다른 형식은 지원하지 않을 수 있습니다. 예를 들어 NTFS 및 FAT는 현재 페이징 파일에 대한 스트림별 컨텍스트를 지원하지 않습니다. 따라서 FsRtlSupportsPerStreamContexts 가 하나의 파일 스트림에 대해 TRUE를 반환하는 경우 모든 파일 스트림에 대해 TRUE를 반환한다는 의미는 아닙니다.