diff --git a/docs-xml/smbdotconf/himmelblaud/himmelblaudhelloenabled.xml b/docs-xml/smbdotconf/himmelblaud/himmelblaudhelloenabled.xml
new file mode 100644
index 00000000000..b148362862f
--- /dev/null
+++ b/docs-xml/smbdotconf/himmelblaud/himmelblaudhelloenabled.xml
@@ -0,0 +1,18 @@
+
+
+
+ This parameter controls Hello enrollment and authentication to
+ Azure Entra ID. By default, it is disabled to prevent security risks,
+ such as on hosts exposing the SSH port. Administrators should enable
+ this setting only when Hello enrollment is appropriate for their
+ environment.
+
+
+
+
+no
+yes
+
diff --git a/docs-xml/smbdotconf/himmelblaud/himmelblaudsfafallback.xml b/docs-xml/smbdotconf/himmelblaud/himmelblaudsfafallback.xml
new file mode 100644
index 00000000000..1b30d0a87c9
--- /dev/null
+++ b/docs-xml/smbdotconf/himmelblaud/himmelblaudsfafallback.xml
@@ -0,0 +1,17 @@
+
+
+
+ This parameter is designed to control whether Himmelblaud should fallback to
+ Single Factor Authentication (SFA) if Multi-Factor Authentication (MFA) isn't
+ available. This normally is possible during a short window during which MFA
+ enrollment is available to a new user.
+
+
+
+
+no
+yes
+
diff --git a/himmelblaud/Cargo.toml b/himmelblaud/Cargo.toml
index 69197cd5ff3..bdf487d30da 100644
--- a/himmelblaud/Cargo.toml
+++ b/himmelblaud/Cargo.toml
@@ -17,9 +17,11 @@ dbg = { workspace = true }
[workspace]
members = [
"chelps", "dbg", "ntstatus_gen",
+ "param",
]
[workspace.dependencies]
+param = { path = "param" }
dbg = { path = "dbg" }
chelps = { path = "chelps" }
ntstatus_gen = { path = "ntstatus_gen" }
diff --git a/himmelblaud/param/Cargo.toml b/himmelblaud/param/Cargo.toml
new file mode 100644
index 00000000000..e90e500d7f5
--- /dev/null
+++ b/himmelblaud/param/Cargo.toml
@@ -0,0 +1,15 @@
+[package]
+name = "param"
+edition.workspace = true
+license.workspace = true
+homepage.workspace = true
+version.workspace = true
+
+[dependencies]
+chelps = { workspace = true }
+dbg.workspace = true
+ntstatus_gen.workspace = true
+paste = "1.0.15"
+
+[build-dependencies]
+bindgen = "0.69.4"
diff --git a/himmelblaud/param/build.rs b/himmelblaud/param/build.rs
new file mode 100644
index 00000000000..d2fa9df8753
--- /dev/null
+++ b/himmelblaud/param/build.rs
@@ -0,0 +1,48 @@
+use std::env;
+use std::path::PathBuf;
+
+fn main() {
+ let bindings = bindgen::Builder::default()
+ .blocklist_function("qgcvt")
+ .blocklist_function("qgcvt_r")
+ .blocklist_function("qfcvt")
+ .blocklist_function("qfcvt_r")
+ .blocklist_function("qecvt")
+ .blocklist_function("qecvt_r")
+ .blocklist_function("strtold")
+ .clang_arg("-Dbool=int")
+ .clang_arg("-Doffset_t=loff_t")
+ .clang_arg("-I../../bin/default")
+ .clang_arg("-includestdint.h")
+ .header("../../lib/param/param.h")
+ .header("../../lib/param/loadparm.h")
+ .header("../../source3/param/loadparm.h")
+ .header("../../bin/default/lib/param/param_functions.h")
+ .parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
+ .generate()
+ .expect("Unable to generate bindings");
+ println!(
+ "cargo:rerun-if-changed=../../bin/default/lib/param/param_functions.h"
+ );
+
+ let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
+ bindings
+ .write_to_file(out_path.join("bindings.rs"))
+ .expect("Couldn't write bindings!");
+
+ let mut src_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
+ src_dir.push("../../bin/default/source3");
+ println!(
+ "cargo:rustc-link-search=native={}",
+ src_dir.to_str().unwrap()
+ );
+ println!("cargo:rustc-link-lib=smbconf");
+
+ let mut src_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());
+ src_dir.push("../../bin/default/lib/param");
+ println!("cargo:rustc-link-lib=samba-hostconfig-private-samba");
+ println!(
+ "cargo:rustc-link-search=native={}",
+ src_dir.to_str().unwrap()
+ );
+}
diff --git a/himmelblaud/param/src/lib.rs b/himmelblaud/param/src/lib.rs
new file mode 100644
index 00000000000..7b4bcaf5325
--- /dev/null
+++ b/himmelblaud/param/src/lib.rs
@@ -0,0 +1,208 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ Parameter loading functions
+
+ Copyright (C) David Mulder 2024
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+use chelps::{string_free, wrap_c_char, wrap_string};
+use dbg::{DBG_ERR, DBG_INFO, DBG_WARNING};
+use ntstatus_gen::NT_STATUS_UNSUCCESSFUL;
+use std::error::Error;
+use std::ffi::c_void;
+use std::sync::{Arc, Mutex};
+
+mod ffi {
+ #![allow(non_upper_case_globals)]
+ #![allow(non_camel_case_types)]
+ #![allow(non_snake_case)]
+ #![allow(dead_code)]
+ #![allow(clippy::upper_case_acronyms)]
+ include!(concat!(env!("OUT_DIR"), "/bindings.rs"));
+}
+
+pub struct LoadParm {
+ lp: Arc>,
+}
+
+macro_rules! lpcfg_str {
+ ($var:ident) => {
+ paste::item! {
+ pub fn $var (&self) -> Result