Поделиться через


Потоки файлов, контексты потоков и контексты Per-Stream

Примечание

Для оптимальной надежности и производительности используйте драйверы минифильтров файловой системы с поддержкой диспетчера фильтров вместо устаревших драйверов фильтров файловой системы. Сведения о переносе устаревшего драйвера в драйвер минифильтра см. в статье Рекомендации по переносу устаревших драйверов фильтров.

Файловый поток — это последовательность байтов, используемая для хранения файловых данных. Обычно файл имеет только один файловый поток, а именно поток данных файла по умолчанию. Однако в файловых системах, которые поддерживают несколько потоков данных, каждый файл может иметь несколько файловых потоков. Одним из этих потоков является поток данных по умолчанию, который не называется. Другие называются альтернативными потоками данных. При открытии файла фактически открывается поток заданного файла.

Когда файловая система открывает файловый поток в первый раз, она создает структуру контекста потока для конкретной файловой системы, например блок управления файлами (FCB) или блок управления потоком (SCB), и сохраняет адрес этой структуры в элементе FsContext результирующего файлового объекта.

Для локальных файловой системы, если уже открытый файловый поток открывается снова (например, для общего доступа на чтение), подсистема ввода-вывода создает другой файловый объект, но файловая система не создает новый контекст потока. Оба файловых объекта получают адрес одной структуры контекста потока. Таким образом, для локальных файловых систем указатель контекста потока однозначно идентифицирует файловый поток.

Для сетевых файловых систем, поддерживающих контексты каждого потока, поведение будет таким же, как и для локальных файловых систем, если уже открытый файловый поток снова открывается с использованием того же имени или IP-адреса общей сетевой папки. Подсистема ввода-вывода создает новый объект файла, но файловая система не создает новый контекст потока. Вместо этого он назначает одно и то же значение указателя 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 для объекта file. Файловая система может поддерживать контексты потока для некоторых типов файлов, но не для других. Например, NTFS и FAT в настоящее время не поддерживают контексты потока для файлов подкачки. Таким образом, если FsRtlSupportsPerStreamContexts возвращает значение TRUE для одного потока файлов, это не означает, что он возвращает значение TRUE для всех потоков файлов.