Unifying kernel modules and user modules to XModule. XexLoadImage/etc.
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
|
||||
#include <xenia/kernel/kernel_state.h>
|
||||
#include <xenia/kernel/xboxkrnl_private.h>
|
||||
#include <xenia/kernel/objects/xmodule.h>
|
||||
#include <xenia/kernel/objects/xuser_module.h>
|
||||
#include <xenia/kernel/util/shim_utils.h>
|
||||
#include <xenia/kernel/util/xex2.h>
|
||||
|
||||
@@ -131,7 +131,7 @@ int xeXexCheckExecutablePriviledge(uint32_t privilege) {
|
||||
// Privilege=6 -> 0x00000040 -> XEX_SYSTEM_INSECURE_SOCKETS
|
||||
uint32_t mask = 1 << privilege;
|
||||
|
||||
XModule* module = state->GetExecutableModule();
|
||||
XUserModule* module = state->GetExecutableModule();
|
||||
if (!module) {
|
||||
return 0;
|
||||
}
|
||||
@@ -209,6 +209,51 @@ SHIM_CALL XexGetModuleHandle_shim(
|
||||
// }
|
||||
|
||||
|
||||
SHIM_CALL XexLoadImage_shim(
|
||||
PPCContext* ppc_state, KernelState* state) {
|
||||
uint32_t module_name_ptr = SHIM_GET_ARG_32(0);
|
||||
const char* module_name = (const char*)SHIM_MEM_ADDR(module_name_ptr);
|
||||
uint32_t module_flags = SHIM_GET_ARG_32(1);
|
||||
uint32_t min_version = SHIM_GET_ARG_32(2);
|
||||
uint32_t handle_ptr = SHIM_GET_ARG_32(3);
|
||||
|
||||
XELOGD(
|
||||
"XexLoadImage(%s, %.8X, %.8X, %.8X)",
|
||||
module_name, module_flags, min_version, handle_ptr);
|
||||
|
||||
X_STATUS result = X_STATUS_NO_SUCH_FILE;
|
||||
|
||||
XModule* module = state->GetModule(module_name);
|
||||
if (module) {
|
||||
module->RetainHandle();
|
||||
SHIM_SET_MEM_32(handle_ptr, module->handle());
|
||||
module->Release();
|
||||
|
||||
result = X_STATUS_SUCCESS;
|
||||
} else {
|
||||
result = X_STATUS_NO_SUCH_FILE;
|
||||
}
|
||||
|
||||
SHIM_SET_RETURN(result);
|
||||
}
|
||||
|
||||
|
||||
SHIM_CALL XexUnloadImage_shim(
|
||||
PPCContext* ppc_state, KernelState* state) {
|
||||
uint32_t handle = SHIM_GET_ARG_32(0);
|
||||
|
||||
XELOGD(
|
||||
"XexUnloadImage(%.8X)",
|
||||
handle);
|
||||
|
||||
X_STATUS result = X_STATUS_INVALID_HANDLE;
|
||||
|
||||
result = state->object_table()->RemoveHandle(handle);
|
||||
|
||||
SHIM_SET_RETURN(result);
|
||||
}
|
||||
|
||||
|
||||
SHIM_CALL XexGetProcedureAddress_shim(
|
||||
PPCContext* ppc_state, KernelState* state) {
|
||||
uint32_t module_handle = SHIM_GET_ARG_32(0);
|
||||
@@ -233,7 +278,7 @@ SHIM_CALL XexGetProcedureAddress_shim(
|
||||
if (XSUCCEEDED(result)) {
|
||||
// TODO(benvanik): implement. May need to create stub functions on the fly.
|
||||
// module->GetProcAddressByOrdinal(ordinal);
|
||||
result = X_STATUS_INVALID_HANDLE;
|
||||
result = X_STATUS_NOT_IMPLEMENTED;
|
||||
}
|
||||
if (module) {
|
||||
module->Release();
|
||||
@@ -279,6 +324,8 @@ void xe::kernel::xboxkrnl::RegisterModuleExports(
|
||||
|
||||
SHIM_SET_MAPPING("xboxkrnl.exe", XexGetModuleHandle, state);
|
||||
// SHIM_SET_MAPPING("xboxkrnl.exe", XexGetModuleSection, state);
|
||||
SHIM_SET_MAPPING("xboxkrnl.exe", XexLoadImage, state);
|
||||
SHIM_SET_MAPPING("xboxkrnl.exe", XexUnloadImage, state);
|
||||
SHIM_SET_MAPPING("xboxkrnl.exe", XexGetProcedureAddress, state);
|
||||
|
||||
SHIM_SET_MAPPING("xboxkrnl.exe", ExRegisterTitleTerminateNotification, state);
|
||||
|
||||
Reference in New Issue
Block a user