Функция 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

Размер в байтах буфера сжатойBuffer.

[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 (include Fltkernel.h, Ntifs.h)
библиотеки NtosKrnl.lib
DLL NtosKrnl.exe
IRQL <= APC_LEVEL

См. также

FILE_COMPRESSION_INFORMATION

RtlDecompressBuffer

RtlDecompressFragment

RtlGetCompressionWorkSpaceSize