2022-02-04 16:25:44 +01:00
|
|
|
#include "exports.h"
|
|
|
|
#include "../PluginManagement.h"
|
|
|
|
#include "../globals.h"
|
2020-12-26 14:17:50 +01:00
|
|
|
#include "../plugin/PluginDataFactory.h"
|
2022-02-04 16:25:44 +01:00
|
|
|
#include "../plugin/PluginMetaInformationFactory.h"
|
2022-05-14 14:00:20 +02:00
|
|
|
#include "utils.h"
|
2020-05-17 21:08:13 +02:00
|
|
|
#include <wums.h>
|
|
|
|
|
2022-05-14 14:00:20 +02:00
|
|
|
static void fillPluginInformation(plugin_information *out, const std::unique_ptr<PluginMetaInformation> &metaInformation) {
|
2021-10-01 17:25:48 +02:00
|
|
|
out->plugin_information_version = PLUGIN_INFORMATION_VERSION;
|
2021-09-25 14:26:18 +02:00
|
|
|
strncpy(out->author, metaInformation->getAuthor().c_str(), sizeof(out->author) - 1);
|
|
|
|
strncpy(out->buildTimestamp, metaInformation->getBuildTimestamp().c_str(), sizeof(out->buildTimestamp) - 1);
|
|
|
|
strncpy(out->description, metaInformation->getDescription().c_str(), sizeof(out->description) - 1);
|
|
|
|
strncpy(out->name, metaInformation->getName().c_str(), sizeof(out->name) - 1);
|
|
|
|
strncpy(out->license, metaInformation->getLicense().c_str(), sizeof(out->license) - 1);
|
|
|
|
strncpy(out->version, metaInformation->getVersion().c_str(), sizeof(out->version) - 1);
|
2021-10-01 17:25:48 +02:00
|
|
|
strncpy(out->storageId, metaInformation->getStorageId().c_str(), sizeof(out->storageId) - 1);
|
2020-05-17 21:08:13 +02:00
|
|
|
out->size = metaInformation->getSize();
|
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSLoadAndLinkByDataHandle(const plugin_data_handle *plugin_data_handle_list, uint32_t plugin_data_handle_list_size) {
|
2022-05-14 14:00:20 +02:00
|
|
|
if (plugin_data_handle_list == nullptr || plugin_data_handle_list_size == 0) {
|
2020-05-17 21:08:13 +02:00
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
2022-05-14 14:00:20 +02:00
|
|
|
std::lock_guard<std::mutex> lock(gLoadedDataMutex);
|
|
|
|
for (uint32_t i = 0; i < plugin_data_handle_list_size; i++) {
|
|
|
|
auto handle = plugin_data_handle_list[i];
|
|
|
|
bool found = false;
|
|
|
|
|
|
|
|
for (auto &pluginData : gLoadedData) {
|
|
|
|
if (pluginData->getHandle() == handle) {
|
|
|
|
gLoadOnNextLaunch.push_front(pluginData);
|
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!found) {
|
|
|
|
DEBUG_FUNCTION_LINE_ERR("Failed to get plugin data for handle %08X. Skipping it.", handle);
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-14 14:00:20 +02:00
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSDeletePluginData(const plugin_data_handle *plugin_data_handle_list, uint32_t plugin_data_handle_list_size) {
|
2020-12-26 14:17:50 +01:00
|
|
|
if (plugin_data_handle_list != nullptr && plugin_data_handle_list_size != 0) {
|
2020-05-17 21:08:13 +02:00
|
|
|
for (uint32_t i = 0; i < plugin_data_handle_list_size; i++) {
|
2022-05-14 14:00:20 +02:00
|
|
|
auto handle = plugin_data_handle_list[i];
|
|
|
|
|
|
|
|
if (!remove_locked_first_if(gLoadedDataMutex, gLoadedData, [handle](auto &cur) { return cur->getHandle() == handle; })) {
|
|
|
|
DEBUG_FUNCTION_LINE_ERR("Failed to delete plugin data by handle %08X", handle);
|
|
|
|
}
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
}
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSLoadPluginAsData(GetPluginInformationInputType inputType, const char *path, char *buffer, size_t size, plugin_data_handle *out) {
|
2022-05-14 14:00:20 +02:00
|
|
|
if (out == nullptr) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::optional<std::unique_ptr<PluginData>> pluginData;
|
2021-01-10 13:17:47 +01:00
|
|
|
if (inputType == PLUGIN_INFORMATION_INPUT_TYPE_PATH && path != nullptr) {
|
2022-05-14 14:00:20 +02:00
|
|
|
pluginData = PluginDataFactory::load(path);
|
2021-01-10 13:17:47 +01:00
|
|
|
} else if (inputType == PLUGIN_INFORMATION_INPUT_TYPE_BUFFER && buffer != nullptr && size > 0) {
|
2020-05-17 21:08:13 +02:00
|
|
|
std::vector<uint8_t> data(size);
|
|
|
|
memcpy(&data[0], buffer, size);
|
2023-08-16 10:18:02 +02:00
|
|
|
pluginData = PluginDataFactory::load(data, "<UNKNOWN>");
|
2020-05-17 21:08:13 +02:00
|
|
|
} else {
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!pluginData) {
|
2022-04-22 22:55:53 +02:00
|
|
|
DEBUG_FUNCTION_LINE_ERR("PLUGIN_BACKEND_API_ERROR_FAILED_ALLOC");
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_FAILED_ALLOC;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2022-05-14 14:00:20 +02:00
|
|
|
else {
|
|
|
|
*out = pluginData.value()->getHandle();
|
|
|
|
gLoadedData.push_front(std::move(pluginData.value()));
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSLoadPluginAsDataByPath(plugin_data_handle *output, const char *path) {
|
2020-12-26 14:17:50 +01:00
|
|
|
return WUPSLoadPluginAsData(PLUGIN_INFORMATION_INPUT_TYPE_PATH, path, nullptr, 0, output);
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSLoadPluginAsDataByBuffer(plugin_data_handle *output, char *buffer, size_t size) {
|
2020-12-26 14:17:50 +01:00
|
|
|
return WUPSLoadPluginAsData(PLUGIN_INFORMATION_INPUT_TYPE_BUFFER, nullptr, buffer, size, output);
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-09-25 14:26:18 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetPluginMetaInformation(GetPluginInformationInputType inputType, const char *path, char *buffer, size_t size, plugin_information *output) {
|
2022-05-14 14:00:20 +02:00
|
|
|
std::optional<std::unique_ptr<PluginMetaInformation>> pluginInfo;
|
2023-08-16 10:18:02 +02:00
|
|
|
PluginParseErrors error = PLUGIN_PARSE_ERROR_UNKNOWN;
|
2020-12-26 14:17:50 +01:00
|
|
|
if (inputType == PLUGIN_INFORMATION_INPUT_TYPE_PATH && path != nullptr) {
|
|
|
|
std::string pathStr(path);
|
2023-08-16 10:18:02 +02:00
|
|
|
pluginInfo = PluginMetaInformationFactory::loadPlugin(pathStr, error);
|
2020-12-26 14:17:50 +01:00
|
|
|
} else if (inputType == PLUGIN_INFORMATION_INPUT_TYPE_BUFFER && buffer != nullptr && size > 0) {
|
2023-08-16 10:18:02 +02:00
|
|
|
pluginInfo = PluginMetaInformationFactory::loadPlugin(buffer, size, error);
|
2020-05-17 21:08:13 +02:00
|
|
|
} else {
|
2022-04-22 22:55:53 +02:00
|
|
|
DEBUG_FUNCTION_LINE_ERR("PLUGIN_BACKEND_API_ERROR_INVALID_ARG");
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!pluginInfo) {
|
2022-04-22 22:55:53 +02:00
|
|
|
DEBUG_FUNCTION_LINE_ERR("PLUGIN_BACKEND_API_ERROR_FILE_NOT_FOUND");
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_FILE_NOT_FOUND;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2020-12-26 14:17:50 +01:00
|
|
|
if (output == nullptr) {
|
2022-04-22 22:55:53 +02:00
|
|
|
DEBUG_FUNCTION_LINE_ERR("PLUGIN_BACKEND_API_ERROR_INVALID_ARG");
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
2020-05-17 21:08:13 +02:00
|
|
|
} else {
|
2021-12-15 17:09:30 +01:00
|
|
|
fillPluginInformation(output, pluginInfo.value());
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetPluginMetaInformationByPath(plugin_information *output, const char *path) {
|
2020-12-26 14:17:50 +01:00
|
|
|
return WUPSGetPluginMetaInformation(PLUGIN_INFORMATION_INPUT_TYPE_PATH, path, nullptr, 0, output);
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetPluginMetaInformationByBuffer(plugin_information *output, char *buffer, size_t size) {
|
2020-12-26 14:17:50 +01:00
|
|
|
return WUPSGetPluginMetaInformation(PLUGIN_INFORMATION_INPUT_TYPE_BUFFER, nullptr, buffer, size, output);
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetPluginDataForContainerHandles(const plugin_container_handle *plugin_container_handle_list, plugin_data_handle *plugin_data_list, uint32_t buffer_size) {
|
|
|
|
PluginBackendApiErrorType res = PLUGIN_BACKEND_API_ERROR_NONE;
|
2022-05-14 14:00:20 +02:00
|
|
|
if (plugin_container_handle_list == nullptr || buffer_size == 0) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
std::lock_guard<std::mutex> lock(gLoadedDataMutex);
|
|
|
|
for (uint32_t i = 0; i < buffer_size; /* only increase on success*/) {
|
|
|
|
auto handle = plugin_container_handle_list[i];
|
|
|
|
bool found = false;
|
|
|
|
for (auto &curContainer : gLoadedPlugins) {
|
|
|
|
if (curContainer->getHandle() == handle) {
|
|
|
|
auto &pluginData = curContainer->getPluginData();
|
|
|
|
plugin_data_list[i] = (uint32_t) pluginData->getHandle();
|
|
|
|
gLoadedData.push_front(pluginData);
|
|
|
|
found = true;
|
|
|
|
i++;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!found) {
|
|
|
|
DEBUG_FUNCTION_LINE_ERR("Failed to get container for handle %08X", handle);
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
}
|
2022-05-14 14:00:20 +02:00
|
|
|
|
2020-05-17 21:08:13 +02:00
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2021-04-07 00:23:23 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetMetaInformation(const plugin_container_handle *plugin_container_handle_list, plugin_information *plugin_information_list, uint32_t buffer_size) {
|
|
|
|
PluginBackendApiErrorType res = PLUGIN_BACKEND_API_ERROR_NONE;
|
2020-12-26 14:17:50 +01:00
|
|
|
if (plugin_container_handle_list != nullptr && buffer_size != 0) {
|
2020-05-17 21:08:13 +02:00
|
|
|
for (uint32_t i = 0; i < buffer_size; i++) {
|
2022-05-14 14:00:20 +02:00
|
|
|
auto handle = plugin_container_handle_list[i];
|
|
|
|
bool found = false;
|
|
|
|
for (auto &curContainer : gLoadedPlugins) {
|
|
|
|
if (curContainer->getHandle() == handle) {
|
|
|
|
auto &metaInfo = curContainer->getMetaInformation();
|
|
|
|
|
|
|
|
plugin_information_list[i].plugin_information_version = PLUGIN_INFORMATION_VERSION;
|
|
|
|
strncpy(plugin_information_list[i].storageId, metaInfo->getStorageId().c_str(), sizeof(plugin_information_list[i].storageId) - 1);
|
|
|
|
strncpy(plugin_information_list[i].author, metaInfo->getAuthor().c_str(), sizeof(plugin_information_list[i].author) - 1);
|
|
|
|
strncpy(plugin_information_list[i].buildTimestamp, metaInfo->getBuildTimestamp().c_str(), sizeof(plugin_information_list[i].buildTimestamp) - 1);
|
|
|
|
strncpy(plugin_information_list[i].description, metaInfo->getDescription().c_str(), sizeof(plugin_information_list[i].description) - 1);
|
|
|
|
strncpy(plugin_information_list[i].name, metaInfo->getName().c_str(), sizeof(plugin_information_list[i].name) - 1);
|
|
|
|
strncpy(plugin_information_list[i].license, metaInfo->getLicense().c_str(), sizeof(plugin_information_list[i].license) - 1);
|
|
|
|
strncpy(plugin_information_list[i].version, metaInfo->getVersion().c_str(), sizeof(plugin_information_list[i].version) - 1);
|
|
|
|
plugin_information_list[i].size = metaInfo->getSize();
|
|
|
|
found = true;
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!found) {
|
|
|
|
DEBUG_FUNCTION_LINE_ERR("FAILED TO FIND CONTAINER FOR HANDLE %08X", handle);
|
|
|
|
}
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
} else {
|
2022-04-22 22:55:53 +02:00
|
|
|
DEBUG_FUNCTION_LINE_ERR("PLUGIN_BACKEND_API_ERROR_INVALID_ARG");
|
2021-04-07 00:23:23 +02:00
|
|
|
res = PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2021-10-01 17:25:48 +02:00
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetLoadedPlugins(plugin_container_handle *io_handles, uint32_t buffer_size, uint32_t *outSize, uint32_t *plugin_information_version) {
|
|
|
|
if (plugin_information_version == nullptr) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
*plugin_information_version = PLUGIN_INFORMATION_VERSION;
|
2022-05-14 14:00:20 +02:00
|
|
|
auto &plugins = gLoadedPlugins;
|
2022-02-04 16:25:44 +01:00
|
|
|
uint32_t counter = 0;
|
|
|
|
for (auto &plugin : plugins) {
|
2020-05-17 21:08:13 +02:00
|
|
|
if (counter < buffer_size) {
|
2022-05-14 14:00:20 +02:00
|
|
|
io_handles[counter] = plugin->getHandle();
|
2020-05-17 21:08:13 +02:00
|
|
|
counter++;
|
|
|
|
} else {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2020-12-26 14:17:50 +01:00
|
|
|
if (outSize != nullptr) {
|
2020-05-17 21:08:13 +02:00
|
|
|
*outSize = counter;
|
|
|
|
}
|
2021-04-07 00:23:23 +02:00
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
2020-05-17 21:08:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSLoadPluginAsDataByPath);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSLoadPluginAsDataByBuffer);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSLoadPluginAsData);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSLoadAndLinkByDataHandle);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSDeletePluginData);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetPluginMetaInformation);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetPluginMetaInformationByPath);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetPluginMetaInformationByBuffer);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetMetaInformation);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetLoadedPlugins);
|
2023-02-17 17:30:28 +01:00
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetPluginDataForContainerHandles);
|
|
|
|
|
|
|
|
// API 2.0
|
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetAPIVersion(WUPSBackendAPIVersion *outVersion) {
|
|
|
|
if (outVersion == nullptr) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
*outVersion = 2;
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetNumberOfLoadedPlugins(uint32_t *outCount) {
|
|
|
|
if (outCount == nullptr) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
*outCount = gLoadedPlugins.size();
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetSectionInformationForPlugin(const plugin_container_handle handle, plugin_section_info *plugin_section_list, uint32_t buffer_size, uint32_t *out_count) {
|
|
|
|
PluginBackendApiErrorType res = PLUGIN_BACKEND_API_ERROR_NONE;
|
|
|
|
if (out_count != nullptr) {
|
|
|
|
*out_count = 0;
|
|
|
|
}
|
|
|
|
if (handle != 0 && plugin_section_list != nullptr && buffer_size != 0) {
|
|
|
|
bool found = false;
|
|
|
|
for (auto &curContainer : gLoadedPlugins) {
|
|
|
|
if (curContainer->getHandle() == handle) {
|
|
|
|
found = true;
|
|
|
|
auto §ionInfoList = curContainer->getPluginInformation()->getSectionInfoList();
|
|
|
|
|
|
|
|
uint32_t offset = 0;
|
|
|
|
for (auto const &[key, sectionInfo] : sectionInfoList) {
|
|
|
|
if (offset >= buffer_size) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
plugin_section_list[offset].plugin_section_info_version = PLUGIN_SECTION_INFORMATION_VERSION;
|
|
|
|
strncpy(plugin_section_list[offset].name, sectionInfo->getName().c_str(), sizeof(plugin_section_list[offset].name) - 1);
|
|
|
|
plugin_section_list[offset].address = (void *) sectionInfo->getAddress();
|
|
|
|
plugin_section_list[offset].size = sectionInfo->getSize();
|
|
|
|
offset++;
|
|
|
|
}
|
|
|
|
if (out_count != nullptr) {
|
|
|
|
*out_count = offset;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!found) {
|
|
|
|
res = PLUGIN_BACKEND_API_INVALID_HANDLE;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
res = PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" PluginBackendApiErrorType WUPSWillReloadPluginsOnNextLaunch(bool *out) {
|
|
|
|
if (out == nullptr) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
std::lock_guard<std::mutex> lock(gLoadedDataMutex);
|
|
|
|
*out = !gLoadOnNextLaunch.empty();
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
|
|
|
}
|
|
|
|
|
|
|
|
extern "C" PluginBackendApiErrorType WUPSGetSectionMemoryAddresses(plugin_container_handle handle, void **textAddress, void **dataAddress) {
|
|
|
|
if (handle == 0 || textAddress == nullptr || dataAddress == nullptr) {
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
for (auto &curContainer : gLoadedPlugins) {
|
|
|
|
if (curContainer->getHandle() == handle) {
|
|
|
|
*textAddress = curContainer->getPluginInformation()->getTextMemoryAddress();
|
|
|
|
*dataAddress = curContainer->getPluginInformation()->getDataMemoryAddress();
|
|
|
|
return PLUGIN_BACKEND_API_ERROR_NONE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return PLUGIN_BACKEND_API_INVALID_HANDLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetAPIVersion);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetNumberOfLoadedPlugins);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetSectionInformationForPlugin);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSWillReloadPluginsOnNextLaunch);
|
|
|
|
WUMS_EXPORT_FUNCTION(WUPSGetSectionMemoryAddresses);
|