Skip to content

A high-performance Windows registry toolkit, powered by Rust with napi-rs

License

Notifications You must be signed in to change notification settings

Zagrios/regedit-rs

Repository files navigation

regedit-rs

GitHub CI Status regedit-rs npm version Rust 1.70+

A high-performance Windows registry toolkit inspired by node-regedit, powered by Rust with napi-rs It enables easy manipulation of the Windows registry with optimized performance.

Install

npm install regedit-rs

Example

import { list, createKey, putValue, deleteKey, deleteValue, RegSzValue, RegDwordValue, RegExpandSzValue } from "regedit-rs";

async function main(){
    const keys = ["HKCU\\Software\\regedit-rs", "HKCU\\Software\\regedit-rs\\test"];
    const result = await list(keys);

    if(!result[keys[0]].exists){
        return;
    }

    const nameValue = result[keys[1]].values["name"].value;
    const newPath = new RegExpandSzValue(`%APPDATA%\\${nameValue}`);

    if(newPath.expandedValue !== "C:\\Users\\username\\AppData\\Roaming\\test name"){
        return;
    }

    await createKey("HKCU\\Software\\regedit-rs\\test");
    await putValue({
        "HKCU\\Software\\regedit-rs\\test": {
            "name": new RegSzValue("test name"),
            "number": new RegDwordValue(123),
            "path": newPath
        }
    });

    await deleteKey("HKCU\\Software\\regedit-rs\\old_test");

    await deleteValue({
        "HKCU\\Software\\regedit-rs\\test": ["name", "number", "path"]
    });
}

main();

API

Every function are binded to Rust and support batching to improve performance.

Reading keys and values

List registry key(s) and value(s)

const res = await list(["HKCU\\SOFTWARE", "HKLM\\SOFTWARE", "HKCU\\DONT_EXIST"]);

Result will be an object with the following structure:

{
    "HKCU\\SOFTWARE": {
        "exists": true,
        keys: ["HKCU\\SOFTWARE\\Microsoft", "HKCU\\SOFTWARE\\regedit-rs", ...],
        values: {
            szValue: [RegSzValue] // RegSzValue is a class with a value property
            dwordValue: [RegDwordValue] // RegDwordValue is a class with a value property
            expandSzValue: [RegExpandSzValue] // RegExpandSzValue is a class with a value and expandedValue property
        }
    },
    "HKLM\\SOFTWARE": {
        "exists": true,
        keys: ["HKLM\\SOFTWARE\\Microsoft", "HKLM\\SOFTWARE\\regedit-rs", ...],
        values: {
            szValue: [RegSzValue]
            dwordValue: [RegDwordValue]
            qwordValue: [RegQwordValue]
            expandSzValue: [RegExpandSzValue]
        }
    },
    "HKCU\\DONT_EXIST": {
        "exists": false,
        keys: [],
        values: {}
    }
}

Creating keys

Create registry key(s) if not exists

await createKey("HKCU\\SOFTWARE\\regedit-rs\\test");
await createKey(["HKCU\\SOFTWARE\\regedit-rs\\test", "HKCU\\SOFTWARE\\regedit-rs\\test2"]);

Putting values

Put or update registry value(s)

await putValue({
    "HKCU\\SOFTWARE\\regedit-rs\\test": {
        "name": new RegSzValue("test name"),
        "number": new RegDwordValue(123),
        "path": new RegExpandSzValue("%APPDATA%\\test name")
    }
});

Deleting keys

Delete registry key(s) and all subkeys

await deleteKey("HKCU\\SOFTWARE\\regedit-rs\\test");
await deleteKey(["HKCU\\SOFTWARE\\regedit-rs\\test", "HKCU\\SOFTWARE\\regedit-rs\\test2"]);

Deleting values

Delete registry value(s)

await deleteValue({
    "HKCU\\SOFTWARE\\regedit-rs\\test": ["name", "number", "path"]
});

More

See all types, functions, and classes at index.d.ts

Sample Benchmark

npm run bench
Running "List keys and values of a registry key" suite...
Progress: 100%

  regedit-rs:
    3 162 ops/s, ±1.01%   | fastest

  regedit:
    18 ops/s, ±0.37%      | slowest, 99.43% slower

  winreg:
    33 ops/s, ±0.60%      | 98.96% slower

Finished 3 cases!
  Fastest: regedit-rs
  Slowest: regedit
Running "Create a registry key" suite...
Progress: 100%

  regedit-rs:
    116 548 ops/s, ±0.74%   | fastest

  regedit:
    22 ops/s, ±0.64%        | slowest, 99.98% slower

  winreg:
    43 ops/s, ±1.00%        | 99.96% slower

Finished 3 cases!
  Fastest: regedit-rs
  Slowest: regedit
Running "Put a registry value" suite...
Progress: 100%

  regedit-rs:
    59 015 ops/s, ±0.77%   | fastest

  regedit:
    22 ops/s, ±0.92%       | slowest, 99.96% slower

  winreg:
    43 ops/s, ±0.85%       | 99.93% slower

Finished 3 cases!
  Fastest: regedit-rs
  Slowest: regedit

Test or Contributing

  • Clone this repo
  • Install latest stable Rust
  • Install Node.js 10+
  • Install dependencies with npm install
  • Build bindings with npm run build
  • Run npm test

Release package

We use GitHub actions to automatically publish npm packages.

# 1.0.0 => 1.0.1
npm version patch

# or 1.0.0 => 1.1.0
npm version minor