libstrat: fix domain issues. in/out objects now work.

This commit is contained in:
Michael Scire
2019-10-23 00:07:20 -07:00
committed by SciresM
parent 4f455dacf4
commit 15773e4755
23 changed files with 161 additions and 113 deletions

View File

@@ -31,7 +31,7 @@ namespace sts::cfg {
/* Mount the SD card. */
FsFileSystem sd_fs = {};
if (R_FAILED(fsMountSdcard(&sd_fs))) {
if (R_FAILED(fsOpenSdCardFileSystem(&sd_fs))) {
return false;
}
ON_SCOPE_EXIT { serviceClose(&sd_fs.s); };

View File

@@ -178,7 +178,7 @@ namespace sts::cfg {
void ParseIniFile(util::ini::Handler handler, const char *path, void *user_ctx) {
/* Mount the SD card. */
FsFileSystem sd_fs = {};
if (R_FAILED(fsMountSdcard(&sd_fs))) {
if (R_FAILED(fsOpenSdCardFileSystem(&sd_fs))) {
return;
}
ON_SCOPE_EXIT { serviceClose(&sd_fs.s); };

View File

@@ -58,14 +58,14 @@ namespace sts::cfg {
Result TryInitializeSdCard() {
R_TRY(CheckSdCardServicesReady());
R_ASSERT(fsMountSdcard(&g_sd_card_filesystem));
R_ASSERT(fsOpenSdCardFileSystem(&g_sd_card_filesystem));
g_sd_card_initialized = true;
return ResultSuccess;
}
void InitializeSdCard() {
WaitSdCardServicesReadyImpl();
R_ASSERT(fsMountSdcard(&g_sd_card_filesystem));
R_ASSERT(fsOpenSdCardFileSystem(&g_sd_card_filesystem));
g_sd_card_initialized = true;
}

View File

@@ -37,6 +37,7 @@ Result dmntchtHasCheatProcess(bool *out) {
u8 tmp;
Result rc = serviceDispatchOut(&g_dmntchtSrv, 65000, tmp);
if (R_SUCCEEDED(rc) && out) *out = tmp & 1;
return rc;
}
Result dmntchtGetCheatProcessEvent(Event *event) {
@@ -47,7 +48,7 @@ Result dmntchtGetCheatProcessEvent(Event *event) {
);
if (R_SUCCEEDED(rc)) {
eventLoadRemote(&g_dmntchtSrv, evt_handle, true);
eventLoadRemote(event, evt_handle, true);
}
return rc;
@@ -77,11 +78,11 @@ static Result _dmntchtCmdInU32NoOut(u32 in, u32 cmd_id) {
}
Result dmntchtGetCheatProcessMappingCount(u64 *out_count) {
return _dmntchtGetCount(65100, out_count);
return _dmntchtGetCount(out_count, 65100);
}
Result dmntchtGetCheatProcessMappings(MemoryInfo *buffer, u64 max_count, u64 offset, u64 *out_count) {
return _dmntchtGetEntries(65101, buffer, sizeof(*buffer) * max_count, offset, out_count);
return _dmntchtGetEntries(buffer, sizeof(*buffer) * max_count, offset, out_count, 65101);
}
Result dmntchtReadCheatProcessMemory(u64 address, void *buffer, size_t size) {
@@ -111,11 +112,11 @@ Result dmntchtQueryCheatProcessMemory(MemoryInfo *mem_info, u64 address){
}
Result dmntchtGetCheatCount(u64 *out_count) {
return _dmntchtGetCount(65200, out_count);
return _dmntchtGetCount(out_count, 65200);
}
Result dmntchtGetCheats(DmntCheatEntry *buffer, u64 max_count, u64 offset, u64 *out_count) {
return _dmntchtGetEntries(65201, buffer, sizeof(*buffer) * max_count, offset, out_count);
return _dmntchtGetEntries(buffer, sizeof(*buffer) * max_count, offset, out_count, 65201);
}
Result dmntchtGetCheatById(DmntCheatEntry *out, u32 cheat_id) {
@@ -142,11 +143,11 @@ Result dmntchtRemoveCheat(u32 cheat_id) {
}
Result dmntchtGetFrozenAddressCount(u64 *out_count) {
return _dmntchtGetCount(65300, out_count);
return _dmntchtGetCount(out_count, 65300);
}
Result dmntchtGetFrozenAddresses(DmntFrozenAddressEntry *buffer, u64 max_count, u64 offset, u64 *out_count) {
return _dmntchtGetEntries(65301, buffer, sizeof(*buffer) * max_count, offset, out_count);
return _dmntchtGetEntries(buffer, sizeof(*buffer) * max_count, offset, out_count, 65301);
}
Result dmntchtGetFrozenAddress(DmntFrozenAddressEntry *out, u64 address) {

View File

@@ -90,6 +90,7 @@ namespace sts::sf::cmif {
if (entry == nullptr) {
return ServiceObjectHolder();
}
{
std::scoped_lock lk(this->manager->entry_owner_lock);
if (entry->owner != this) {
@@ -116,9 +117,11 @@ namespace sts::sf::cmif {
ServerDomainManager::Entry *ServerDomainManager::EntryManager::AllocateEntry() {
std::scoped_lock lk(this->lock);
if (this->free_list.empty()) {
return nullptr;
}
Entry *e = &this->free_list.front();
this->free_list.pop_front();
return e;

View File

@@ -48,6 +48,7 @@ namespace sts::sf::cmif {
} else {
ctx.processor->SetImplementationProcessor(&domain_processor);
}
ctx.srv_obj = target_object.GetServiceObjectUnsafe();
return target_object.ProcessMessage(ctx, in_message_raw_data);
}
case CmifDomainRequestType_Close:
@@ -86,6 +87,7 @@ namespace sts::sf::cmif {
} else {
ctx.processor->SetImplementationProcessor(&domain_processor);
}
ctx.srv_obj = target_object.GetServiceObjectUnsafe();
return target_object.ProcessMessage(ctx, in_message_raw_data);
}
case CmifDomainRequestType_Close:
@@ -136,7 +138,7 @@ namespace sts::sf::cmif {
/* Set output raw data. */
out_raw_data = cmif::PointerAndSize(raw_data.GetAddress() + out_header_size, raw_data.GetSize() - out_header_size);
this->out_object_ids = reinterpret_cast<DomainObjectId *>(out_raw_data.GetAddress() + out_raw_data.GetSize());
this->out_object_ids = reinterpret_cast<DomainObjectId *>(out_raw_data.GetAddress() + impl_out_data_total_size);
return request;
}

View File

@@ -47,10 +47,7 @@ namespace sts::sf::hipc {
R_ASSERT(tagged_manager->RegisterSession(server_handle, std::move(clone)));
} else {
/* Clone the forward service. */
std::shared_ptr<::Service> new_forward_service(new ::Service(), [](::Service *srv) {
serviceClose(srv);
delete srv;
});
std::shared_ptr<::Service> new_forward_service = std::move(ServerSession::CreateForwardService());
R_ASSERT(serviceClone(this->session->forward_service.get(), new_forward_service.get()));
R_ASSERT(tagged_manager->RegisterMitmSession(server_handle, std::move(clone), std::move(new_forward_service)));
}
@@ -138,10 +135,7 @@ namespace sts::sf::hipc {
R_ASSERT(hipc::CreateSession(&server_handle, out.GetHandlePointer()));
/* Register. */
std::shared_ptr<::Service> new_forward_service(new ::Service(), [](::Service *srv) {
serviceClose(srv);
delete srv;
});
std::shared_ptr<::Service> new_forward_service = std::move(ServerSession::CreateForwardService());
serviceCreate(new_forward_service.get(), new_forward_target);
R_ASSERT(this->manager->RegisterMitmSession(server_handle, std::move(object), std::move(new_forward_service)));
}
@@ -178,7 +172,7 @@ namespace sts::sf::hipc {
/* Note: This is safe, as no additional references to the hipc manager can ever be stored. */
/* The shared pointer to stack object is definitely gross, though. */
impl::HipcManager hipc_manager(this, session);
return this->DispatchRequest(cmif::ServiceObjectHolder(std::shared_ptr<impl::HipcManager>(&hipc_manager, [](impl::HipcManager *) { /* Empty deleter. */ })), session, in_message, out_message);
return this->DispatchRequest(cmif::ServiceObjectHolder(std::move(ServiceObjectTraits<impl::HipcManager>::SharedPointerHelper::GetEmptyDeleteSharedPointer(&hipc_manager))), session, in_message, out_message);
}
}

View File

@@ -17,31 +17,31 @@
#include "../service_guard.h"
#include "sm_ams.h"
static Result _smAtmosphereCmdHas(bool *out, u64 service_name, u32 cmd_id) {
static Result _smAtmosphereCmdHas(bool *out, SmServiceName name, u32 cmd_id) {
u8 tmp;
Result rc = serviceDispatchInOut(smGetServiceSession(), cmd_id, service_name, tmp);
Result rc = serviceDispatchInOut(smGetServiceSession(), cmd_id, name, tmp);
if (R_SUCCEEDED(rc) && out) *out = tmp & 1;
return rc;
}
static Result _smAtmosphereCmdInServiceNameNoOut(u64 service_name, Service *srv, u32 cmd_id) {
return serviceDispatchIn(srv, cmd_id, service_name);
static Result _smAtmosphereCmdInServiceNameNoOut(SmServiceName name, Service *srv, u32 cmd_id) {
return serviceDispatchIn(srv, cmd_id, name);
}
Result smAtmosphereHasService(bool *out, const char *name) {
return _smAtmosphereCmdHas(out, smEncodeName(name), 65100);
Result smAtmosphereHasService(bool *out, SmServiceName name) {
return _smAtmosphereCmdHas(out, name, 65100);
}
Result smAtmosphereWaitService(const char *name) {
return _smAtmosphereCmdInServiceNameNoOut(smEncodeName(name), smGetServiceSession(), 65101);
Result smAtmosphereWaitService(SmServiceName name) {
return _smAtmosphereCmdInServiceNameNoOut(name, smGetServiceSession(), 65101);
}
Result smAtmosphereHasMitm(bool *out, const char *name) {
return _smAtmosphereCmdHas(out, smEncodeName(name), 65004);
Result smAtmosphereHasMitm(bool *out, SmServiceName name) {
return _smAtmosphereCmdHas(out, name, 65004);
}
Result smAtmosphereWaitMitm(const char *name) {
return _smAtmosphereCmdInServiceNameNoOut(smEncodeName(name), smGetServiceSession(), 65005);
Result smAtmosphereWaitMitm(SmServiceName name) {
return _smAtmosphereCmdInServiceNameNoOut(name, smGetServiceSession(), 65005);
}
static Service g_smAtmosphereMitmSrv;
@@ -76,10 +76,9 @@ Service* smAtmosphereMitmGetServiceSession(void) {
return &g_smAtmosphereMitmSrv;
}
Result smAtmosphereMitmInstall(Handle *handle_out, Handle *query_out, const char *name) {
const u64 in = smEncodeName(name);
Result smAtmosphereMitmInstall(Handle *handle_out, Handle *query_out, SmServiceName name) {
Handle tmp_handles[2];
Result rc = serviceDispatchIn(&g_smAtmosphereMitmSrv, 65000, in,
Result rc = serviceDispatchIn(&g_smAtmosphereMitmSrv, 65000, name,
.out_handle_attrs = { SfOutHandleAttr_HipcMove, SfOutHandleAttr_HipcMove },
.out_handles = tmp_handles,
);
@@ -92,22 +91,21 @@ Result smAtmosphereMitmInstall(Handle *handle_out, Handle *query_out, const char
return rc;
}
Result smAtmosphereMitmUninstall(const char *name) {
return _smAtmosphereCmdInServiceNameNoOut(smEncodeName(name), &g_smAtmosphereMitmSrv, 65001);
Result smAtmosphereMitmUninstall(SmServiceName name) {
return _smAtmosphereCmdInServiceNameNoOut(name, &g_smAtmosphereMitmSrv, 65001);
}
Result smAtmosphereMitmDeclareFuture(const char *name) {
return _smAtmosphereCmdInServiceNameNoOut(smEncodeName(name), &g_smAtmosphereMitmSrv, 65006);
Result smAtmosphereMitmDeclareFuture(SmServiceName name) {
return _smAtmosphereCmdInServiceNameNoOut(name, &g_smAtmosphereMitmSrv, 65006);
}
Result smAtmosphereMitmAcknowledgeSession(Service *srv_out, u64 *pid_out, u64 *tid_out, const char *name) {
const u64 in = smEncodeName(name);
Result smAtmosphereMitmAcknowledgeSession(Service *srv_out, u64 *pid_out, u64 *tid_out, SmServiceName name) {
struct {
u64 pid;
u64 tid;
} out;
Result rc = serviceDispatchInOut(&g_smAtmosphereMitmSrv, 65003, in, out,
Result rc = serviceDispatchInOut(&g_smAtmosphereMitmSrv, 65003, name, out,
.out_num_objects = 1,
.out_objects = srv_out,
);

View File

@@ -13,19 +13,19 @@
extern "C" {
#endif
Result smAtmosphereHasService(bool *out, const char *name);
Result smAtmosphereWaitService(const char *name);
Result smAtmosphereHasMitm(bool *out, const char *name);
Result smAtmosphereWaitMitm(const char *name);
Result smAtmosphereHasService(bool *out, SmServiceName name);
Result smAtmosphereWaitService(SmServiceName name);
Result smAtmosphereHasMitm(bool *out, SmServiceName name);
Result smAtmosphereWaitMitm(SmServiceName name);
Result smAtmosphereMitmInitialize(void);
void smAtmosphereMitmExit(void);
Service *smAtmosphereMitmGetServiceSession();
Result smAtmosphereMitmInstall(Handle *handle_out, Handle *query_out, const char *name);
Result smAtmosphereMitmUninstall(const char *name);
Result smAtmosphereMitmDeclareFuture(const char *name);
Result smAtmosphereMitmAcknowledgeSession(Service *srv_out, u64 *pid_out, u64 *tid_out, const char *name);
Result smAtmosphereMitmInstall(Handle *handle_out, Handle *query_out, SmServiceName name);
Result smAtmosphereMitmUninstall(SmServiceName name);
Result smAtmosphereMitmDeclareFuture(SmServiceName name);
Result smAtmosphereMitmAcknowledgeSession(Service *srv_out, u64 *pid_out, u64 *tid_out, SmServiceName name);
#ifdef __cplusplus
}

View File

@@ -26,32 +26,32 @@ namespace sts::sm {
/* Ordinary SM API. */
Result GetService(Service *out, ServiceName name) {
return impl::DoWithUserSession([&]() {
return smGetService(out, name.name);
return smGetServiceWrapper(out, impl::ConvertName(name));
});
}
Result RegisterService(Handle *out, ServiceName name, size_t max_sessions, bool is_light) {
return impl::DoWithUserSession([&]() {
return smRegisterService(out, name.name, is_light, static_cast<int>(max_sessions));
return smRegisterService(out, impl::ConvertName(name), is_light, static_cast<int>(max_sessions));
});
}
Result UnregisterService(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smUnregisterService(name.name);
return smUnregisterService(impl::ConvertName(name));
});
}
/* Atmosphere extensions. */
Result HasService(bool *out, ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereHasService(out, name.name);
return smAtmosphereHasService(out, impl::ConvertName(name));
});
}
Result WaitService(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereWaitService(name.name);
return smAtmosphereWaitService(impl::ConvertName(name));
});
}

View File

@@ -20,6 +20,7 @@
#include <stratosphere/sm/sm_manager_api.hpp>
#include "smm_ams.h"
#include "sm_utils.hpp"
namespace sts::sm::manager {
@@ -38,7 +39,7 @@ namespace sts::sm::manager {
}
Result HasMitm(bool *out, ServiceName name) {
return smManagerAtmosphereHasMitm(out, name.name);
return smManagerAtmosphereHasMitm(out, impl::ConvertName(name));
}
}

View File

@@ -26,37 +26,37 @@ namespace sts::sm::mitm {
/* Mitm API. */
Result InstallMitm(Handle *out_port, Handle *out_query, ServiceName name) {
return impl::DoWithMitmSession([&]() {
return smAtmosphereMitmInstall(out_port, out_query, name.name);
return smAtmosphereMitmInstall(out_port, out_query, impl::ConvertName(name));
});
}
Result UninstallMitm(ServiceName name) {
return impl::DoWithMitmSession([&]() {
return smAtmosphereMitmUninstall(name.name);
return smAtmosphereMitmUninstall(impl::ConvertName(name));
});
}
Result DeclareFutureMitm(ServiceName name) {
return impl::DoWithMitmSession([&]() {
return smAtmosphereMitmDeclareFuture(name.name);
return smAtmosphereMitmDeclareFuture(impl::ConvertName(name));
});
}
Result AcknowledgeSession(Service *out_service, os::ProcessId *out_pid, ncm::TitleId *out_tid, ServiceName name) {
return impl::DoWithMitmSession([&]() {
return smAtmosphereMitmAcknowledgeSession(out_service, &out_pid->value, &out_tid->value, name.name);
return smAtmosphereMitmAcknowledgeSession(out_service, &out_pid->value, &out_tid->value, impl::ConvertName(name));
});
}
Result HasMitm(bool *out, ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereHasMitm(out, name.name);
return smAtmosphereHasMitm(out, impl::ConvertName(name));
});
}
Result WaitMitm(ServiceName name) {
return impl::DoWithUserSession([&]() {
return smAtmosphereWaitMitm(name.name);
return smAtmosphereWaitMitm(impl::ConvertName(name));
});
}

View File

@@ -50,4 +50,11 @@ namespace sts::sm::impl {
}
}
NX_CONSTEXPR SmServiceName ConvertName(sm::ServiceName name) {
static_assert(sizeof(SmServiceName) == sizeof(sm::ServiceName));
SmServiceName ret = {};
__builtin_memcpy(&ret, &name, sizeof(sm::ServiceName));
return ret;
}
}

View File

@@ -36,13 +36,13 @@ Result smManagerAtmosphereRegisterProcess(u64 pid, u64 tid, const void *acid_sac
);
}
static Result _smManagerAtmosphereCmdHas(bool *out, u64 service_name, u32 cmd_id) {
static Result _smManagerAtmosphereCmdHas(bool *out, SmServiceName name, u32 cmd_id) {
u8 tmp;
Result rc = serviceDispatchInOut(smManagerGetServiceSession(), cmd_id, service_name, tmp);
Result rc = serviceDispatchInOut(smManagerGetServiceSession(), cmd_id, name, tmp);
if (R_SUCCEEDED(rc) && out) *out = tmp & 1;
return rc;
}
Result smManagerAtmosphereHasMitm(bool *out, const char* name) {
return _smManagerAtmosphereCmdHas(out, smEncodeName(name), 65001);
Result smManagerAtmosphereHasMitm(bool *out, SmServiceName name) {
return _smManagerAtmosphereCmdHas(out, name, 65001);
}

View File

@@ -13,7 +13,7 @@ extern "C" {
Result smManagerAtmosphereEndInitialDefers(void);
Result smManagerAtmosphereRegisterProcess(u64 pid, u64 tid, const void *acid_sac, size_t acid_sac_size, const void *aci_sac, size_t aci_sac_size);
Result smManagerAtmosphereHasMitm(bool *out, const char* name);
Result smManagerAtmosphereHasMitm(bool *out, SmServiceName name);
#ifdef __cplusplus
}