Skip to content

Getting started

Installation

uv add ntcompress
pip install ntcompress

ESE quickstart

ESE cells carry the compression format in the header byte. Decompression auto-detects:

import ntcompress.ese as ese

plaintext = ese.decompress(cell)
size = ese.decompressed_size(cell)

Compression requires an explicit format:

cell = ese.compress(plaintext, ese.Format.XPRESS)
cell = ese.compress(plaintext, ese.Format.LZ4)
cell = ese.compress(plaintext, ese.Format.XPRESS9)

Or use a format module directly:

from ntcompress.ese import xpress

cell = xpress.compress(plaintext)
plaintext = xpress.decompress(cell)
size = xpress.decompressed_size(cell)

Read the format ID from a cell's header byte without decompressing:

fmt_id = ese.format_id(cell[0])    # 5-bit format ID (0--31)
flags = ese.format_flags(cell[0])  # 3-bit format-specific flags

ntdll quickstart

ntdll streams have no header. The caller must specify the format for both directions:

import ntcompress.ntdll as ntdll

compressed = ntdll.compress(data, ntdll.Format.LZNT1)
plaintext = ntdll.decompress(compressed, ntdll.Format.LZNT1)

Windows COMPRESSION_FORMAT_* constant aliases are available:

compressed = ntdll.compress(data, ntdll.COMPRESSION_FORMAT_XPRESS_HUFF)
plaintext = ntdll.decompress(compressed, ntdll.COMPRESSION_FORMAT_XPRESS_HUFF)

Or use a format module directly:

from ntcompress.ntdll import lznt1

compressed = lznt1.compress(data)
plaintext = lznt1.decompress(compressed)

Some ntdll formats accept additional parameters:

from ntcompress.ntdll import deflate
from ntcompress.ntdll import zlib as ntdll_zlib

# level controls compression effort (default 1 matches ntdll default engine)
compressed = deflate.compress(data, level=7)   # matches ntdll ENGINE_MAXIMUM
compressed = ntdll_zlib.compress(data, level=7)

# max_size limits decoded output
plaintext = deflate.decompress(compressed, max_size=65536)