Skip to main content

ntcompress

CI PyPI Python 3.10+ License: Apache 2.0 Docs

Pure-Python, standard-library-only implementations of every compression format used by Microsoft's Extensible Storage Engine (ESE/ESENT, the "JET Blue" engine behind NTDS.dit, Exchange stores, Windows.edb, SRUDB.dat, and WebCacheV01.dat) and Windows ntdll.dll compression (RtlCompressBuffer / RtlDecompressBuffer). No runtime dependencies beyond the standard library.

Scope

This library covers two distinct compression layers used by Windows:

ESE record compression (vs esent.dll)

ESE stores a one-byte header on each compressed record cell; the top 5 bits select the scheme (first_byte >> 3) and the low 3 bits carry scheme-specific flags.

ESE ID Format Decompress Compress Byte-Identical to esent.dll Authority
0x0 NONE (uncompressed sentinel) compression.cxx:504
0x1 7-bit ASCII yes yes yes ESE source
0x2 7-bit Unicode yes yes yes ESE source
0x3 XPRESS (Plain LZ77) yes yes yes [MS-XCA] §2.3/2.4
0x4 SCRUB (erase marker) produce recognize n/a ESE source
0x5 XPRESS9 yes yes yes* ESE MIT source (ported)
0x6 XPRESS10 (LZ4 + CRC) yes yes yes** ESE source
0x7 LZ4 (standard block) yes yes yes LZ4 block format

*XPRESS9 encoder matches the MIT ESE C reference byte-for-byte excluding the non-deterministic session signature (CRC32(__rdtsc())), which even esent.dll varies on every call. **XPRESS10 verified byte-identical by component construction (LZ4 block + CRC-32C + CRC-64/NVME each individually proven); not triggerable on commodity hardware (requires Corsica/QAT flight flag).

ntdll compression (vs RtlCompressBuffer)

Windows ntdll.dll exposes a separate set of CompressionFormatAndEngine IDs used by SMB, NTFS, RDP, and other protocols. These use raw bitstreams with no ESE framing.

ntdll ID Name Decompress Compress Byte-Identical to ntdll Builds
0x0002 LZNT1 yes yes yes (ENGINE_MAX) XP SP3 – Server 2025
0x0003 XPRESS (Plain LZ77) yes yes yes Win8.1 – Server 2025
0x0004 XPRESS_HUFF (LZ77+Huffman) yes yes yes (default engine) Win8.1 – Server 2025
0x0005 Compact XPRESS9 yes yes Server 2022+
0x0006 XP10 (LZ4 block) yes yes yes Win11 / Server 2025
0x0007 raw DEFLATE yes yes yes (both levels) Win11 / Server 2025
0x0008 ZLIB yes yes yes (both levels) Win11 / Server 2025

Format 0x0005 is an undocumented XPRESS9-family Huffman LZ77 codec (magic 0xC039E510) with a compact 10-byte header, reverse-engineered from ntdll.dll Build 20348. It uses the same core algorithm as ESE XPRESS9 (magic 0x4E86D72A) but with different outer framing. Format 0x0006 (XP10) is the same LZ4 block codec used by ESE scheme 0x6 and 0x7, without the ESE header.

Design principles

  • Standard library only at runtime. No third-party dependencies. zlib/lz4 are deliberately not used; the CRCs and the LZ4 block codec are implemented directly.
  • Two subpackages, one interface pattern. ntcompress.ese for ESE record-compression, ntcompress.ntdll for ntdll standalone codecs. Both offer Shape A (enum dispatch) and Shape B (direct module import) APIs.
  • Traceable to a spec or a source line. Every wire constant cites [MS-XCA] §x.y or an ESE file:line. Where the shipped C diverges from the spec text, both are documented.
  • Byte-identical verification. Compress output is verified against gold vectors captured from esent.dll and ntdll.dll on 16 Windows builds (XP SP3 through Server 2025).
  • Typed and documented. Python 3.11+, full type hints, Google-style docstrings, ruff-clean under select = ["ALL"], ty-clean.

