2013-01-13 08:25:41 +01:00
|
|
|
/**
|
|
|
|
|
******************************************************************************
|
|
|
|
|
* Xenia : Xbox 360 Emulator Research Project *
|
|
|
|
|
******************************************************************************
|
|
|
|
|
* Copyright 2013 Ben Vanik. All rights reserved. *
|
|
|
|
|
* Released under the BSD license - see LICENSE in the root for more details. *
|
|
|
|
|
******************************************************************************
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
#include <xenia/kernel/export.h>
|
|
|
|
|
|
|
|
|
|
|
2013-01-20 10:13:59 +01:00
|
|
|
using namespace xe;
|
|
|
|
|
using namespace xe::kernel;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool KernelExport::IsImplemented() {
|
|
|
|
|
switch (type) {
|
|
|
|
|
case Function:
|
|
|
|
|
if (function_data.impl) {
|
2013-01-13 08:25:41 +01:00
|
|
|
return true;
|
|
|
|
|
}
|
2013-01-20 10:13:59 +01:00
|
|
|
break;
|
|
|
|
|
case Variable:
|
|
|
|
|
if (variable_data) {
|
2013-01-13 08:25:41 +01:00
|
|
|
return true;
|
|
|
|
|
}
|
2013-01-20 10:13:59 +01:00
|
|
|
break;
|
2013-01-13 08:25:41 +01:00
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2013-01-20 10:13:59 +01:00
|
|
|
ExportResolver::ExportResolver() {
|
2013-01-13 08:25:41 +01:00
|
|
|
}
|
|
|
|
|
|
2013-01-20 10:13:59 +01:00
|
|
|
ExportResolver::~ExportResolver() {
|
2013-01-13 08:25:41 +01:00
|
|
|
}
|
|
|
|
|
|
2013-01-20 10:13:59 +01:00
|
|
|
void ExportResolver::RegisterTable(
|
|
|
|
|
const char* library_name, KernelExport* exports, const size_t count) {
|
|
|
|
|
ExportTable table;
|
|
|
|
|
XEIGNORE(xestrcpya(table.name, XECOUNT(table.name), library_name));
|
|
|
|
|
table.exports = exports;
|
|
|
|
|
table.count = count;
|
|
|
|
|
tables_.push_back(table);
|
2013-01-13 08:25:41 +01:00
|
|
|
}
|
|
|
|
|
|
2013-01-20 10:13:59 +01:00
|
|
|
KernelExport* ExportResolver::GetExportByOrdinal(const char* library_name,
|
|
|
|
|
const uint32_t ordinal) {
|
|
|
|
|
for (std::vector<ExportTable>::iterator it = tables_.begin();
|
|
|
|
|
it != tables_.end(); ++it) {
|
|
|
|
|
if (!xestrcmp(library_name, it->name)) {
|
|
|
|
|
// TODO(benvanik): binary search?
|
|
|
|
|
for (size_t n = 0; n < it->count; n++) {
|
|
|
|
|
if (it->exports[n].ordinal == ordinal) {
|
|
|
|
|
return &it->exports[n];
|
2013-01-13 08:25:41 +01:00
|
|
|
}
|
|
|
|
|
}
|
2013-01-20 10:13:59 +01:00
|
|
|
return NULL;
|
2013-01-13 08:25:41 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2013-01-20 10:13:59 +01:00
|
|
|
KernelExport* ExportResolver::GetExportByName(const char* library_name,
|
|
|
|
|
const char* name) {
|
|
|
|
|
// TODO(benvanik): lookup by name.
|
|
|
|
|
XEASSERTALWAYS();
|
2013-01-13 08:25:41 +01:00
|
|
|
return NULL;
|
|
|
|
|
}
|