diff --git a/Cargo.lock b/Cargo.lock
index 465dc6e0..86d1a77c 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -127,7 +127,7 @@ checksum = "031718ddb8f78aa5def78a09e90defe30151d1f6c672f937af4dd916429ed996"
dependencies = [
"semver",
"serde",
- "toml",
+ "toml 0.5.11",
"url",
]
@@ -354,6 +354,20 @@ dependencies = [
"crypto-common",
]
+[[package]]
+name = "embed-resource"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7fbc6e0d8e0c03a655b53ca813f0463d2c956bc4db8138dbc89f120b066551e3"
+dependencies = [
+ "cc",
+ "memchr",
+ "rustc_version",
+ "toml 0.8.22",
+ "vswhom",
+ "winreg",
+]
+
[[package]]
name = "env_filter"
version = "0.1.2"
@@ -377,6 +391,12 @@ dependencies = [
"log",
]
+[[package]]
+name = "equivalent"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
+
[[package]]
name = "form_urlencoded"
version = "1.1.0"
@@ -422,8 +442,11 @@ dependencies = [
name = "framework_tool"
version = "0.4.0"
dependencies = [
+ "embed-resource",
"framework_lib",
"static_vcruntime",
+ "winapi",
+ "winresource",
]
[[package]]
@@ -566,6 +589,12 @@ dependencies = [
"syn 2.0.98",
]
+[[package]]
+name = "hashbrown"
+version = "0.15.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
+
[[package]]
name = "heck"
version = "0.5.0"
@@ -625,6 +654,16 @@ dependencies = [
"unicode-normalization",
]
+[[package]]
+name = "indexmap"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
+dependencies = [
+ "equivalent",
+ "hashbrown",
+]
+
[[package]]
name = "io-kit-sys"
version = "0.1.0"
@@ -1069,6 +1108,15 @@ dependencies = [
"serde",
]
+[[package]]
+name = "serde_spanned"
+version = "0.6.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1"
+dependencies = [
+ "serde",
+]
+
[[package]]
name = "sha2"
version = "0.10.8"
@@ -1207,6 +1255,47 @@ dependencies = [
"serde",
]
+[[package]]
+name = "toml"
+version = "0.8.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
+dependencies = [
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_edit",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.22.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
+dependencies = [
+ "indexmap",
+ "serde",
+ "serde_spanned",
+ "toml_datetime",
+ "toml_write",
+ "winnow",
+]
+
+[[package]]
+name = "toml_write"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076"
+
[[package]]
name = "typenum"
version = "1.16.0"
@@ -1312,6 +1401,26 @@ version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+[[package]]
+name = "vswhom"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b"
+dependencies = [
+ "libc",
+ "vswhom-sys",
+]
+
+[[package]]
+name = "vswhom-sys"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150"
+dependencies = [
+ "cc",
+ "libc",
+]
+
[[package]]
name = "wasm-bindgen"
version = "0.2.84"
@@ -1672,6 +1781,35 @@ version = "0.53.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
+[[package]]
+name = "winnow"
+version = "0.7.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d9fb597c990f03753e08d3c29efbfcf2019a003b4bf4ba19225c158e1549f0f3"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5"
+dependencies = [
+ "cfg-if",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "winresource"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba4a67c78ee5782c0c1cb41bebc7e12c6e79644daa1650ebbc1de5d5b08593f7"
+dependencies = [
+ "toml 0.8.22",
+ "version_check",
+]
+
[[package]]
name = "wmi"
version = "0.15.0"
diff --git a/framework_tool/Cargo.toml b/framework_tool/Cargo.toml
index da69ded0..0469dab3 100644
--- a/framework_tool/Cargo.toml
+++ b/framework_tool/Cargo.toml
@@ -9,3 +9,11 @@ path = "../framework_lib"
[build-dependencies]
# Note: Only takes effect in release builds
static_vcruntime = "2.0"
+embed-resource = "3.0"
+winresource = "0.1.17"
+
+[target.'cfg(windows)'.dependencies.winapi]
+version = "0.3.9"
+features = [
+ "wincon"
+]
diff --git a/framework_tool/build.rs b/framework_tool/build.rs
index 20e1c8e9..87d2140e 100644
--- a/framework_tool/build.rs
+++ b/framework_tool/build.rs
@@ -1,3 +1,19 @@
fn main() {
- static_vcruntime::metabuild();
+ // Add app icon
+ if std::env::var_os("CARGO_CFG_WINDOWS").is_some() {
+ winresource::WindowsResource::new()
+ .set_icon("..\\res\\framework_startmenuicon.ico")
+ .compile()
+ .unwrap();
+ }
+
+ if !cfg!(debug_assertions) {
+ // Statically link vcruntime to allow running on clean install
+ static_vcruntime::metabuild();
+
+ // Embed resources file to force running as admin
+ embed_resource::compile("framework_tool-manifest.rc", embed_resource::NONE)
+ .manifest_optional()
+ .unwrap();
+ }
}
diff --git a/framework_tool/framework_tool-manifest.rc b/framework_tool/framework_tool-manifest.rc
new file mode 100644
index 00000000..68429585
--- /dev/null
+++ b/framework_tool/framework_tool-manifest.rc
@@ -0,0 +1,2 @@
+#define RT_MANIFEST 24
+1 RT_MANIFEST "framework_tool.exe.manifest"
diff --git a/framework_tool/framework_tool.exe.manifest b/framework_tool/framework_tool.exe.manifest
new file mode 100644
index 00000000..287bba26
--- /dev/null
+++ b/framework_tool/framework_tool.exe.manifest
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/framework_tool/src/main.rs b/framework_tool/src/main.rs
index 3a4d54a4..d755aa77 100644
--- a/framework_tool/src/main.rs
+++ b/framework_tool/src/main.rs
@@ -6,9 +6,49 @@ fn get_args() -> Vec {
}
fn main() -> Result<(), &'static str> {
- let args = commandline::parse(&get_args());
+ let args = get_args();
+
+ // If the user double-clicks (opens from explorer/desktop),
+ // then we want to have the default behavior of showing a report of
+ // all firmware versions.
+ #[cfg(windows)]
+ let (args, double_clicked) = {
+ let double_clicked = unsafe {
+ // See https://devblogs.microsoft.com/oldnewthing/20160125-00/?p=92922
+ let mut plist: winapi::shared::minwindef::DWORD = 0;
+ let processes = winapi::um::wincon::GetConsoleProcessList(&mut plist, 1);
+
+ // If we're the only process that means we're in a fresh terminal
+ // without CMD or powershell. This happens in some cases, for example
+ // if the user double-clicks the app from Explorer.
+ processes == 1
+ };
+ // But it also happens if launched from the commandline and a UAC prompt is necessary,
+ // for example with sudo set to open "In a new windows", therefore we also have to
+ // check that no commandline arguments were provided.
+ if double_clicked && args.len() == 1 {
+ (
+ vec![args[0].clone(), "--versions".to_string()],
+ double_clicked,
+ )
+ } else {
+ (args, double_clicked)
+ }
+ };
+
+ let args = commandline::parse(&args);
if (commandline::run_with_args(&args, false)) != 0 {
return Err("Fail");
}
+
+ // Prevent command prompt from auto closing
+ #[cfg(windows)]
+ if double_clicked {
+ println!();
+ println!("Press ENTER to exit...");
+ let mut line = String::new();
+ let _ = std::io::stdin().read_line(&mut line).unwrap();
+ }
+
Ok(())
}
diff --git a/res/framework_startmenuicon.ico b/res/framework_startmenuicon.ico
new file mode 100644
index 00000000..8c6be29a
Binary files /dev/null and b/res/framework_startmenuicon.ico differ