mirror of
https://github.com/switchbrew/libnx.git
synced 2025-06-23 13:22:40 +02:00
sm: add smDetachClient (#509)
This commit is contained in:
parent
83dc9203dc
commit
2d470ee2af
@ -124,6 +124,13 @@ Result smRegisterService(Handle* handle_out, SmServiceName name, bool is_light,
|
|||||||
*/
|
*/
|
||||||
Result smUnregisterService(SmServiceName name);
|
Result smUnregisterService(SmServiceName name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Detaches the current SM session.
|
||||||
|
* @note After this function is called, the rest of the SM API cannot be used.
|
||||||
|
* @note Only available on [11.0.0+].
|
||||||
|
*/
|
||||||
|
Result smDetachClient(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Gets the Service session used to communicate with SM.
|
* @brief Gets the Service session used to communicate with SM.
|
||||||
* @return Pointer to service session used to communicate with SM.
|
* @return Pointer to service session used to communicate with SM.
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
#define NX_SERVICE_ASSUME_NON_DOMAIN
|
#define NX_SERVICE_ASSUME_NON_DOMAIN
|
||||||
#include "service_guard.h"
|
#include "service_guard.h"
|
||||||
|
#include "runtime/hosversion.h"
|
||||||
#include "runtime/diag.h"
|
#include "runtime/diag.h"
|
||||||
|
|
||||||
static Service g_smSrv;
|
static Service g_smSrv;
|
||||||
@ -35,6 +36,11 @@ Handle smGetServiceOverride(SmServiceName name) {
|
|||||||
|
|
||||||
NX_GENERATE_SERVICE_GUARD(sm);
|
NX_GENERATE_SERVICE_GUARD(sm);
|
||||||
|
|
||||||
|
static Result _smCmdInPid(u32 cmd_id) {
|
||||||
|
u64 pid_placeholder = 0;
|
||||||
|
return serviceDispatchIn(&g_smSrv, cmd_id, pid_placeholder, .in_send_pid = true);
|
||||||
|
}
|
||||||
|
|
||||||
Result _smInitialize(void) {
|
Result _smInitialize(void) {
|
||||||
Handle sm_handle;
|
Handle sm_handle;
|
||||||
Result rc = svcConnectToNamedPort(&sm_handle, "sm:");
|
Result rc = svcConnectToNamedPort(&sm_handle, "sm:");
|
||||||
@ -49,8 +55,7 @@ Result _smInitialize(void) {
|
|||||||
|
|
||||||
Handle tmp;
|
Handle tmp;
|
||||||
if (R_SUCCEEDED(rc) && R_VALUE(smGetServiceOriginal(&tmp, (SmServiceName){})) == 0x415) {
|
if (R_SUCCEEDED(rc) && R_VALUE(smGetServiceOriginal(&tmp, (SmServiceName){})) == 0x415) {
|
||||||
u64 pid_placeholder = 0;
|
rc = _smCmdInPid(0);
|
||||||
rc = serviceDispatchIn(&g_smSrv, 0, pid_placeholder, .in_send_pid = true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
@ -105,3 +110,8 @@ Result smRegisterService(Handle* handle_out, SmServiceName name, bool is_light,
|
|||||||
Result smUnregisterService(SmServiceName name) {
|
Result smUnregisterService(SmServiceName name) {
|
||||||
return serviceDispatchIn(&g_smSrv, 3, name);
|
return serviceDispatchIn(&g_smSrv, 3, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Result smDetachClient(void) {
|
||||||
|
if (hosversionBefore(11,0,0)) return MAKERESULT(Module_Libnx, LibnxError_IncompatSysVer);
|
||||||
|
return _smCmdInPid(4);
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user