From 0057ede592c04871673763c911a3f968d8d8af94 Mon Sep 17 00:00:00 2001 From: Jujuforce Date: Sun, 28 Jun 2026 14:51:52 +0200 Subject: [PATCH] feat: add Windows right-click "Unpack with fsdecrypt" context menu install-context-menu.bat / uninstall-context-menu.bat add a per-user (HKCU) Explorer entry for .app and .opt files, with an embedded unpack icon (assets/fsdecrypt.ico). No admin needed; the normal double-click association is untouched. The registered command keeps the console open after extraction. Documented in the README. Co-Authored-By: Claude Opus 4.8 --- README.md | 21 ++++++++++++++++ assets/fsdecrypt.ico | Bin 0 -> 27620 bytes install-context-menu.bat | 48 +++++++++++++++++++++++++++++++++++++ uninstall-context-menu.bat | 13 ++++++++++ 4 files changed, 82 insertions(+) create mode 100644 assets/fsdecrypt.ico create mode 100644 install-context-menu.bat create mode 100644 uninstall-context-menu.bat diff --git a/README.md b/README.md index 71421d8..71ee5b7 100644 --- a/README.md +++ b/README.md @@ -50,6 +50,27 @@ fsdecrypt ABCD_1.00.00_20240101120000_0.app ABCD_1.01.00_20240215143000_1_1.00.0 The output folder is named after the input file (e.g. `ABCD_1.01.00_20240215143000_1_1.00.00/`). +## Windows Right-Click Menu + +Two batch files add an **"Unpack with fsdecrypt"** entry (with an unpack icon) +to the right-click menu of `.app` and `.opt` files: + +- **`install-context-menu.bat`** — install the menu entry +- **`uninstall-context-menu.bat`** — remove it + +Just double-click `install-context-menu.bat`. No administrator rights are +needed — it installs under the current user only (`HKCU`) and leaves the normal +double-click association untouched. Right-clicking a file then runs the full +extraction and keeps the console window open until you press a key. + +`install-context-menu.bat` finds `fsdecrypt.exe` automatically when run from the +repo root (it looks in `target\release` then `target\debug`) or when placed next +to the binary. The icon is taken from `assets\fsdecrypt.ico` (or `fsdecrypt.ico` +beside the script). The menu stores the absolute path it found, so re-run it if +you move the exe. + +> On Windows 11 the entry appears under **Show more options** (the classic menu). + ## External Key Files For games not in the built-in key database, place a file named `{GAME_ID}.bin` in the working directory: diff --git a/assets/fsdecrypt.ico b/assets/fsdecrypt.ico new file mode 100644 index 0000000000000000000000000000000000000000..1644b514e299d8420c14665dec6a6e6a9796a89a GIT binary patch literal 27620 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 literal 0 HcmV?d00001 diff --git a/install-context-menu.bat b/install-context-menu.bat new file mode 100644 index 0000000..2ad1300 --- /dev/null +++ b/install-context-menu.bat @@ -0,0 +1,48 @@ +@echo off +setlocal enabledelayedexpansion +rem --------------------------------------------------------------------------- +rem Adds an "Unpack with fsdecrypt" entry (with icon) to the right-click menu +rem of .app and .opt files. Per-user only (HKCU) -- no administrator needed, +rem and it does not change the normal double-click association. +rem +rem Place this next to fsdecrypt.exe and run it, or run it from the repo root +rem after `cargo build --release`. Run uninstall-context-menu.bat to undo. +rem --------------------------------------------------------------------------- + +rem --- locate fsdecrypt.exe -------------------------------------------------- +set "EXE=" +if exist "%~dp0fsdecrypt.exe" set "EXE=%~dp0fsdecrypt.exe" +if not defined EXE if exist "%~dp0target\release\fsdecrypt.exe" set "EXE=%~dp0target\release\fsdecrypt.exe" +if not defined EXE if exist "%~dp0target\debug\fsdecrypt.exe" set "EXE=%~dp0target\debug\fsdecrypt.exe" +if not defined EXE ( + echo ERROR: could not find fsdecrypt.exe next to this script or under target\. + echo Build it first: cargo build --release + pause + exit /b 1 +) + +rem --- locate the icon (optional) -------------------------------------------- +set "ICON=" +if exist "%~dp0fsdecrypt.ico" set "ICON=%~dp0fsdecrypt.ico" +if not defined ICON if exist "%~dp0assets\fsdecrypt.ico" set "ICON=%~dp0assets\fsdecrypt.ico" + +echo Using exe : !EXE! +if defined ICON (echo Using icon: !ICON!) else (echo Using icon: ^(none found^)) +echo. + +call :install ".app" +call :install ".opt" + +echo. +echo Done. Right-click a .app or .opt file to see "Unpack with fsdecrypt". +echo ^(On Windows 11 it is under "Show more options".^) +pause +exit /b 0 + +:install +set "KEY=HKCU\Software\Classes\SystemFileAssociations\%~1\shell\fsdecrypt" +reg add "%KEY%" /ve /d "Unpack with fsdecrypt" /f >nul +if defined ICON reg add "%KEY%" /v Icon /d "!ICON!" /f >nul +reg add "%KEY%\command" /ve /d "cmd /c \"\"!EXE!\" \"%%1\" ^& pause\"" /f >nul +echo installed for %~1 +goto :eof diff --git a/uninstall-context-menu.bat b/uninstall-context-menu.bat new file mode 100644 index 0000000..05d006e --- /dev/null +++ b/uninstall-context-menu.bat @@ -0,0 +1,13 @@ +@echo off +setlocal +rem --------------------------------------------------------------------------- +rem Removes the "Unpack with fsdecrypt" right-click entry installed by +rem install-context-menu.bat. Safe to run even if it was never installed. +rem --------------------------------------------------------------------------- + +reg delete "HKCU\Software\Classes\SystemFileAssociations\.app\shell\fsdecrypt" /f >nul 2>&1 +reg delete "HKCU\Software\Classes\SystemFileAssociations\.opt\shell\fsdecrypt" /f >nul 2>&1 + +echo Removed "Unpack with fsdecrypt" from the right-click menu of .app and .opt files. +pause +exit /b 0