mirror of
https://gitea.tendokyu.moe/moegrid/sega-mount.git
synced 2026-10-04 20:47:57 +03:00
更新readme
This commit is contained in:
@@ -1,15 +1,16 @@
|
||||
# sega-mount
|
||||
|
||||
SEGA游戏容器挂载工具。解析 ICF 配置文件,通过 fscrypt 驱动解密挂载 APP/OPT 容器,并创建 overlay 差分盘实现可写层,最后通过重解析点将卷设备链接到指定目录。
|
||||
SEGA 游戏容器挂载工具。解析 ICF 配置文件,通过 fscrypt 驱动解密挂载 APP/OPT 容器,创建 overlay 差分盘实现可写层,并通过 NTFS 重解析点将卷设备链接到指定目录。提供命令行和 GUI 两种使用方式。
|
||||
|
||||
## 功能
|
||||
|
||||
- 解析 ICF 文件,筛选 Active 状态的 APP/OPT 条目(同 part 自动取最新版本)
|
||||
- 通过 `sgfscrypt` 驱动解密挂载 APP/OPT 容器(AES-128-CBC)
|
||||
- 解析 ICF 文件,筛选 Active 状态的 APP/OPT 条目
|
||||
- 通过 `sgfscrypt` 驱动解密挂载 APP/OPT 容器
|
||||
- 创建 overlay.vhd 差分盘作为可写层,挂载到指定盘符
|
||||
- 递归拷贝 overlay 目录文件到差分盘(首次创建时)
|
||||
- 通过 NTFS 重解析点(Mount Point)将卷设备链接到目录
|
||||
- 支持 config.ini 覆盖密钥,空则用内置密钥表
|
||||
- **GUI 模式**:ImGui + DirectX11 图形界面,可视化配置编辑
|
||||
|
||||
## 构建
|
||||
|
||||
@@ -20,16 +21,6 @@ SEGA游戏容器挂载工具。解析 ICF 配置文件,通过 fscrypt 驱动
|
||||
- Windows SDK 10.0
|
||||
- CLion(推荐)或命令行构建
|
||||
|
||||
### 步骤
|
||||
|
||||
```bash
|
||||
mkdir build && cd build
|
||||
cmake .. -G "Visual Studio 17 2022"
|
||||
cmake --build . --config Release
|
||||
```
|
||||
|
||||
CLion 用户直接打开项目即可,CMakeLists.txt 已配置好 `/utf-8` 和 SDK 版本宏。
|
||||
|
||||
### 生成密钥头文件
|
||||
|
||||
内置密钥表由 `res/gen_keys.py` 从 `res/keys.json` 生成:
|
||||
@@ -42,14 +33,24 @@ python res/gen_keys.py
|
||||
|
||||
## 使用
|
||||
|
||||
### 命令
|
||||
### GUI 模式
|
||||
|
||||
直接运行 `sega_mount_gui.exe`,界面包含:
|
||||
|
||||
- **配置编辑区**:所有 config.ini 字段可直接编辑
|
||||
- **驱动状态**:启动时自动检测 `sgfscrypt` 驱动服务,无需手动操作
|
||||
- **挂载/卸载**:一键操作,结果实时显示在日志面板
|
||||
- **日志面板**:彩色分级显示(INFO/WARN/ERROR),支持自动滚动和清空
|
||||
- **暗色主题**:CinderImGui 风格,红色强调配色
|
||||
|
||||
### 命令行模式
|
||||
|
||||
```
|
||||
sega_mount -m [config.ini] 挂载
|
||||
sega_mount -u [config.ini] 卸载
|
||||
sega_mount_cmd -m [config.ini] 挂载
|
||||
sega_mount_cmd -u [config.ini] 卸载
|
||||
```
|
||||
|
||||
不指定 config.ini 路径时,默认读取 exe 所在目录的 `config.ini`。
|
||||
不指定 config.ini 路径时,默认读取当前运行目录(CWD)的 `config.ini`。
|
||||
|
||||
> 需要管理员权限运行(驱动服务安装需要)。
|
||||
|
||||
@@ -74,7 +75,7 @@ OPT_IV = C063BF6F562D084D7963C987F5281761
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `ICF_PATH` | ICF 文件路径(必填) |
|
||||
| `IMAGE_DIR` | APP/OPT 镜像文件所在目录,空则用 exe 所在目录 |
|
||||
| `IMAGE_DIR` | APP/OPT 镜像文件所在目录,空则用 CWD |
|
||||
| `OVERLAY_DIR` | overlay 源目录,空或不存在则跳过拷贝 |
|
||||
| `MOUNT_LETTER` | overlay 卷盘符,默认 X |
|
||||
| `APP_LINK` | APP 链接基础路径,空则不创建链接 |
|
||||
@@ -95,7 +96,7 @@ C:\Mount\Option\A011\ → FscryptDisk_OPT_A011
|
||||
|
||||
## 挂载/卸载流程
|
||||
|
||||
### 挂载 (-m)
|
||||
### 挂载
|
||||
|
||||
1. 读取并解析 ICF 文件(AES 解密 → 结构体解析)
|
||||
2. 筛选 Active APP 条目,按 part_index 排序,验证 base version 依赖链
|
||||
@@ -106,7 +107,7 @@ C:\Mount\Option\A011\ → FscryptDisk_OPT_A011
|
||||
5. 挂载 OPT 容器
|
||||
6. 创建 APP/OPT 链接(NTFS 重解析点)
|
||||
|
||||
### 卸载 (-u)
|
||||
### 卸载
|
||||
|
||||
1. 移除 APP/OPT 链接(RemoveDirectory 移除 junction)
|
||||
2. 移除 overlay 盘符 + detach overlay.vhd(保留文件)
|
||||
@@ -123,34 +124,46 @@ sega-mount/
|
||||
│ ├── keys.json # 游戏密钥表(源数据)
|
||||
│ └── gen_keys.py # 密钥表头文件生成脚本
|
||||
├── src/
|
||||
│ ├── main.cpp # 入口:INI 解析 + 命令分发
|
||||
│ ├── config.h # Config 结构体定义
|
||||
│ ├── config.h / config.cpp # Config 结构体 + 全局实例 + INI 读写
|
||||
│ ├── driver_service.cpp # sgfscrypt 驱动服务管理
|
||||
│ ├── fscrypt.cpp # 容器挂载/卸载/链接(fscrypt IOCTL)
|
||||
│ ├── icf_parser.cpp # ICF 文件解析(解密 + 结构体)
|
||||
│ ├── icf_mount.cpp # ICF 挂载编排(APP + overlay + OPT + LINK)
|
||||
│ ├── vhd_mount.cpp # VHD 创建/挂载/卸载(virtdisk API)
|
||||
│ ├── cmd/
|
||||
│ │ └── main.cpp # 命令行入口
|
||||
│ ├── gui/
|
||||
│ │ ├── main.cpp # GUI 入口(WinMain + 主循环)
|
||||
│ │ ├── ui.cpp # ImGui 界面绘制
|
||||
│ │ ├── theme.cpp # CinderImGui 暗色主题
|
||||
│ │ ├── dx11_backend.cpp # DX11 + Win32 后端
|
||||
│ │ ├── gui_utils.cpp # 配置加载 + 文件/目录对话框
|
||||
│ │ └── gui_common.h # GUI 全局状态
|
||||
│ └── utils/
|
||||
│ ├── aes.cpp # AES-128-CBC 加解密(BCrypt)
|
||||
│ ├── bcrypt_util.cpp # BCrypt 辅助函数
|
||||
│ ├── crc32.cpp # CRC32 校验
|
||||
│ ├── files.cpp # 文件读取/目录拷贝/exe路径
|
||||
│ ├── files.cpp # 文件读取/目录拷贝/路径工具
|
||||
│ ├── log.cpp # 日志库(彩色输出 + 等级)
|
||||
│ ├── strings.cpp # 字符串/路径转换工具
|
||||
│ ├── strings.cpp # 字符串/路径转换 + 错误码格式化
|
||||
│ ├── crypto_constants.h # BootId/ICF 通用密钥常量
|
||||
│ └── game_keys.h # 自动生成的游戏密钥表
|
||||
└── tests/
|
||||
└── test_mount_opt.cpp # 容器挂载/卸载/链接测试工具
|
||||
```
|
||||
|
||||
## 技术细节
|
||||
|
||||
- **ICF 解析**:ICF 文件经 AES-128-CBC 解密后,按 0x40 字节 section 依次解析 Header 和 Entry,支持 Pack/App/Opt 三种类型
|
||||
- **容器挂载**:读取容器 BootId(0x60 字节)→ AES 解密 → 解析容器元数据 → 构造 0x280 字节 IOCTL 输入缓冲 → 发送 MOUNT IOCTL
|
||||
- **容器挂载**:读取容器 BootId(0x60 字节)→ AES 解密 → 解析容器元数据 → 构造 IOCTL 输入缓冲 → 发送 MOUNT IOCTL(0x22E008),驱动返回 NT 路径用于后续链接
|
||||
- **容器卸载**:发送 UNMOUNT IOCTL(0x22E00C),按 tag 匹配卸载指定容器
|
||||
- **overlay 差分盘**:使用 `CreateVirtualDisk` 创建差分 VHD,父盘指向最后一个 APP 容器内的 `internal_N.vhd`;差分盘保留不删除,仅首次创建时拷贝 overlay 目录文件
|
||||
- **驱动安装**:自动将 `sgfscrypt.sys` 拷贝到 `C:\Windows\System32\drivers\` 并创建服务,避免 exe 目录文件锁定问题
|
||||
- **密钥查找优先级**:config.ini `[KEYS]` section 覆盖 → 内置 `game_keys::ENTRIES` 密钥表按 GameID 查找
|
||||
- **日志格式**:`[LEVEL][MODULE] message`,彩色输出,不打印敏感信息(密钥/IV)
|
||||
|
||||
## 依赖
|
||||
|
||||
- `sgfscrypt.sys` 驱动(需放在 exe 同目录)
|
||||
- Windows API:`virtdisk.h`(VHD)、`winioctl.h`(重解析点)、`bcrypt.h`(AES)
|
||||
- 无第三方 C++ 库依赖
|
||||
- `sgfscrypt.sys` 驱动(需放在 exe 同目录,安装时自动拷贝到系统目录)
|
||||
- Windows API:`virtdisk.h`(VHD)、`winioctl.h`(重解析点)、`bcrypt.h`(AES)、`commdlg.h`/`shlobj.h`(文件对话框)
|
||||
- ImGui(通过 CMake FetchContent 自动拉取,无手动安装)
|
||||
- DirectX 11(GUI 版渲染后端)
|
||||
|
||||
Reference in New Issue
Block a user