Add version check to make sure the lib is comaptible with the loaded module

This commit is contained in:
Maschell 2022-04-28 19:47:16 +02:00
parent faa0eb1422
commit c9c3ba3f71
2 changed files with 30 additions and 0 deletions

View File

@ -15,8 +15,12 @@ enum SDUtilsStatus {
SDUTILS_RESULT_INVALID_ARGUMENT = -5,
SDUTILS_RESULT_FAILED = -10,
SDUTILS_RESULT_LIB_UNINITIALIZED = -20,
SDUTILS_RESULT_UNSUPPORTED_VERSION = -99,
};
typedef uint32_t SDUtilsVersion;
#define SDUTILS_MODULE_VERSION 0x00000001
enum SDUtilsAttachStatus {
SDUTILS_ATTACH_MOUNTED = 1,
SDUTILS_ATTACH_UNMOUNTED = 0,
@ -32,6 +36,12 @@ typedef void (*SDAttachHandlerFn)(SDUtilsAttachStatus status);
*/
SDUtilsStatus SDUtils_Init();
/**
* Returns the API Version of the WUHBUtils Module.
* @return The WUHBUtilsVersion of the Module
*/
SDUtilsVersion SDUtils_GetVersion();
/**
* Deinitializes the SDUtils library, must be called before exiting the application
* @return SDUTILS_RESULT_SUCCESS on success

View File

@ -5,6 +5,8 @@
static OSDynLoad_Module sModuleHandle = nullptr;
static SDUtilsVersion (*sSDUtilsGetVersion)() = nullptr;
static bool (*sSDUtilsAddAttachHandler)(SDAttachHandlerFn) = nullptr;
static bool (*sSDUtilsRemoveAttachHandler)(SDAttachHandlerFn) = nullptr;
@ -14,6 +16,15 @@ SDUtilsStatus SDUtils_Init() {
return SDUTILS_RESULT_MODULE_NOT_FOUND;
}
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsGetVersion", (void **) &sSDUtilsGetVersion) != OS_DYNLOAD_OK) {
OSReport("SDUtils_Init: SDUtilsGetVersion failed.\n");
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
}
auto res = SDUtils_GetVersion();
if (res != SDUTILS_MODULE_VERSION) {
return SDUTILS_RESULT_UNSUPPORTED_VERSION;
}
if (OSDynLoad_FindExport(sModuleHandle, FALSE, "SDUtilsAddAttachHandler", (void **) &sSDUtilsAddAttachHandler) != OS_DYNLOAD_OK) {
OSReport("SDUtils_Init: SDUtilsAddAttachHandler failed.\n");
return SDUTILS_RESULT_MODULE_MISSING_EXPORT;
@ -27,6 +38,15 @@ SDUtilsStatus SDUtils_Init() {
return SDUTILS_RESULT_SUCCESS;
}
SDUtilsVersion GetVersion();
SDUtilsVersion SDUtils_GetVersion() {
if (sSDUtilsGetVersion == nullptr) {
return SDUTILS_RESULT_LIB_UNINITIALIZED;
}
return reinterpret_cast<decltype(&GetVersion)>(sSDUtilsGetVersion)();
}
SDUtilsStatus SDUtils_DeInit() {
// We don't need to release the OSDynLoad handle for modules.
return SDUTILS_RESULT_SUCCESS;