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
|
// Copyright (c) Hercules Dev Team, licensed under GNU GPL.
// See the LICENSE file
#ifndef _HPM_H_
#define _HPM_H_
#include "../common/cbasetypes.h"
#include "../common/HPMi.h"
#ifdef WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
#define plugin_open(x) LoadLibraryA(x)
#define plugin_import(x,y,z) (z)GetProcAddress(x,y)
#define plugin_close(x) FreeLibrary(x)
#define DLL_EXT ".dll"
#define DLL HINSTANCE
#else // ! WIN32
#include <dlfcn.h>
#ifdef RTLD_DEEPBIND // Certain linux ditributions require this, but it's not available everywhere
#define plugin_open(x) dlopen(x,RTLD_NOW|RTLD_DEEPBIND)
#else // ! RTLD_DEEPBIND
#define plugin_open(x) dlopen(x,RTLD_NOW)
#endif // RTLD_DEEPBIND
#define plugin_import(x,y,z) (z)dlsym(x,y)
#define plugin_close(x) dlclose(x)
#ifdef CYGWIN
#define DLL_EXT ".dll"
#else
#define DLL_EXT ".so"
#endif
#define DLL void *
#include <string.h> // size_t
#endif // WIN32
struct hplugin {
DLL dll;
unsigned int idx;
char *filename;
struct hplugin_info *info;
struct HPMi_interface *hpi;
};
struct hpm_symbol {
char *name;
void *ptr;
};
struct HPluginData {
unsigned int pluginID;
unsigned int type;
struct {
unsigned int free : 1;
} flag;
void *data;
};
struct HPluginPacket {
unsigned int pluginID;
unsigned short cmd;
short len;
void (*receive) (int fd);
};
struct HPMFileNameCache {
const char *addr;
char *name;
};
/* Hercules Plugin Manager Interface */
struct HPM_interface {
/* vars */
unsigned int version[2];
bool off;
bool hooking;
/* hooking */
bool force_return;
/* data */
struct hplugin **plugins;
unsigned int plugin_count;
struct hpm_symbol **symbols;
unsigned int symbol_count;
/* packet hooking points */
struct HPluginPacket *packets[hpPHP_MAX];
unsigned int packetsc[hpPHP_MAX];
/* plugin file ptr caching */
struct HPMFileNameCache *fnames;
unsigned int fnamec;
/* funcs */
void (*init) (void);
void (*final) (void);
struct hplugin * (*create) (void);
struct hplugin * (*load) (const char* filename);
void (*unload) (struct hplugin* plugin);
bool (*exists) (const char *filename);
bool (*iscompatible) (char* version);
void (*event) (enum hp_event_types type);
void *(*import_symbol) (char *name, unsigned int pID);
void (*share) (void *, char *);
void (*symbol_defaults) (void);
void (*config_read) (void);
bool (*populate) (struct hplugin *plugin,const char *filename);
void (*symbol_defaults_sub) (void);//TODO drop
char *(*pid2name) (unsigned int pid);
unsigned char (*parse_packets) (int fd, enum HPluginPacketHookingPoints point);
void (*load_sub) (struct hplugin *plugin);
bool (*addhook_sub) (enum HPluginHookType type, const char *target, void *hook, unsigned int pID);
} HPM_s;
struct HPM_interface *HPM;
void hpm_defaults(void);
#endif /* _HPM_H_ */
|