Subversion Repositories Kolibri OS

Rev

Rev 5690 | Rev 7219 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5690 Rev 5883
Line 14... Line 14...
14
	#define _TEXT_ERROR_ADD "'Error while loading library"
14
	#define _TEXT_ERROR_ADD "'Error while loading library"
15
#endif
15
#endif
Line 16... Line 16...
16
 
16
 
Line -... Line 17...
-
 
17
char a_libdir[43]  = "/sys/lib/\0";
-
 
18
 
-
 
19
dword GLOBAL_FUNC_LIB = 0;
-
 
20
dword G_FUNC_LOAD = 0;
-
 
21
dword G_FUNC_GET = 0;
17
char a_libdir[43]  = "/sys/lib/\0";
22
dword PATH_LIBRARY_LOADING = "/rd/1/lib/library.obj";
18
 
23
 
19
:inline void error_init(dword text)
24
:inline void error_init(dword text)
20
{
25
{
21
	dword TEXT_ERROR = malloc(1024);
26
	dword TEXT_ERROR = malloc(1024);
22
	sprintf(TEXT_ERROR, "%s `%s`' -E",_TEXT_ERROR_ADD,text);
27
	sprintf(TEXT_ERROR, "%s `%s`' -E",_TEXT_ERROR_ADD,text);
23
	notify(TEXT_ERROR);
28
	notify(TEXT_ERROR);
Line 24... Line 29...
24
	free(TEXT_ERROR);
29
	free(TEXT_ERROR);
25
}
30
}
26
 
31
 
27
// stdcall with 1 parameter
32
// stdcall with 1 parameter
28
void dll_Load() {
33
:void dll_Load() {
29
asm {
34
asm {
30
        push    ebp
35
        push    ebp
Line 81... Line 86...
81
        ret     4
86
        ret     4
82
    }
87
    }
83
}
88
}
Line 84... Line 89...
84
 
89
 
85
//stdcall with 2 parameters
90
//stdcall with 2 parameters
86
void dll_Link() {
91
:void dll_Link() {
87
asm {
92
asm {
88
        push    ebp
93
        push    ebp
89
        mov     ebp, esp
94
        mov     ebp, esp
90
        push    eax
95
        push    eax
Line 111... Line 116...
111
    }
116
    }
112
}
117
}
Line 113... Line 118...
113
 
118
 
114
 
119
 
115
//stdcall with 1 parameter
120
//stdcall with 1 parameter
116
void dll_Init() {
121
:void dll_Init() {
117
asm {
122
asm {
118
        push    ebp
123
        push    ebp
119
        mov     ebp, esp
124
        mov     ebp, esp
Line 129... Line 134...
129
    }
134
    }
130
}
135
}
Line 131... Line 136...
131
 
136
 
132
 
137
 
133
// stdcall with 2 parameters
138
// stdcall with 2 parameters
134
void dll_GetProcAddress(){
139
:void dll_GetProcAddress(){
135
asm {
140
asm {
136
        push    ebp
141
        push    ebp
137
        mov     ebp, esp
142
        mov     ebp, esp
Line 159... Line 164...
159
    }
164
    }
160
}
165
}
Line 161... Line 166...
161
 
166
 
162
 
167
 
163
// stdcall with 2 parameters
168
// stdcall with 2 parameters
164
void dll_StrCmp() {
169
:void dll_StrCmp() {
165
asm {
170
asm {
166
        push    ebp
171
        push    ebp
167
        mov     ebp, esp
172
        mov     ebp, esp
Line 185... Line 190...
185
        leave
190
        leave
186
        ret     8
191
        ret     8
187
    }
192
    }
188
}
193
}
Line 189... Line 194...
189
 
194
 
190
int load_dll2(dword dllname, import_table, byte need_init)
195
:int load_dll2(dword dllname, import_table, byte need_init)
191
{
196
{
192
   //dword dllentry=0;
197
   //dword dllentry=0;
193
// load DLL
198
// load DLL
194
        $mov     eax, 68
199
        $mov     eax, 68
Line 237... Line 242...
237
        return 0;
242
        return 0;
238
@exit01:
243
@exit01:
239
        return -1;
244
        return -1;
240
}
245
}
Line 241... Line 246...
241
 
246
 
242
byte load_dll(dword dllname, import_table, byte need_init)
247
:byte load_dll(dword dllname, import_table, byte need_init)
243
{
248
{
244
	if (load_dll2(dllname, import_table, need_init))
249
	if (load_dll2(dllname, import_table, need_init))
245
	{
250
	{
246
		error_init(dllname);
251
		error_init(dllname);
247
		return false;
252
		return false;
248
	}
253
	}
249
	return true;
254
	return true;
Line -... Line 255...
-
 
255
}
-
 
256
 
-
 
257
:struct OBJECT
-
 
258
{
-
 
259
	void load(dword dllname);
-
 
260
	dword get(dword fname);
-
 
261
} library;
-
 
262
 
-
 
263
:void OBJECT::load(dword dllname)
-
 
264
{
-
 
265
	dword tmp;
-
 
266
	IF(!GLOBAL_FUNC_LIB)
-
 
267
	{
-
 
268
		$mov eax, 68
-
 
269
		$mov ebx, 19
-
 
270
		ECX=#PATH_LIBRARY_LOADING;
-
 
271
		$int 0x40
-
 
272
		tmp = EAX;
-
 
273
		GLOBAL_FUNC_LIB = tmp;
-
 
274
		tmp+=4;
-
 
275
		G_FUNC_LOAD = DSDWORD[tmp];
-
 
276
		tmp+=8;
-
 
277
		G_FUNC_GET = DSDWORD[tmp];
-
 
278
	}
-
 
279
	G_FUNC_LOAD stdcall(dllname);
-
 
280
}
-
 
281
 
-
 
282
:dword OBJECT::get(dword fname)
-
 
283
{
-
 
284
	dword tmp=fname;
-
 
285
	G_FUNC_GET stdcall(tmp);
-
 
286
	return EAX;
-
 
287
}
-
 
288
 
-
 
289
/*
-
 
290
#define INIT_(name) byte init_#name(){object.load(name);
-
 
291
#define IMPORT(name) name = object.get(name);
Line 250... Line 292...
250
}
292
#define _INIT return 1;}
251
 
293
*/