Files
2026-06-03 01:34:23 +03:00

154 lines
4.1 KiB
C

#ifndef SM_TYPES_H
#define SM_TYPES_H
#include <stdbool.h>
#include <stdint.h>
#include "sm_limits.h"
typedef struct {
// +0x00: 1 -> mount read-only, 0 -> allow write.
uint32_t ro;
// +0x04: reserved in observed Shell/FSMP callers.
uint32_t reserved0;
// +0x08: logical budget/domain string, usually "game" or "system".
const char *budget_id;
// +0x10: reserved in observed Shell/FSMP callers.
uint32_t reserved1;
// +0x14: bitmask consumed by devpfs mount logic.
uint32_t flags;
// +0x18: optional "maxpkgszingib" value (GiB), 0 means not set.
uint64_t max_pkg_gib;
} devpfs_mount_opt_t;
typedef struct {
// Human-readable profile id for logs.
const char *name;
// Raw option payload mapped to FSMP mount behavior.
devpfs_mount_opt_t opt;
} devpfs_mount_profile_t;
typedef struct {
// Source object class (observed: 1=file, 2=device-like/special source).
uint16_t source_type;
// Layer descriptor flags (observed bit0 = no bitmap file path).
uint16_t flags;
// Must be zero.
uint32_t reserved0;
// Backing file or device path.
const char *path;
// Data start offset in backing object (bytes).
uint64_t offset;
// Data size exposed via this layer (bytes).
uint64_t size;
// Optional bitmap file path.
const char *bitmap_path;
// Bitmap offset in bitmap file (bytes).
uint64_t bitmap_offset;
// Bitmap size (bytes), 0 when bitmap is unused.
uint64_t bitmap_size;
} lvd_ioctl_layer_v0_t;
typedef struct {
// Protocol version for /dev/lvdctl ioctl payload (0 = V0/base attach).
uint32_t io_version;
// Input: usually -1 for auto-assign. Output: created lvd unit id.
int32_t device_id;
// User-visible sector size exported by /dev/lvdN.
uint32_t sector_size;
// Secondary unit/granularity validated against sector_size.
uint32_t secondary_unit;
// Normalized attach flags produced from wrapper raw options.
uint16_t flags;
// LVD image type id (validator accepts 0..0xC).
uint16_t image_type;
// Number of valid entries in layers_ptr.
uint32_t layer_count;
// Total exported virtual size (bytes).
uint64_t device_size;
// Pointer to V0 layer array in user payload.
lvd_ioctl_layer_v0_t *layers_ptr;
} lvd_ioctl_attach_v0_t;
typedef struct {
// Must be zero.
uint32_t reserved0;
// Target lvd unit id to detach.
int32_t device_id;
// Reserved padding required by kernel ABI.
uint8_t reserved[0x20];
} lvd_ioctl_detach_t;
struct AppDbTitleList {
char(*ids)[MAX_TITLE_ID];
int count;
int capacity;
};
typedef struct scan_candidate {
char path[MAX_PATH];
char title_id[MAX_TITLE_ID];
char title_name[MAX_TITLE_NAME];
char manual_source_path[MAX_PATH];
bool installed;
bool in_app_db;
bool manual;
} scan_candidate_t;
typedef enum {
ATTACH_BACKEND_NONE = 0,
// /dev/lvdctl -> /dev/lvdN
ATTACH_BACKEND_LVD,
// /dev/mdctl -> /dev/mdN
ATTACH_BACKEND_MD,
} attach_backend_t;
typedef struct runtime_config {
bool debug_enabled;
bool quiet_mode;
bool mount_read_only;
bool force_mount;
bool app_install_all_enabled;
bool app_install_all_forced;
bool backport_fakelib_enabled;
bool global_fakelib_enabled;
bool global_fakelib_mount_first;
bool kstuff_game_auto_toggle;
bool kstuff_crash_detection_enabled;
bool legacy_recursive_scan_forced;
char global_fakelib_path[MAX_PATH];
uint32_t global_fakelib_exclude_title_count;
char global_fakelib_exclude_title_ids[MAX_FAKELIB_EXCLUDE_RULES][MAX_TITLE_ID];
uint32_t scan_depth;
uint32_t scan_interval_us;
uint32_t stability_wait_seconds;
uint32_t kstuff_pause_delay_image_seconds;
uint32_t kstuff_pause_delay_direct_seconds;
attach_backend_t exfat_backend;
attach_backend_t ufs_backend;
uint32_t lvd_sector_exfat;
uint32_t lvd_sector_ufs;
uint32_t lvd_sector_pfs;
uint32_t md_sector_exfat;
uint32_t md_sector_ufs;
} runtime_config_t;
typedef enum {
IMAGE_FS_UNKNOWN = 0,
IMAGE_FS_UFS,
IMAGE_FS_EXFAT,
IMAGE_FS_PFS,
IMAGE_FS_PFSC_CONTAINER,
} image_fs_type_t;
typedef struct sm_error {
int code;
char subsystem[16];
char message[256];
char path[MAX_PATH];
bool valid;
bool notified;
} sm_error_t;
#endif