{"id":13822499,"url":"https://github.com/gentoo90/winreg-rs","last_synced_at":"2026-03-15T00:22:46.453Z","repository":{"id":30261408,"uuid":"33812806","full_name":"gentoo90/winreg-rs","owner":"gentoo90","description":"Rust bindings to MS Windows Registry API","archived":false,"fork":false,"pushed_at":"2025-01-13T01:25:47.000Z","size":1222,"stargazers_count":176,"open_issues_count":15,"forks_count":41,"subscribers_count":6,"default_branch":"master","last_synced_at":"2025-04-05T19:06:54.046Z","etag":null,"topics":["registry","rust","winapi","windows"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gentoo90.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2015-04-12T10:38:41.000Z","updated_at":"2025-03-17T13:28:08.000Z","dependencies_parsed_at":"2024-06-18T17:02:29.126Z","dependency_job_id":"5efa1daa-c9de-4cc0-9cca-83857a19d44d","html_url":"https://github.com/gentoo90/winreg-rs","commit_stats":{"total_commits":188,"total_committers":16,"mean_commits":11.75,"dds":0.1063829787234043,"last_synced_commit":"1c56127adf4e310b5c8ed2af89aa3f7b09d38371"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gentoo90%2Fwinreg-rs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gentoo90%2Fwinreg-rs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gentoo90%2Fwinreg-rs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gentoo90%2Fwinreg-rs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gentoo90","download_url":"https://codeload.github.com/gentoo90/winreg-rs/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248359150,"owners_count":21090481,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["registry","rust","winapi","windows"],"created_at":"2024-08-04T08:02:02.852Z","updated_at":"2026-03-15T00:22:46.444Z","avatar_url":"https://github.com/gentoo90.png","language":"Rust","funding_links":[],"categories":["Rust"],"sub_categories":[],"readme":"winreg\n[![Github Actions][actions-image]][actions]\n[![Winreg on crates.io][cratesio-image]][cratesio]\n[![Winreg on docs.rs][docsrs-image]][docsrs]\n======\n\n[actions-image]: https://github.com/gentoo90/winreg-rs/actions/workflows/ci.yaml/badge.svg\n[actions]: https://github.com/gentoo90/winreg-rs/actions\n[cratesio-image]: https://img.shields.io/crates/v/winreg.svg\n[cratesio]: https://crates.io/crates/winreg\n[docsrs-image]: https://docs.rs/winreg/badge.svg\n[docsrs]: https://docs.rs/winreg\n\nRust bindings to MS Windows Registry API. Work in progress.\n\nCurrent features:\n* Basic registry operations:\n    * open/create/delete/rename keys\n    * load application hive from a file\n    * read and write values\n    * seamless conversion between `REG_*` types and rust primitives\n        * `String` and `OsString` \u003c= `REG_SZ`, `REG_EXPAND_SZ` or `REG_MULTI_SZ`\n        * `String`, `\u0026str`, `OsString`, `\u0026OsStr` =\u003e `REG_SZ`\n        * `Vec\u003cString\u003e`, `Vec\u003cOsString\u003e` \u003c= `REG_MULTI_SZ`\n        * `Vec\u003cString\u003e`, `Vec\u003c\u0026str\u003e`, `Vec\u003cOsString\u003e`, `Vec\u003c\u0026OsStr\u003e` =\u003e `REG_MULTI_SZ`\n        * `u32` \u003c=\u003e `REG_DWORD`\n        * `u64` \u003c=\u003e `REG_QWORD`\n* Iteration through key names and through values\n* Transactions\n* Transacted serialization of rust types into/from registry (only primitives, `Option`s, structures and maps for now)\n\n## Usage\n\n### Basic usage\n\n```toml\n# Cargo.toml\n[dependencies]\nwinreg = \"0.56\"\n```\n\n```rust\nuse std::io;\nuse std::path::Path;\nuse winreg::enums::*;\nuse winreg::RegKey;\n\nfn main() -\u003e io::Result\u003c()\u003e {\n    println!(\"Reading some system info...\");\n    let hklm = RegKey::predef(HKEY_LOCAL_MACHINE);\n    let cur_ver = hklm.open_subkey(\"SOFTWARE\\\\Microsoft\\\\Windows\\\\CurrentVersion\")?;\n    let pf: String = cur_ver.get_value(\"ProgramFilesDir\")?;\n    let dp: String = cur_ver.get_value(\"DevicePath\")?;\n    println!(\"ProgramFiles = {}\\nDevicePath = {}\", pf, dp);\n    let info = cur_ver.query_info()?;\n    println!(\"info = {:?}\", info);\n    let mt = info.get_last_write_time_system();\n    println!(\n        \"last_write_time as windows_sys::Win32::Foundation::SYSTEMTIME = {}-{:02}-{:02} {:02}:{:02}:{:02}\",\n        mt.wYear, mt.wMonth, mt.wDay, mt.wHour, mt.wMinute, mt.wSecond\n    );\n\n    // enable `chrono` feature on `winreg` to make this work\n    // println!(\n    //     \"last_write_time as chrono::NaiveDateTime = {}\",\n    //     info.get_last_write_time_chrono()\n    // );\n\n    println!(\"And now lets write something...\");\n    let hkcu = RegKey::predef(HKEY_CURRENT_USER);\n    let path = Path::new(\"Software\").join(\"WinregRsExample1\");\n    let (key, disp) = hkcu.create_subkey(\u0026path)?;\n\n    match disp {\n        REG_CREATED_NEW_KEY =\u003e println!(\"A new key has been created\"),\n        REG_OPENED_EXISTING_KEY =\u003e println!(\"An existing key has been opened\"),\n    }\n\n    key.set_value(\"TestSZ\", \u0026\"written by Rust\")?;\n    let sz_val: String = key.get_value(\"TestSZ\")?;\n    key.delete_value(\"TestSZ\")?;\n    println!(\"TestSZ = {}\", sz_val);\n\n    key.set_value(\"TestMultiSZ\", \u0026vec![\"written\", \"by\", \"Rust\"])?;\n    let multi_sz_val: Vec\u003cString\u003e = key.get_value(\"TestMultiSZ\")?;\n    key.delete_value(\"TestMultiSZ\")?;\n    println!(\"TestMultiSZ = {:?}\", multi_sz_val);\n\n    key.set_value(\"TestDWORD\", \u00261234567890u32)?;\n    let dword_val: u32 = key.get_value(\"TestDWORD\")?;\n    println!(\"TestDWORD = {}\", dword_val);\n\n    key.set_value(\"TestQWORD\", \u00261234567891011121314u64)?;\n    let qword_val: u64 = key.get_value(\"TestQWORD\")?;\n    println!(\"TestQWORD = {}\", qword_val);\n\n    key.create_subkey(\"sub\\\\key\")?;\n    hkcu.delete_subkey_all(\u0026path)?;\n\n    println!(\"Trying to open nonexistent key...\");\n    hkcu.open_subkey(\u0026path).unwrap_or_else(|e| match e.kind() {\n        io::ErrorKind::NotFound =\u003e panic!(\"Key doesn't exist\"),\n        io::ErrorKind::PermissionDenied =\u003e panic!(\"Access denied\"),\n        _ =\u003e panic!(\"{:?}\", e),\n    });\n    Ok(())\n}\n```\n\n### Iterators\n\n```rust\nuse std::io;\nuse winreg::RegKey;\nuse winreg::enums::*;\n\nfn main() -\u003e io::Result\u003c()\u003e {\n    println!(\"File extensions, registered in system:\");\n    for i in RegKey::predef(HKEY_CLASSES_ROOT)\n        .enum_keys().map(|x| x.unwrap())\n        .filter(|x| x.starts_with(\".\"))\n    {\n        println!(\"{}\", i);\n    }\n\n    let system = RegKey::predef(HKEY_LOCAL_MACHINE)\n        .open_subkey(\"HARDWARE\\\\DESCRIPTION\\\\System\")?;\n    for (name, value) in system.enum_values().map(|x| x.unwrap()) {\n        println!(\"{} = {:?}\", name, value);\n    }\n\n    Ok(())\n}\n```\n\n### Transactions\n\n```toml\n# Cargo.toml\n[dependencies]\nwinreg = { version = \"0.56\", features = [\"transactions\"] }\n```\n\n```rust\nuse std::io;\nuse winreg::RegKey;\nuse winreg::enums::*;\nuse winreg::transaction::Transaction;\n\nfn main() -\u003e io::Result\u003c()\u003e {\n    let t = Transaction::new()?;\n    let hkcu = RegKey::predef(HKEY_CURRENT_USER);\n    let (key, _disp) = hkcu.create_subkey_transacted(\"Software\\\\RustTransaction\", \u0026t)?;\n    key.set_value(\"TestQWORD\", \u00261234567891011121314u64)?;\n    key.set_value(\"TestDWORD\", \u00261234567890u32)?;\n\n    println!(\"Commit transaction? [y/N]:\");\n    let mut input = String::new();\n    io::stdin().read_line(\u0026mut input)?;\n    input = input.trim_right().to_owned();\n    if input == \"y\" || input == \"Y\" {\n        t.commit()?;\n        println!(\"Transaction committed.\");\n    }\n    else {\n        // this is optional, if transaction wasn't committed,\n        // it will be rolled back on disposal\n        t.rollback()?;\n\n        println!(\"Transaction wasn't committed, it will be rolled back.\");\n    }\n\n    Ok(())\n}\n```\n\n### Serialization\n\n```toml\n# Cargo.toml\n[dependencies]\nwinreg = { version = \"0.56\", features = [\"serialization-serde\"] }\nserde = \"1\"\nserde_derive = \"1\"\n```\n\n```rust\nuse serde_derive::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse std::error::Error;\nuse winreg::enums::*;\n\n#[derive(Debug, Serialize, Deserialize, PartialEq)]\nstruct Coords {\n    x: u32,\n    y: u32,\n}\n\n#[derive(Debug, Serialize, Deserialize, PartialEq)]\nstruct Size {\n    w: u32,\n    h: u32,\n}\n\n#[derive(Debug, Serialize, Deserialize, PartialEq)]\nstruct Rectangle {\n    coords: Option\u003cCoords\u003e,\n    size: Size,\n}\n\n#[derive(Debug, Serialize, Deserialize, PartialEq)]\nstruct Test {\n    t_bool: bool,\n    t_u8: u8,\n    t_u16: u16,\n    t_u32: u32,\n    t_u64: u64,\n    t_usize: usize,\n    t_struct: Rectangle,\n    t_map: HashMap\u003cString, u32\u003e,\n    t_string: String,\n    t_optional_string: Option\u003cString\u003e,\n    #[serde(rename = \"\")] // empty name becomes the (Default) value in the registry\n    t_char: char,\n    t_i8: i8,\n    t_i16: i16,\n    t_i32: i32,\n    t_i64: i64,\n    t_isize: isize,\n    t_f64: f64,\n    t_f32: f32,\n}\n\nfn main() -\u003e Result\u003c(), Box\u003cdyn Error\u003e\u003e {\n    let hkcu = winreg::RegKey::predef(HKEY_CURRENT_USER);\n    let (key, _disp) = hkcu.create_subkey(\"Software\\\\RustEncode\")?;\n\n    let mut map = HashMap::new();\n    map.insert(\"\".to_owned(), 0); // empty name becomes the (Default) value in the registry\n    map.insert(\"v1\".to_owned(), 1);\n    map.insert(\"v2\".to_owned(), 2);\n    map.insert(\"v3\".to_owned(), 3);\n\n    let v1 = Test {\n        t_bool: false,\n        t_u8: 127,\n        t_u16: 32768,\n        t_u32: 123_456_789,\n        t_u64: 123_456_789_101_112,\n        t_usize: 1_234_567_891,\n        t_struct: Rectangle {\n            coords: Some(Coords { x: 55, y: 77 }),\n            size: Size { w: 500, h: 300 },\n        },\n        t_map: map,\n        t_string: \"test 123!\".to_owned(),\n        t_optional_string: Some(\"test 456!\".to_owned()),\n        t_char: 'a',\n        t_i8: -123,\n        t_i16: -2049,\n        t_i32: 20100,\n        t_i64: -12_345_678_910,\n        t_isize: -1_234_567_890,\n        t_f64: -0.01,\n        t_f32: 3.15,\n    };\n\n    // to just write the data from structure without touching other\n    // subkeys/values in the target key:\n    key.encode(\u0026v1)?;\n\n    // or\n    // to wipe out everything under the target key:\n    // key.encode_destructive(\u0026v1)?;\n\n    let v2: Test = key.decode()?;\n    println!(\"Decoded {:?}\", v2);\n\n    println!(\"Equal to encoded: {:?}\", v1 == v2);\n    Ok(())\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgentoo90%2Fwinreg-rs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgentoo90%2Fwinreg-rs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgentoo90%2Fwinreg-rs/lists"}