docs: initial re-write of all documentation
This commit is contained in:
33
docs/components/modules/ams_mitm.md
Normal file
33
docs/components/modules/ams_mitm.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# ams_mitm
|
||||
This module provides methods to intercept services provided by other system modules. It is further sub-divided according to the service it targets.
|
||||
|
||||
## bpc_mitm
|
||||
bpc_mitm enables intercepting requests to power control services. It currently intercepts:
|
||||
+ "am" system module (to intercept the Reboot/Power buttons in the overlay menu)
|
||||
+ "fatal" system module (to simplify payload reboot logic significantly)
|
||||
+ Homebrew Loader (to allow homebrew to take advantage of the feature)
|
||||
|
||||
## fs_mitm
|
||||
fs_mitm enables intercepting file system operations. It can log, deny, delay, replace, or redirect any request made to the file system. It enables LayeredFS to function, which allows for replacement of game assets.
|
||||
|
||||
## hid_mitm
|
||||
hid_mitm enables intercepting requests to controller device services. It currently intercepts:
|
||||
+ Homebrew Loader (to help homebrew not need to be recompiled due to a breaking change introduced in the past)
|
||||
|
||||
## ns_mitm
|
||||
ns_mitm enables intercepting requests to application control services. It currently intercepts:
|
||||
+ Web Applets (to facilitate hbl web browser launching)
|
||||
|
||||
## set_mitm
|
||||
set_mitm enables intercepting requests to the system settings service. It currently intercepts:
|
||||
+ "ns" system module and games (to allow for overriding game locales)
|
||||
+ All settings requests
|
||||
|
||||
### Firmware Version
|
||||
set_mitm intercepts the `GetFirmwareVersion` command, if the requester is `qlaunch` or `maintenance`.
|
||||
It modifies the `display_version` field of the returned system version, causing the version to display
|
||||
in settings as `#.#.# (AMS #.#.#)`. This allows users to easily verify what version of Atmosphère they are running.
|
||||
|
||||
### System Settings
|
||||
set_mitm intercepts the `GetSettingsItemValueSize` and `GetSettingsItemValue` commands for all requesters.
|
||||
It does so in order to enable user configuration of system settings, which are parsed from `/atmosphere/system_settings.ini` on boot. See [here](../../features/configurations.md) for more information on the system settings format.
|
||||
4
docs/components/modules/boot.md
Normal file
4
docs/components/modules/boot.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# boot
|
||||
This module is a reimplementation of the Horizon OS's "boot" system module, which is responsible for initializing and configuring hardware.
|
||||
|
||||
Atmosphère's reimplementation displays its own black and white splash screen and battery icons as replacements for the original assets used during display initialization.
|
||||
4
docs/components/modules/boot2.md
Normal file
4
docs/components/modules/boot2.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# boot2
|
||||
This module is a reimplementation of the Horizon OS's "boot2" system module, which is responsible for launching all the other necessary system modules.
|
||||
|
||||
Atmosphère's reimplementation allows launching user provided system modules from the SD card. See [here](../../features/configurations.md) for more information.
|
||||
4
docs/components/modules/creport.md
Normal file
4
docs/components/modules/creport.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# creport
|
||||
This module is a reimplementation of the Horizon OS's "creport" system module, which is responsible for managing crash reports.
|
||||
|
||||
Atmosphère's reimplementation redirects writing of generated crash reports to the SD card under the folder `/atmosphere/crash_reports/`. It also prevents the automatic uploading of said crash reports.
|
||||
42
docs/components/modules/dmnt.md
Normal file
42
docs/components/modules/dmnt.md
Normal file
@@ -0,0 +1,42 @@
|
||||
# dmnt
|
||||
This module is a reimplementation of the Horizon OS's "dmnt" system module, which provides a debug monitor.
|
||||
|
||||
## Extensions
|
||||
Atmosphère implements an extension to provide cheat code functionality.
|
||||
|
||||
### Cheat Service
|
||||
A HIPC service API is provided for interacting with the cheat code manager through the service `dmnt:cht`. See [here](../../features/cheats.md) for more information on the cheat code format.
|
||||
|
||||
The SwIPC definition for `dmnt:cht` follows:
|
||||
```
|
||||
interface ams::dmnt::cheat::CheatService is dmnt:cht {
|
||||
[65000] HasCheatProcess() -> sf::Out<bool> out;
|
||||
[65001] GetCheatProcessEvent() -> sf::OutCopyHandle out_event;
|
||||
[65002] GetCheatProcessMetadata() -> sf::Out<CheatProcessMetadata> out_metadata;
|
||||
[65003] ForceOpenCheatProcess();
|
||||
[65004] PauseCheatProcess();
|
||||
[65005] ResumeCheatProcess();
|
||||
|
||||
[65100] GetCheatProcessMappingCount() -> sf::Out<u64> out_count;
|
||||
[65101] GetCheatProcessMappings(u64 offset) -> sf::OutArray<MemoryInfo> &mappings, sf::Out<u64> out_count;
|
||||
[65102] ReadCheatProcessMemory(u64 address, u64 out_size) -> sf::OutBuffer &buffer;
|
||||
[65103] WriteCheatProcessMemory(sf::InBuffer &buffer, u64 address, u64 in_size);
|
||||
[65104] QueryCheatProcessMemory(u64 address) -> sf::Out<MemoryInfo> mapping;
|
||||
|
||||
[65200] GetCheatCount() -> sf::Out<u64> out_count;
|
||||
[65201] GetCheats(u64 offset) -> sf::OutArray<CheatEntry> &cheats, sf::Out<u64> out_count;
|
||||
[65202] GetCheatById(u32 cheat_id) -> sf::Out<CheatEntry> cheat;
|
||||
[65203] ToggleCheat(u32 cheat_id);
|
||||
[65204] AddCheat(CheatDefinition &cheat, bool enabled) -> sf::Out<u32> out_cheat_id;
|
||||
[65205] RemoveCheat(u32 cheat_id);
|
||||
[65206] ReadStaticRegister(u8 which) -> sf::Out<u64> out;
|
||||
[65207] WriteStaticRegister(u8 which, u64 value);
|
||||
[65208] ResetStaticRegisters();
|
||||
|
||||
[65300] GetFrozenAddressCount() -> sf::Out<u64> out_count;
|
||||
[65301] GetFrozenAddresses(u64 offset) ->sf::OutArray<FrozenAddressEntry> &addresses, sf::Out<u64> out_count;
|
||||
[65302] GetFrozenAddress(u64 address) -> sf::Out<FrozenAddressEntry> entry;
|
||||
[65303] EnableFrozenAddress(u64 address, u64 width) -> sf::Out<u64> out_value;
|
||||
[65304] DisableFrozenAddress(u64 address);
|
||||
}
|
||||
```
|
||||
4
docs/components/modules/eclct.stub.md
Normal file
4
docs/components/modules/eclct.stub.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# eclct.stub
|
||||
This module is a reimplementation of the Horizon OS's "eclct" system module, which collects error reports.
|
||||
|
||||
Atmosphère's reimplementation is a stub to remove any and all functionality pertaining to error report collection.
|
||||
4
docs/components/modules/erpt.md
Normal file
4
docs/components/modules/erpt.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# erpt
|
||||
This module is a reimplementation of the Horizon OS's "erpt" system module, which is responsible for managing error reports.
|
||||
|
||||
Atmosphère's reimplementation redirects writing of generated error reports to the SD card under the folder `/atmosphere/erpt_reports/`.
|
||||
4
docs/components/modules/fatal.md
Normal file
4
docs/components/modules/fatal.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# fatal
|
||||
This module is a reimplementation of the Horizon OS's "fatal" system module, which is responsible for managing fatal reports.
|
||||
|
||||
Atmosphère's reimplementation prevents error report creation and draws a custom error screen, showing registers and a backtrace. It also attempts to gather debugging info for any and all crashes and tries to save reports to the SD card under the folder `/atmosphere/fatal_reports/` (if a crash report was not generated).
|
||||
4
docs/components/modules/jpegdec.md
Normal file
4
docs/components/modules/jpegdec.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# jpegdec
|
||||
This module is a reimplementation of the Horizon OS's "jpegdec" system module, which is responsible for JPEG format decoding.
|
||||
|
||||
Atmosphère's reimplementation allows two sessions instead of 1, so homebrew can use it for software JPEG decoding in addition to the OS itself.
|
||||
77
docs/components/modules/loader.md
Normal file
77
docs/components/modules/loader.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# loader
|
||||
This module is a reimplementation of the Horizon OS's "ldr" system module, which is responsible for creating processes from executable NSO images and registering their access control.
|
||||
|
||||
## Extensions
|
||||
Atmosphère extends this module to allow executables to be replaced or patched by files stored on the SD card. Note that a few services are required for SD card access and therefore cannot be replaced or patched in this manner.
|
||||
|
||||
### Exefs Replacement
|
||||
When a process is created, loader will search for several NSO filenames in the program's exefs directory.
|
||||
These filenames are, in this order:
|
||||
- rtld
|
||||
- main
|
||||
- subsdk0
|
||||
- subsdk1
|
||||
- ...
|
||||
- subsdk9
|
||||
- sdk
|
||||
|
||||
Each NSO that is found will be loaded into the process contiguously. The process's entrypoint is at the first NSO to be loaded, usually `rtld` or `main`.
|
||||
|
||||
Additionally, when a process is loaded, loader will search for a `main.npdm` file in the exefs directory specifying the program's permissions.
|
||||
|
||||
Atmosphère extends this functionality by also searching for these files on the SD card. When searching for a file, loader will first check if it exists on the SD card. If it does, that file will be used instead. Otherwise, it will use the copy located in the exefs, if that is present. The following directory will be searched:
|
||||
```
|
||||
/atmosphere/contents/<program id>/exefs/
|
||||
```
|
||||
|
||||
This allows the replacement of applets, system modules, or even games with homebrew versions.
|
||||
|
||||
In order to prevent an NSO from being loaded even if it exists in the exefs, loader will also check if a stub file exists. If such a file exists, the NSO will not be loaded. The files should be named like `rtld.stub`, `main.stub`, etc. and may be empty.
|
||||
|
||||
### NSO Patching
|
||||
When an NSO is loaded, Atmosphère's reimplementation will search for IPS patch files on the SD card in the following locations.
|
||||
```
|
||||
/atmosphere/exefs_patches/<patchset name>/<nso build id>.ips
|
||||
```
|
||||
This organization allows patch sets affecting multiple NSOs to be distributed as a single directory. Patches will be searched for in each patch set directory. The name of each patch file should match the hexadecimal build ID of the NSO to affect, except that trailing zero bytes may be left off. Because the NSO build ID is unique for every NSO, this means patches will only apply to the files they are meant to apply to.
|
||||
|
||||
Patch files are accepted in either IPS format or IPS32 format.
|
||||
|
||||
Because NSO files are compressed, patch files are not made between the original version of a compressed NSO and the modified version of such an NSO. Instead, they are made between the uncompressed version of an NSO and the modified (and still uncompressed) version of that NSO. This also means that a patch file cannot be manually applied to the compressed version of an NSO; it must be applied to the uncompressed version. Atmosphère's reimplementation will correctly apply these patches while loading the process regardless of whether the NSO it finds is compressed or not.
|
||||
|
||||
When authoring patches, [hactool](https://github.com/SciresM/hactool) can be used to find an NSO's build ID and to uncompress NSOs. Recent versions of the [ReSwitched IDA loaders](https://github.com/reswitched/loaders) can be used to load uncompressed NSOs into IDA in such a way that you can [apply patches to the input file](https://www.hex-rays.com/products/ida/support/idadoc/1618.shtml). From there, any IPS tool can be used to create the patch between the original NSO and the patched NSO. Note that if the NSO you are patching is larger than 16 MiB, you will have to use a tool that supports IPS32.
|
||||
|
||||
### HBL Support
|
||||
Atmosphère provides first class support for [hbmenu](https://github.com/switchbrew/nx-hbmenu/releases) and [hbloader](https://github.com/switchbrew/nx-hbloader/releases).
|
||||
|
||||
In addition, loader has extensions to enable homebrew to launch web applets. This normally requires the application launching the applet to have HTML Manual content inside an installed NCA. Atmosphère's reimplementation will automatically ensure that the commands used to check this succeed, and will redirect the relevant file system to the `/atmosphere/hbl_html/` subdirectory.
|
||||
|
||||
### IPC Commands
|
||||
Atmosphère's reimplementation extends the HIPC loader services' API with several custom commands.
|
||||
|
||||
The SwIPC definition for the `ldr:pm` extension commands follows:
|
||||
```
|
||||
interface ams::ldr::pm::ProcessManagerInterface is ldr:pm {
|
||||
...
|
||||
[65000] AtmosphereHasLaunchedProgram(ncm::ProgramId program_id) -> sf::Out<bool> out;
|
||||
[65001] AtmosphereGetProgramInfo(ncm::ProgramLocation &loc) -> sf::Out<ProgramInfo> out_program_info, sf::Out<cfg::OverrideStatus> out_status;
|
||||
[65002] AtmospherePinProgram(ncm::ProgramLocation &loc, cfg::OverrideStatus &override_status) -> sf::Out<PinId> out_id;
|
||||
}
|
||||
```
|
||||
|
||||
The SwIPC definition for the `ldr:dmnt` extension commands follows:
|
||||
```
|
||||
interface ams::ldr::dmnt::DebugMonitorInterface is ldr:dmnt {
|
||||
...
|
||||
[65000] AtmosphereHasLaunchedProgram(ncm::ProgramId program_id) -> sf::Out<bool> out;
|
||||
}
|
||||
```
|
||||
|
||||
The SwIPC definition for the `ldr:shel` extension commands follows:
|
||||
```
|
||||
interface ams::ldr::shell::ShellInterface is ldr:shel {
|
||||
...
|
||||
[65000] AtmosphereRegisterExternalCode(ncm::ProgramId program_id) -> sf::OutMoveHandle out;
|
||||
[65001] AtmosphereUnregisterExternalCode(ncm::ProgramId program_id);
|
||||
}
|
||||
```
|
||||
4
docs/components/modules/ncm.md
Normal file
4
docs/components/modules/ncm.md
Normal file
@@ -0,0 +1,4 @@
|
||||
# ncm
|
||||
This module is a reimplementation of the Horizon OS's "ncm" system module, which is responsible content management.
|
||||
|
||||
Atmosphère's reimplementation is currently opt-in only. See [here](../../features/configurations.md) for more information.
|
||||
2
docs/components/modules/pgl.md
Normal file
2
docs/components/modules/pgl.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# pgl
|
||||
This module is a reimplementation of the Horizon OS's "pgl" system module, which is responsible for launching programs.
|
||||
30
docs/components/modules/pm.md
Normal file
30
docs/components/modules/pm.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# pm
|
||||
This module is a reimplementation of the Horizon OS's "pm" system module, which is responsible for tracking running processes on the system, and managing resource limits.
|
||||
|
||||
## Extensions
|
||||
Atmosphère extends this module with extra IPC commands and memory restriction changes.
|
||||
|
||||
### IPC Commands
|
||||
Atmosphère's reimplementation extends the HIPC loader services' API with several custom commands.
|
||||
|
||||
The SwIPC definition for the `pm:dmnt` extension commands follows:
|
||||
```
|
||||
interface ams::pm::dmnt::DebugMonitorServiceBase is pm:dmnt {
|
||||
...
|
||||
[65000] AtmosphereGetProcessInfo(os::ProcessId process_id) -> sf::OutCopyHandle out_process_handle, sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status;
|
||||
[65001] AtmosphereGetCurrentLimitInfo(u32 group, u32 resource) -> sf::Out<s64> out_cur_val, sf::Out<s64> out_lim_val;
|
||||
}
|
||||
```
|
||||
|
||||
The SwIPC definition for the `pm:info` extension commands follows:
|
||||
```
|
||||
interface ams::pm::info::InformationService is pm:info {
|
||||
...
|
||||
[65000] AtmosphereGetProcessId(ncm::ProgramId program_id) -> sf::Out<os::ProcessId> out;
|
||||
[65001] AtmosphereHasLaunchedProgram(ncm::ProgramId program_id) -> sf::Out<bool> out;
|
||||
[65002] AtmosphereGetProcessInfo(os::ProcessId process_id) -> sf::Out<ncm::ProgramLocation> out_loc, sf::Out<cfg::OverrideStatus> out_status;
|
||||
}
|
||||
```
|
||||
|
||||
### Extra System Memory
|
||||
Atmosphère's reimplementation shrinks the APPLET memory pool by 24 MiB by default, giving this memory to the SYSTEM pool. This allows custom system modules to use more memory without hitting the SYSTEM memory limit.
|
||||
14
docs/components/modules/ro.md
Normal file
14
docs/components/modules/ro.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# ro
|
||||
This module is a reimplementation of the Horizon OS's "ro" system module, which is responsible for loading dynamic libraries.
|
||||
|
||||
## Extensions
|
||||
Atmosphère extends this module to allow libraries to be patched by files stored on the SD card.
|
||||
|
||||
### NRO Patching
|
||||
When an NRO is loaded, Atmosphère's reimplementation will search for IPS patch files on the SD card in the following locations.
|
||||
```
|
||||
/atmosphere/nro_patches/<patchset name>/<nro build id>.ips
|
||||
```
|
||||
This organization allows patch sets affecting multiple NROs to be distributed as a single directory. Patches will be searched for in each patch set directory. The name of each patch file should match the hexadecimal build ID of the NRO to affect, except that trailing zero bytes may be left off. Because the NRO build ID is unique for every NRO, this means patches will only apply to the files they are meant to apply to.
|
||||
|
||||
Patch files are accepted in either IPS format or IPS32 format.
|
||||
47
docs/components/modules/sm.md
Normal file
47
docs/components/modules/sm.md
Normal file
@@ -0,0 +1,47 @@
|
||||
# sm
|
||||
This module is a reimplementation of the Horizon OS's "sm" system module, which is responsible for service management.
|
||||
|
||||
## Extensions
|
||||
Atmosphère extends this module with extra IPC commands and new services.
|
||||
|
||||
### Debug Monitor
|
||||
Atmosphère's reimplementation provides an interface `sm:dmnt` to allow a debug monitor to query the service manager's state.
|
||||
|
||||
The SwIPC definition for `sm:dmnt` follows:
|
||||
```
|
||||
interface ams::sm::DmntService is sm:dmnt {
|
||||
[65000] AtmosphereGetRecord(ServiceName service) -> sf::Out<ServiceRecord> record;
|
||||
[65001] AtmosphereListRecords(u64 offset) -> sf::OutArray<ServiceRecord> &records, sf::Out<u64> out_count;
|
||||
[65002] AtmosphereGetRecordSize() -> sf::Out<u64> record_size;
|
||||
}
|
||||
```
|
||||
|
||||
### IPC Commands
|
||||
Atmosphère's reimplementation extends the HIPC loader services' API with several custom commands.
|
||||
|
||||
The SwIPC definition for the `sm:` extension commands follows:
|
||||
```
|
||||
interface ams::sm::UserService is sm: {
|
||||
...
|
||||
[65000] AtmosphereInstallMitm(ServiceName service) -> sf::OutMoveHandle srv_h, sf::OutMoveHandle qry_h;
|
||||
[65001] AtmosphereUninstallMitm(ServiceName service);
|
||||
[65002] Deprecated_AtmosphereAssociatePidTidForMitm();
|
||||
[65003] AtmosphereAcknowledgeMitmSession(ServiceName service) -> sf::Out<MitmProcessInfo> client_info, sf::OutMoveHandle fwd_h;
|
||||
[65004] AtmosphereHasMitm(ServiceName service) -> sf::Out<bool> out;
|
||||
[65005] AtmosphereWaitMitm(ServiceName service);
|
||||
[65006] AtmosphereDeclareFutureMitm(ServiceName service);
|
||||
|
||||
[65100] AtmosphereHasService(ServiceName service) -> sf::Out<bool> out;
|
||||
[65101] AtmosphereWaitService(ServiceName service);
|
||||
}
|
||||
```
|
||||
|
||||
The SwIPC definition for the `sm:m` extension commands follows:
|
||||
```
|
||||
interface ams::sm::ManagerService is sm:m {
|
||||
...
|
||||
[65000] AtmosphereEndInitDefers(os::ProcessId process_id, sf::InBuffer &acid_sac, sf::InBuffer &aci_sac);
|
||||
[65001] AtmosphereHasMitm(ServiceName service) -> sf::Out<bool> out;
|
||||
[65002] AtmosphereRegisterProcess(os::ProcessId process_id, ncm::ProgramId program_id, cfg::OverrideStatus override_status, sf::InBuffer &acid_sac, sf::InBuffer &aci_sac);
|
||||
}
|
||||
```
|
||||
2
docs/components/modules/spl.md
Normal file
2
docs/components/modules/spl.md
Normal file
@@ -0,0 +1,2 @@
|
||||
# spl
|
||||
This module is a reimplementation of the Horizon OS's "spl" system module, which is responsible for providing secure platform services such as cryptographic operations.
|
||||
Reference in New Issue
Block a user