Calling an external function with GetProcAddress crashes the app

I've been trying to call an external function with the GetProcAddress function but everytime i call the function it crashes the console, ive been looking but in every post i get the same final solution but when i try it in my DLL it crashes the app.
Here's the code:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include <Windows.h>
#include <vector>
#include "SDK\plugin.h"

typedef void (*logprintf_t)(char* format, ...);
logprintf_t logprintf;
// static void* m_AMXExports[44];

typedef bool (PLUGIN_CALL *ServerPluginLoad_t)(void **data);
typedef void (PLUGIN_CALL *ServerPluginUnload_t)();
typedef unsigned int (PLUGIN_CALL *ServerPluginSupports_t)();
typedef void (PLUGIN_CALL *ServerPluginProcessTick_t)();

typedef int (PLUGIN_CALL *ServerPluginAmxLoad_t)(AMX *amx);
typedef int (PLUGIN_CALL *ServerPluginAmxUnload_t)(AMX *amx);

struct Plugins
{
	void* AppData[256];
	SUPPORTS_FLAGS FlagSupport;
	HMODULE Module;
	ServerPluginLoad_t		LOAD;
	ServerPluginUnload_t	UNLOAD;
	ServerPluginSupports_t	SUPPORTS;
	ServerPluginProcessTick_t	PROCESSTICK;

	// AMX Plugin Interface
	ServerPluginAmxLoad_t	AMXLOAD;
	ServerPluginAmxUnload_t AMXUNLOAD;
};
Plugins* ServerPlugins;

void **ppPluginData ;

extern void *pAMXFunctions;

//native LoadLibrary(libraryname[]);
static cell AMX_NATIVE_CALL my_LoadLibrary(AMX* amx, cell* params)
{
	bool validfunc = false;
	char *path;
	amx_StrParam(amx, params[1], path);
	logprintf("Loading plugin %s", path);
	ServerPlugins = new Plugins();
	ServerPlugins->Module = LoadLibraryA(path);
	if (ServerPlugins->Module == NULL)
	{
		delete ServerPlugins;
		logprintf("Failed loading plugin %s (Error: %d)", path, GetLastError());
		return 0;
	}
	logprintf("NULL");
	ServerPlugins->LOAD = (ServerPluginLoad_t)GetProcAddress(ServerPlugins->Module, "Load");
	ServerPlugins->UNLOAD = (ServerPluginUnload_t)GetProcAddress(ServerPlugins->Module, "Unload");
	ServerPlugins->SUPPORTS = (ServerPluginSupports_t)GetProcAddress(ServerPlugins->Module, "Supports");
	if (ServerPlugins->LOAD == NULL || ServerPlugins->SUPPORTS == NULL || ServerPlugins->UNLOAD == NULL)
	{
		logprintf(" Plugin doesnt conform to architecture");
		FreeLibrary(ServerPlugins->Module);
		delete ServerPlugins;
		return false;
	}
	logprintf("NULL 1");
	ServerPlugins->FlagSupport = (SUPPORTS_FLAGS)ServerPlugins->SUPPORTS();
	if ((ServerPlugins->FlagSupport & SUPPORTS_VERSION_MASK) > SUPPORTS_VERSION)
	{
		logprintf("Unsupported Version; unloading.");
		FreeLibrary(ServerPlugins->Module);
		delete ServerPlugins;
		return false;
	}
	logprintf("NULL 2");
	if ((ServerPlugins->FlagSupport & SUPPORTS_AMX_NATIVES) > SUPPORTS_VERSION)
	{
		ServerPlugins->AMXLOAD = (ServerPluginAmxLoad_t)GetProcAddress(ServerPlugins->Module, "AmxLoad");
		ServerPlugins->AMXUNLOAD = (ServerPluginAmxUnload_t)GetProcAddress(ServerPlugins->Module, "AmxUnload");
	}
	else
	{
		ServerPlugins->AMXLOAD = NULL;
		ServerPlugins->AMXUNLOAD = NULL;
		logprintf("Any Abstract Machine has been loaded");
	}
	logprintf("NULL 3");
	if ((ServerPlugins->FlagSupport & SUPPORTS_PROCESS_TICK) != 0)
	{
		ServerPlugins->PROCESSTICK = (ServerPluginProcessTick_t)GetProcAddress(ServerPlugins->Module, "ProcessTick");
	}
	else
	{
		ServerPlugins->PROCESSTICK = NULL;
	}
	logprintf("NULL 4");
	ServerPlugins->AppData[PLUGIN_DATA_AMX_EXPORTS] = pAMXFunctions;
	ServerPlugins->AppData[PLUGIN_DATA_LOGPRINTF] = &logprintf;
	if (!(ServerPlugins->LOAD)(ServerPlugins->AppData))
	{

		logprintf("Initialized failed loading plugin %s", path);
		FreeLibrary(ServerPlugins->Module);
		logprintf("NULL 5");
		delete ServerPlugins;
		return false;
	}
	logprintf("Plugin %s loaded", path);
	return true;
}
//native UnloadLibrary(libraryname[]);
static cell AMX_NATIVE_CALL my_UnloadLibrary(AMX*amx, cell*params)
{
	char *path;
	amx_StrParam(amx, params[1], path);
	ServerPlugins->Module = GetModuleHandle((LPCTSTR)path);
	if (ServerPlugins->Module != NULL)
	{
		ServerPlugins->UNLOAD = (ServerPluginUnload_t)GetProcAddress(ServerPlugins->Module, "Unload");
		if (ServerPlugins->UNLOAD != NULL)
		{
			ServerPlugins->UNLOAD();
			FreeLibrary(GetModuleHandleA(path));
			logprintf("Library %s has been unloaded correctly", path);
			return 1;
		}
		else
		{
			logprintf("Unloading library %s failed (Error: %d)", GetLastError());
			return 0;
		}
	}
	return 1;
}
PLUGIN_EXPORT bool PLUGIN_CALL Load(void **ppData)
{
	pAMXFunctions = ppData[PLUGIN_DATA_AMX_EXPORTS];
	logprintf = (logprintf_t)ppData[PLUGIN_DATA_LOGPRINTF];
	return 1;
}

PLUGIN_EXPORT void PLUGIN_CALL Unload()
{
}

PLUGIN_EXPORT unsigned int PLUGIN_CALL Supports()
{
	return SUPPORTS_VERSION | SUPPORTS_AMX_NATIVES;
}
AMX_NATIVE_INFO projectNatives[] =
{
	{ "LoadLibrary", my_LoadLibrary },
	{ "UnloadLibrary", my_UnloadLibrary }
};
PLUGIN_EXPORT int PLUGIN_CALL AmxLoad(AMX *amx)
{
	return amx_Register(amx, projectNatives, -1);
}

PLUGIN_EXPORT int PLUGIN_CALL AmxUnload(AMX *amx)
{
	return AMX_ERR_NONE;
}
Last edited on
Topic archived. No new replies allowed.