#include "plugin_loader.h" #include "console.h" #include "command.h" #include "x64_dbg.h" static std::vector pluginList; static int curPluginHandle=0; static std::vector pluginCallbackList; static std::vector pluginCommandList; ///internal plugin functions void pluginload(const char* pluginDir) { char currentDir[deflen]=""; GetCurrentDirectoryA(deflen, currentDir); SetCurrentDirectoryA(pluginDir); char searchName[deflen]=""; #ifdef _WIN64 sprintf(searchName, "%s\\*.dp64", pluginDir); #else sprintf(searchName, "%s\\*.dp32", pluginDir); #endif // _WIN64 WIN32_FIND_DATA foundData; HANDLE hSearch=FindFirstFileA(searchName, &foundData); if(hSearch==INVALID_HANDLE_VALUE) { SetCurrentDirectoryA(currentDir); return; } PLUG_DATA pluginData; do { memset(&pluginData, 0, sizeof(PLUG_DATA)); pluginData.initStruct.pluginHandle=curPluginHandle; char szPluginPath[MAX_PATH]=""; sprintf(szPluginPath, "%s\\%s", pluginDir, foundData.cFileName); pluginData.hPlugin=LoadLibraryA(szPluginPath); //load the plugin library if(!pluginData.hPlugin) { dprintf("[PLUGIN] Failed to load plugin: %s\n", foundData.cFileName); continue; } pluginData.pluginit=(PLUGINIT)GetProcAddress(pluginData.hPlugin, "pluginit"); if(!pluginData.pluginit) { dprintf("[PLUGIN] Export \"pluginit\" not found in plugin: %s\n", foundData.cFileName); FreeLibrary(pluginData.hPlugin); continue; } pluginData.plugstop=(PLUGSTOP)GetProcAddress(pluginData.hPlugin, "plugstop"); //TODO: handle exceptions if(!pluginData.pluginit(&pluginData.initStruct)) { dprintf("[PLUGIN] pluginit failed for plugin: %s\n", foundData.cFileName); FreeLibrary(pluginData.hPlugin); continue; } else dprintf("[PLUGIN] %s v%d Loaded!\n", pluginData.initStruct.pluginName, pluginData.initStruct.pluginVersion); pluginList.push_back(pluginData); curPluginHandle++; } while(FindNextFileA(hSearch, &foundData)); SetCurrentDirectoryA(currentDir); } void pluginunload() { int pluginCount=pluginList.size(); for(int i=0; i=deflen or strstr(command, "\1")) return false; PLUG_COMMAND plugCmd; plugCmd.pluginHandle=pluginHandle; strcpy(plugCmd.command, command); if(!cmdnew(dbggetcommandlist(), command, (CBCOMMAND)cbCommand, debugonly)) return false; pluginCommandList.push_back(plugCmd); return true; } bool plugincmdunregister(int pluginHandle, const char* command) { if(!command or strlen(command)>=deflen or strstr(command, "\1")) return false; int listsize=pluginCommandList.size(); for(int i=0; i