libnx/nx/include/switch/runtime/env.h

120 lines
4.4 KiB
C

/**
* @file env.h
* @brief Homebrew environment definitions and utilities.
* @author plutoo
* @copyright libnx Authors
*/
#pragma once
#include "../types.h"
#include "../services/acc.h"
/// Structure representing an entry in the homebrew environment configuration.
typedef struct {
u32 Key; ///< Type of entry
u32 Flags; ///< Entry flags
u64 Value[2]; ///< Entry arguments (type-specific)
} ConfigEntry;
/// Entry flags
enum {
EntryFlag_IsMandatory = BIT(0), ///< Specifies that the entry **must** be processed by the homebrew application.
};
///< Types of entry
enum {
EntryType_EndOfList=0, ///< Entry list terminator.
EntryType_MainThreadHandle=1, ///< Provides the handle to the main thread.
EntryType_NextLoadPath=2, ///< Provides a buffer containing information about the next homebrew application to load.
EntryType_OverrideHeap=3, ///< Provides heap override information.
EntryType_OverrideService=4, ///< Provides service override information.
EntryType_Argv=5, ///< Provides argv.
EntryType_SyscallAvailableHint=6, ///< Provides syscall availability hints (SVCs 0x00..0x7F).
EntryType_AppletType=7, ///< Provides APT applet type.
EntryType_AppletWorkaround=8, ///< Indicates that APT is broken and should not be used.
EntryType_Reserved9=9, ///< Unused/reserved entry type, formerly used by StdioSockets.
EntryType_ProcessHandle=10, ///< Provides the process handle.
EntryType_LastLoadResult=11, ///< Provides the last load result.
EntryType_RandomSeed=14, ///< Provides random data used to seed the pseudo-random number generator.
EntryType_UserIdStorage=15, ///< Provides persistent storage for the preselected user id.
EntryType_HosVersion=16, ///< Provides the currently running Horizon OS version.
EntryType_SyscallAvailableHint2=17, ///< Provides syscall availability hints (SVCs 0x80..0xBF).
};
enum {
EnvAppletFlags_ApplicationOverride = BIT(0) ///< Use AppletType_Application instead of AppletType_SystemApplication.
};
/// Loader return function.
typedef void NORETURN (*LoaderReturnFn)(int result_code);
/**
* @brief Parses the homebrew loader environment block (internally called).
* @param ctx Reserved.
* @param main_thread Reserved.
* @param saved_lr Reserved.
*/
void envSetup(void* ctx, Handle main_thread, LoaderReturnFn saved_lr);
/// Returns information text about the loader, if present.
const char* envGetLoaderInfo(void);
/// Returns the size of the loader information text.
u64 envGetLoaderInfoSize(void);
/// Retrieves the handle to the main thread.
Handle envGetMainThreadHandle(void);
/// Returns true if the application is running as NSO, otherwise NRO.
bool envIsNso(void);
/// Returns true if the environment has a heap override.
bool envHasHeapOverride(void);
/// Returns the address of the overriden heap.
void* envGetHeapOverrideAddr(void);
/// Returns the size of the overriden heap.
u64 envGetHeapOverrideSize(void);
/// Returns true if the environment has an argv array.
bool envHasArgv(void);
/// Returns the pointer to the argv array.
void* envGetArgv(void);
/**
* @brief Returns whether a syscall is hinted to be available.
* @param svc Syscall number to test.
* @returns true if the syscall is available.
*/
bool envIsSyscallHinted(unsigned svc);
/// Returns the handle to the running homebrew process.
Handle envGetOwnProcessHandle(void);
/// Returns the loader's return function, to be called on program exit.
LoaderReturnFn envGetExitFuncPtr(void);
/// Sets the return function to be called on program exit.
void envSetExitFuncPtr(LoaderReturnFn addr);
/**
* @brief Configures the next homebrew application to load.
* @param path Path to the next homebrew application to load (.nro).
* @param argv Argument string to pass.
*/
Result envSetNextLoad(const char* path, const char* argv);
/// Returns true if the environment supports envSetNextLoad.
bool envHasNextLoad(void);
/// Returns the Result from the last NRO.
Result envGetLastLoadResult(void);
/// Returns true if the environment provides a random seed.
bool envHasRandomSeed(void);
/**
* @brief Retrieves the random seed provided by the environment.
* @param out Pointer to a u64[2] buffer which will contain the random seed on return.
*/
void envGetRandomSeed(u64 out[2]);
/// Returns a pointer to the user id storage area (if present).
AccountUid* envGetUserIdStorage(void);