From 28b494dadc5cbcc74ba47784872b0b58ca89d7a3 Mon Sep 17 00:00:00 2001 From: gibbed Date: Mon, 26 Nov 2018 10:21:09 -0600 Subject: [PATCH] [Kernel] Stub XMsg app 0x000000FE/msg 0x00020021. --- src/xenia/kernel/xam/app_manager.cc | 4 +- src/xenia/kernel/xam/apps/unknown_fe_app.cc | 55 +++++++++++++++++++++ src/xenia/kernel/xam/apps/unknown_fe_app.h | 34 +++++++++++++ 3 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/xenia/kernel/xam/apps/unknown_fe_app.cc create mode 100644 src/xenia/kernel/xam/apps/unknown_fe_app.h diff --git a/src/xenia/kernel/xam/app_manager.cc b/src/xenia/kernel/xam/app_manager.cc index e83740776..fc18ca729 100644 --- a/src/xenia/kernel/xam/app_manager.cc +++ b/src/xenia/kernel/xam/app_manager.cc @@ -10,6 +10,7 @@ #include "xenia/kernel/xam/app_manager.h" #include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/xam/apps/unknown_fe_app.h" #include "xenia/kernel/xam/apps/xgi_app.h" #include "xenia/kernel/xam/apps/xlivebase_app.h" #include "xenia/kernel/xam/apps/xmp_app.h" @@ -24,9 +25,10 @@ App::App(KernelState* kernel_state, uint32_t app_id) app_id_(app_id) {} void AppManager::RegisterApps(KernelState* kernel_state, AppManager* manager) { + manager->RegisterApp(std::make_unique(kernel_state)); manager->RegisterApp(std::make_unique(kernel_state)); manager->RegisterApp(std::make_unique(kernel_state)); - manager->RegisterApp(std::make_unique(kernel_state)); + manager->RegisterApp(std::make_unique(kernel_state)); } void AppManager::RegisterApp(std::unique_ptr app) { diff --git a/src/xenia/kernel/xam/apps/unknown_fe_app.cc b/src/xenia/kernel/xam/apps/unknown_fe_app.cc new file mode 100644 index 000000000..cb05a339e --- /dev/null +++ b/src/xenia/kernel/xam/apps/unknown_fe_app.cc @@ -0,0 +1,55 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2015 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#include "xenia/kernel/xam/apps/unknown_fe_app.h" + +#include "xenia/base/logging.h" +#include "xenia/base/threading.h" + +namespace xe { +namespace kernel { +namespace xam { +namespace apps { + +UnknownFEApp::UnknownFEApp(KernelState* kernel_state) + : App(kernel_state, 0xFE) {} + +X_RESULT UnknownFEApp::DispatchMessageSync(uint32_t message, + uint32_t buffer_ptr, + uint32_t buffer_length) { + // NOTE: buffer_length may be zero or valid. + auto buffer = memory_->TranslateVirtual(buffer_ptr); + switch (message) { + case 0x00020021: { + struct message_data { + char unk_00[64]; + xe::be unk_40; // KeGetCurrentProcessType() < 1 ? 1 : 0 + xe::be unk_44; // ? output_ptr ? + xe::be unk_48; // ? overlapped_ptr ? + }* data = reinterpret_cast(buffer); + assert_true(buffer_length == sizeof(message_data)); + auto unk = memory_->TranslateVirtual*>(data->unk_44); + *unk = 0; + XELOGD("UnknownFEApp(0x00020021)('%s', %.8X, %.8X, %.8X)", data->unk_00, + (uint32_t)data->unk_40, (uint32_t)data->unk_44, + (uint32_t)data->unk_48); + return X_ERROR_SUCCESS; + } + } + XELOGE( + "Unimplemented 0xFE message app=%.8X, msg=%.8X, arg1=%.8X, " + "arg2=%.8X", + app_id(), message, buffer_ptr, buffer_length); + return X_STATUS_UNSUCCESSFUL; +} + +} // namespace apps +} // namespace xam +} // namespace kernel +} // namespace xe diff --git a/src/xenia/kernel/xam/apps/unknown_fe_app.h b/src/xenia/kernel/xam/apps/unknown_fe_app.h new file mode 100644 index 000000000..f2d764f17 --- /dev/null +++ b/src/xenia/kernel/xam/apps/unknown_fe_app.h @@ -0,0 +1,34 @@ +/** + ****************************************************************************** + * Xenia : Xbox 360 Emulator Research Project * + ****************************************************************************** + * Copyright 2015 Ben Vanik. All rights reserved. * + * Released under the BSD license - see LICENSE in the root for more details. * + ****************************************************************************** + */ + +#ifndef XENIA_KERNEL_XAM_APPS_UNKNOWN_FE_APP_H_ +#define XENIA_KERNEL_XAM_APPS_UNKNOWN_FE_APP_H_ + +#include "xenia/kernel/kernel_state.h" +#include "xenia/kernel/xam/app_manager.h" + +namespace xe { +namespace kernel { +namespace xam { +namespace apps { + +class UnknownFEApp : public App { + public: + explicit UnknownFEApp(KernelState* kernel_state); + + X_RESULT DispatchMessageSync(uint32_t message, uint32_t buffer_ptr, + uint32_t buffer_length) override; +}; + +} // namespace apps +} // namespace xam +} // namespace kernel +} // namespace xe + +#endif // XENIA_KERNEL_XAM_APPS_UNKNOWN_FE_APP_H_