Функция RtlCompressBuffer (ntifs.h)

Функция RtlCompressBuffer сжимает буфер и может использоваться драйвером файловой системы для упрощения реализации сжатия файлов.

Синтаксис

NT_RTL_COMPRESS_API NTSTATUS RtlCompressBuffer(
  [in]  USHORT CompressionFormatAndEngine,
  [in]  PUCHAR UncompressedBuffer,
  [in]  ULONG  UncompressedBufferSize,
  [out] PUCHAR CompressedBuffer,
  [in]  ULONG  CompressedBufferSize,
  [in]  ULONG  UncompressedChunkSize,
  [out] PULONG FinalCompressedSize,
  [in]  PVOID  WorkSpace
);

Параметры

[in] CompressionFormatAndEngine

Битовая маска, указывающая формат сжатия и тип подсистемы. Для этого параметра необходимо задать допустимое побитовое или сочетание одного типа формата и одного типа подсистемы. Например, COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_STANDARD.

Значения этих и других связанных значений приведены ниже.

Значение Значение
COMPRESSION_FORMAT_NONE Эта функция не поддерживается.
COMPRESSION_FORMAT_DEFAULT Эта функция не поддерживается.
COMPRESSION_FORMAT_LZNT1 Функция будет выполнять сжатие LZ.
COMPRESSION_FORMAT_XPRESS Функция будет выполнять сжатие Xpress.
COMPRESSION_FORMAT_XPRESS_HUFF Функция выполнит сжатие Xpress Huffman.
COMPRESSION_ENGINE_STANDARD Буфер UncompressedBuffer сжимается с помощью алгоритма, который обеспечивает баланс между сжатием данных и производительностью. Это значение нельзя использовать с COMPRESSION_ENGINE_MAXIMUM.
COMPRESSION_ENGINE_MAXIMUM Буфер UncompressedBuffer сжимается с помощью алгоритма, который обеспечивает максимальное сжатие данных, но с относительно низкой производительностью. Это значение нельзя использовать с COMPRESSION_ENGINE_STANDARD.
COMPRESSION_ENGINE_HIBER Эта функция не поддерживается.

[in] UncompressedBuffer

Указатель на буфер, выделенный вызывающим объектом (выделенный из страничного или нестраничного пула), содержащий данные для сжатия. Этот параметр является обязательным и не может иметь значение NULL.

[in] UncompressedBufferSize

Размер буфера UncompressedBuffer (в байтах).

[out] CompressedBuffer

Указатель на буфер, выделенный вызывающим объектом (выделенный из страничного или нестраничного пула), который получает сжатые данные. Этот параметр является обязательным и не может иметь значение NULL.

[in] CompressedBufferSize

Размер буфера CompressedBuffer (в байтах).

[in] UncompressedChunkSize

Размер блока, используемый при сжатии буфера UncompressedBuffer . Этот параметр должен иметь одно из следующих значений: 512, 1024, 2048 или 4096. Операционная система использует 4096, а рекомендуемое значение для этого параметра — 4096.

[out] FinalCompressedSize

Указатель на переменную, выделенную вызывающим объектом, которая получает размер сжатых данных в байтах, хранящихся в CompressedBuffer. Этот параметр является обязательным и не может иметь значение NULL.

[in] WorkSpace

Указатель на буфер рабочего пространства, выделенный вызывающим объектом, используемый функцией RtlCompressBuffer во время сжатия. Используйте функцию RtlGetCompressionWorkSpaceSize , чтобы определить правильный размер буфера рабочего пространства.

Возвращаемое значение

RtlCompressBuffer возвращает соответствующее значение состояния ошибки, например одно из следующих значений.

Код возврата Описание
STATUS_SUCCESS Буфер UncompressedBuffer успешно сжат.
STATUS_BUFFER_ALL_ZEROS Буфер UncompressedBuffer успешно сжат, но этот буфер содержит только нули.
STATUS_INVALID_PARAMETER Недопустимый формат сжатия был указан с помощью параметра CompressionFormat . Если значение CompressionFormat равно COMPRESSION_FORMAT_NONE или COMPRESSION_FORMAT_DEFAULT (но не одновременно), возвращается это значение.
STATUS_UNSUPPORTED_COMPRESSION Недопустимый формат сжатия был указан с помощью параметра CompressionFormat . Если CompressionFormat не является одним из следующих значений, возвращается STATUS_UNSUPPORTED_COMPRESSION: COMPRESSION_FORMAT_LZNT1, COMPRESSION_FORMAT_XPRESS COMPRESSION_FORMAT_XPRESS_HUFF
STATUS_NOT_SUPPORTED Недопустимая подсистема сжатия была указана с помощью параметра CompressionFormatAndEngine . Если значение CompressionFormatAndEngine не COMPRESSION_ENGINE_STANDARD или COMPRESSION_ENGINE_MAXIMUM (но не оба), возвращается это значение.
STATUS_BUFFER_TOO_SMALL Сжатый буфер слишком мал для хранения сжатых данных. То есть Значение FinalCompressedSize больше, чем CompressedBufferSize.

Комментарии

Функция RtlCompressBuffer принимает в качестве входных данных несжатый буфер и создает его сжатый эквивалент при условии, что сжатые данные помещаются в указанный буфер назначения.

Чтобы определить правильный размер буфера для параметра WorkSpace , используйте функцию RtlGetCompressionWorkSpaceSize .

Чтобы распаковать сжатый буфер, используйте функцию RtlDecompressBuffer .

Чтобы извлечь несжатый фрагмент из сжатого буфера, используйте функцию RtlDecompressFragment .

Требования

Требование Значение
Минимальная версия клиента Windows XP
Целевая платформа Универсальное
Верхняя часть ntifs.h (включая Fltkernel.h, Ntifs.h)
Библиотека NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

См. также раздел

FILE_COMPRESSION_INFORMATION

RtlDecompressBuffer

RtlDecompressFragment

RtlGetCompressionWorkSpaceSize