-
Notifications
You must be signed in to change notification settings - Fork 1
/
LibLoader.dpr
138 lines (109 loc) · 3.1 KB
/
LibLoader.dpr
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
library LibLoader;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters.
Important note about VCL usage: when this DLL will be implicitly
loaded and this DLL uses TWicImage / TImageCollection created in
any unit initialization section, then Vcl.WicImageInit must be
included into your library's USES clause. }
uses
Windows,
System.SysUtils,
System.Classes,
System.AnsiStrings,
Loader in 'Loader.pas',
Log in 'Log.pas';
type
TOrgFuncs = record
case Integer of
0: (Base: FARPROC;);
1: (Arr: array [0..7] of FARPROC;);
end;
const
SIZE_OF_FUNC = SizeOf(FARPROC);
var
hl: HINST;
OrgFuncs: TOrgFuncs;
{$R *.res}
procedure __DLLProc(Reason: Integer);
begin
case Reason of
DLL_PROCESS_ATTACH:
begin
hl := LoadLibrary('nps64.dat');
if hl = 0 then Exit;
OrgFuncs.Arr[0] := GetProcAddress(hl, 'AddSurveyParameterA');
OrgFuncs.Arr[1] := GetProcAddress(hl, 'AddSurveyParameterW');
OrgFuncs.Arr[2] := GetProcAddress(hl, 'GetLastErrorCode');
OrgFuncs.Arr[3] := GetProcAddress(hl, 'GetLastErrorMsg');
OrgFuncs.Arr[4] := GetProcAddress(hl, 'OpenSurveyWindowA');
OrgFuncs.Arr[5] := GetProcAddress(hl, 'OpenSurveyWindowW');
OrgFuncs.Arr[6] := GetProcAddress(hl, 'SetDebugMode');
OrgFuncs.Arr[7] := GetProcAddress(hl, 'SetRunMode');
end;
DLL_PROCESS_DETACH:
begin
FreeLibrary(hl);
end;
end;
end;
// AddSurveyParameterA
procedure __E__0__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 0]
end;
// AddSurveyParameterW
procedure __E__1__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 1]
end;
// GetLastErrorCode
procedure __E__2__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 2]
end;
// GetLastErrorMsg
procedure __E__3__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 3]
end;
// OpenSurveyWindowA
procedure __E__4__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 4]
end;
// OpenSurveyWindowW
procedure __E__5__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 5]
end;
// SetDebugMode
procedure __E__6__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 6]
end;
// SetRunMode
procedure __E__7__();
asm
jmp [OrgFuncs.Base + SIZE_OF_FUNC * 7]
end;
//-------- Exports
exports
__E__0__ index 1 name 'AddSurveyParameterA',
__E__1__ index 2 name 'AddSurveyParameterW',
__E__2__ index 3 name 'GetLastErrorCode',
__E__3__ index 4 name 'GetLastErrorMsg',
__E__4__ index 5 name 'OpenSurveyWindowA',
__E__5__ index 6 name 'OpenSurveyWindowW',
__E__6__ index 7 name 'SetDebugMode',
__E__7__ index 8 name 'SetRunMode';
begin
DllProc := __DLLProc;
__DLLProc(DLL_PROCESS_ATTACH);
end.