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