// Copyright 2017 plutoo #define NX_SERVICE_ASSUME_NON_DOMAIN #include "service_guard.h" #include "services/fatal.h" static Service g_smSrv; #define MAX_OVERRIDES 32 static struct { u64 name; Handle handle; } g_smOverrides[MAX_OVERRIDES]; static size_t g_smOverridesNum = 0; void smAddOverrideHandle(u64 name, Handle handle) { if (g_smOverridesNum == MAX_OVERRIDES) fatalSimple(MAKERESULT(Module_Libnx, LibnxError_TooManyOverrides)); size_t i = g_smOverridesNum; g_smOverrides[i].name = name; g_smOverrides[i].handle = handle; g_smOverridesNum++; } Handle smGetServiceOverride(u64 name) { size_t i; for (i=0; iown_handle = own_handle; } return rc; } Result smGetServiceOriginal(Handle* handle_out, u64 name) { const struct { u64 service_name; } in = { name }; return serviceDispatchIn(&g_smSrv, 1, in, .out_handle_attrs = { SfOutHandleAttr_HipcMove }, .out_handles = handle_out, ); } Result smRegisterService(Handle* handle_out, const char* name, bool is_light, int max_sessions) { const struct { u64 service_name; u32 is_light; u32 max_sessions; } in = { smEncodeName(name), !!is_light, max_sessions }; return serviceDispatchIn(&g_smSrv, 2, in, .out_handle_attrs = { SfOutHandleAttr_HipcMove }, .out_handles = handle_out, ); } Result smUnregisterService(const char* name) { const struct { u64 service_name; } in = { smEncodeName(name) }; return serviceDispatchIn(&g_smSrv, 3, in); }