Installation

Install from PyPI:

uv add ntcompress        # recommended
pip install ntcompress    # or with pip

Or install from source:

uv add git+https://github.com/StrongWind1/ntcompress

Requires Python >= 3.11.

Usage

ESE record compression

import ntcompress.ese as ese

# Decompress a cell (format is in byte 0)
plaintext = ese.decompress(cell)
size = ese.decompressed_size(cell)

# Compress with a specific format
cell = ese.compress(plaintext, ese.Format.XPRESS)
cell = ese.compress(plaintext, ese.Format.LZ4)
cell = ese.compress(plaintext, ese.Format.XPRESS9)

# Or use Shape B (direct module access)
from ntcompress.ese import xpress

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

ntdll standalone codecs

import ntcompress.ntdll as ntdll

# Shape A (enum dispatch)
compressed = ntdll.compress(data, ntdll.Format.LZNT1)
plaintext = ntdll.decompress(compressed, ntdll.Format.LZNT1)

# Windows constant aliases
compressed = ntdll.compress(data, ntdll.COMPRESSION_FORMAT_XPRESS_HUFF)

# Shape B (direct module access)
from ntcompress.ntdll import lznt1, xpress_huff, xpress9, xp10, deflate
from ntcompress.ntdll import zlib as ntdll_zlib

plaintext = lznt1.decompress(compressed_stream)
compressed = xpress_huff.compress(data)
plaintext = xpress9.decompress(stream)  # ntdll 0x0005 (compact XPRESS9)
compressed = xp10.compress(data)  # ntdll 0x0006 (LZ4 block)
compressed = deflate.compress(data)  # ntdll 0x0007
compressed = ntdll_zlib.compress(data)  # ntdll 0x0008

License and attribution

Apache-2.0 (LICENSE). The XPRESS9 codec is an attributed port of Microsoft's MIT-licensed ESE source; the Plain LZ77, Xpress Huffman, and LZNT1 codecs are derived from the published [MS-XCA] specification; the LZ4 block codec follows the public LZ4 format. Full notices are in THIRD-PARTY-NOTICES.md.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ntcompress-0.3.1.tar.gz (64.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ntcompress-0.3.1-py3-none-any.whl (79.5 kB view details)

Uploaded Python 3

File details

Details for the file ntcompress-0.3.1.tar.gz.

File metadata

  • Download URL: ntcompress-0.3.1.tar.gz
  • Upload date:
  • Size: 64.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for ntcompress-0.3.1.tar.gz
Algorithm Hash digest
SHA256 f6126653d7ad3d65ecd2aa6d9415bed7ca529e1186739682de40214fe0883e69
MD5 ec24eda04530f73fd2aa674ba94989dd
BLAKE2b-256 52b2c2b147441f667321904ff8cbcecf9e2d4339f6103d3aadbc50afe7add109

See more details on using hashes here.

Provenance

The following attestation bundles were made for ntcompress-0.3.1.tar.gz:

Publisher: publish.yml on StrongWind1/ntcompress

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ntcompress-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: ntcompress-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 79.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for ntcompress-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e4120fc3705ad7dae601d7106e2c4f702f3da52ec469350714c8791e44ab52d7
MD5 89321dc05c67dea58bd76d9fc24604cf
BLAKE2b-256 571611546f37a25959093f63d08ecaf4ff6b2220d3d7f7fbce2f54c48820e725

See more details on using hashes here.

Provenance

The following attestation bundles were made for ntcompress-0.3.1-py3-none-any.whl:

Publisher: publish.yml on StrongWind1/ntcompress

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Release history Release notifications | RSS feed

This release

0.3.1 This release

2 files

0.3.0

2 files

0.2.0

2 files

0.1.0

2 files

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page