Skip to main content

Extensible Storage Engine

Extensible Storage Engine (ESE) database is an open source database used on Windows systems. ESE databases are used by many different kinds of Windows applications such as:

  • Windows Search
  • BITS (pre-Windows 11)
  • UAL
  • Edge (pre-Chromium version)

Artemis supports parsing both unlocked and locked ESE databases.

Collection

You have to use the artemis api in order to parse a single ESE database.

Sample API Script

import { EseDatabase } from "./artemis-api/src/windows/ese.ts";
import { WindowsError } from "./artemis-api/src/windows/errors.ts";

function main() {
// Provide path to the UAL file
const path = "C:\\Windows\\System32\\LogFiles\\sum\\Current.mdb";

const ese = new EseDatabase(path);

const catalog = ese.catalogInfo();
if (catalog === WindowsError) {
return catalog;
}

for (const entry of catalog) {
console.log(`${entry.name} - Catalog Type: ${entry.catalog_type}`);
}
}

Output Structures

Depending on functions used the artemis API will returning the following objects

/** Generic Interface for dumping ESE tables */
export interface EseTable {
column_type: ColumnType;
column_name: string;
/**Binary data is base64 encoded. All data is decompressed if possible */
column_data: string;
}

export enum ColumnType {
Nil = "Nil",
Bit = "Bit",
UnsignedByte = "UnsignedByte",
Short = "Short",
Long = "Long",
Currency = "Currency",
Float32 = "Float32",
Float64 = "Float64",
/** All timestamps have been converted to UNIXEPOCH seconds */
DateTime = "DateTime",
Binary = "Binary",
/** Can be ASCII or Unicode */
Text = "Text",
LongBinary = "LongBinary",
/**Can be ASCII or Unicode */
LongText = "LongText",
SuperLong = "SuperLong",
UnsignedLong = "UnsignedLong",
LongLong = "LongLong",
Guid = "Guid",
UnsignedShort = "UnsignedShort",
Unknown = "Unknown",
}

/**
* Metadata about the ESE database Catalog
*/
export interface Catalog {
/**Fixed data */
obj_id_table: number;
/**Fixed data */
catalog_type: CatalogType;
/**Fixed data */
id: number;
/** Fixed data - Column only if the `catalog_type` is Column, otherwise father data page (FDP) */
column_or_father_data_page: number;
/**Fixed data */
space_usage: number;
/**Fixed data - If `catalog_type` is Column then these are columns flags */
flags: number;
/**Fixed data */
pages_or_locale: number;
/**Fixed data */
root_flag: number;
/**Fixed data */
record_offset: number;
/**Fixed data */
lc_map_flags: number;
/**Fixed data */
key_most: number;
/**Fixed data */
lv_chunk_max: number;
/**Variable data */
name: string;
/**Variable data */
stats: Uint8Array;
/**Variable data */
template_table: string;
/**Variable data */
default_value: Uint8Array;
/**Variable data */
key_fld_ids: Uint8Array;
/**Variable data */
var_seg_mac: Uint8Array;
/**Variable data */
conditional_columns: Uint8Array;
/**Variable data */
tuple_limits: Uint8Array;
/**Variable data */
version: Uint8Array;
/**Variable data */
sort_id: Uint8Array;
/**Tagged data */
callback_data: Uint8Array;
/**Tagged data */
callback_dependencies: Uint8Array;
/**Tagged data */
separate_lv: Uint8Array;
/**Tagged data */
space_hints: Uint8Array;
/**Tagged data */
space_deferred_lv_hints: Uint8Array;
/**Tagged data */
local_name: Uint8Array;
}

export enum CatalogType {
Table = "Table",
Column = "Column",
Index = "Index",
LongValue = "LongValue",
Callback = "Callback",
SlvAvail = "SlvAvail",
SlvSpaceMap = "SlvSpaceMap",
Unknown = "Unknown",
}

export interface TableInfo {
obj_id_table: number;
table_page: number;
table_name: string;
column_info: ColumnInfo[];
long_value_page: number;
}

export interface ColumnInfo {
column_type: ColumnType;
column_name: string;
column_data: number[];
column_id: number;
column_flags: ColumnFlags[];
column_space_usage: number;
column_tagged_flags: TaggedDataFlag[];
}

export enum ColumnFlags {
NotNull = "NotNull",
Version = "Version",
AutoIncrement = "AutoIncrement",
MultiValued = "MultiValued",
Default = "Default",
EscrowUpdate = "EscrowUpdate",
Finalize = "Finalize",
UserDefinedDefault = "UserDefinedDefault",
TemplateColumnESE98 = "TemplateColumnESE98",
DeleteOnZero = "DeleteOnZero",
PrimaryIndexPlaceholder = "PrimaryIndexPlaceholder",
Compressed = "Compressed",
Encrypted = "Encrypted",
Versioned = "Versioned",
Deleted = "Deleted",
VersionedAdd = "VersionedAdd",
}

enum TaggedDataFlag {
Variable = "Variable",
Compressed = "Compressed",
LongValue = "LongValue",
MultiValue = "MultiValue",
MultiValueSizeDefinition = "MultiValueSizeDefinition",
Unknown = "Unknown",
}