Implemented this too (XexGetProcedureAddress)
This commit is contained in:
parent
49c8efdc6d
commit
be3d729831
|
@ -246,10 +246,15 @@ SHIM_CALL XexGetProcedureAddress_shim(PPCContext* ppc_state,
|
||||||
KernelState* state) {
|
KernelState* state) {
|
||||||
uint32_t module_handle = SHIM_GET_ARG_32(0);
|
uint32_t module_handle = SHIM_GET_ARG_32(0);
|
||||||
uint32_t ordinal = SHIM_GET_ARG_32(1);
|
uint32_t ordinal = SHIM_GET_ARG_32(1);
|
||||||
|
const char *name = (const char *)SHIM_MEM_ADDR(ordinal);
|
||||||
uint32_t out_function_ptr = SHIM_GET_ARG_32(2);
|
uint32_t out_function_ptr = SHIM_GET_ARG_32(2);
|
||||||
|
|
||||||
|
if (ordinal < 0x10000)
|
||||||
XELOGD("XexGetProcedureAddress(%.8X, %.8X, %.8X)", module_handle, ordinal,
|
XELOGD("XexGetProcedureAddress(%.8X, %.8X, %.8X)", module_handle, ordinal,
|
||||||
out_function_ptr);
|
out_function_ptr);
|
||||||
|
else
|
||||||
|
XELOGD("XexGetProcedureAddress(%.8X, %.8X(%s), %.8X)", module_handle, ordinal,
|
||||||
|
name, out_function_ptr);
|
||||||
|
|
||||||
X_STATUS result = X_STATUS_INVALID_HANDLE;
|
X_STATUS result = X_STATUS_INVALID_HANDLE;
|
||||||
SHIM_SET_MEM_32(out_function_ptr, 0xDEADF00D);
|
SHIM_SET_MEM_32(out_function_ptr, 0xDEADF00D);
|
||||||
|
@ -265,9 +270,24 @@ SHIM_CALL XexGetProcedureAddress_shim(PPCContext* ppc_state,
|
||||||
|
|
||||||
if (XSUCCEEDED(result)) {
|
if (XSUCCEEDED(result)) {
|
||||||
// TODO(benvanik): implement. May need to create stub functions on the fly.
|
// TODO(benvanik): implement. May need to create stub functions on the fly.
|
||||||
// module->GetProcAddressByOrdinal(ordinal);
|
if (ordinal < 0x10000) {
|
||||||
|
uint64_t ptr = (uint64_t)module->GetProcAddressByOrdinal(ordinal);
|
||||||
|
SHIM_SET_MEM_32(out_function_ptr, ptr);
|
||||||
result = X_STATUS_NOT_IMPLEMENTED;
|
result = X_STATUS_NOT_IMPLEMENTED;
|
||||||
|
} else {
|
||||||
|
// It's a name pointer instead.
|
||||||
|
uint64_t ptr = (uint64_t)module->GetProcAddressByName(name);
|
||||||
|
|
||||||
|
// FYI: We don't need to generate this function now. It'll
|
||||||
|
// be done automatically by xenia when it gets called
|
||||||
|
|
||||||
|
if (ptr) {
|
||||||
|
SHIM_SET_MEM_32(out_function_ptr, ptr);
|
||||||
|
result = X_STATUS_SUCCESS;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (module) {
|
if (module) {
|
||||||
module->Release();
|
module->Release();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue