Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1971 lev 1
//Asper
2
char a_libdir[43]  = "/sys/lib/\0";
3
 
4
 
5
//proc dll.Load, import_table:dword
6
int dll_Load(dword import_table)
7
{
8
                $mov     esi, import_table
9
  @next_lib:    $mov     edx, DSDWORD[esi]
10
                $or      edx,edx
11
                $jz      exit_
12
                $push    esi
13
                $mov     esi,DSDWORD[esi+4]
14
                $mov     edi,#a_libdir
15
 
16
                $push    edi
17
                $push    esi
18
                EAX=strlen(#a_libdir);
19
                $pop     esi
20
                $pop     edi
21
                $add     edi, eax //9
22
 
23
            @loc01: $lodsb
24
                $stosb
25
                $or      al,al
26
                $jnz     loc01
27
 
28
                                //IntToStr(EBX);
29
                                //$push edx
30
                                //WriteDebug(#a_libdir);
31
                                //$pop edx
32
                //mcall   68,19,a_libdir
33
                $mov     eax, 68
34
                $mov     ebx, 19
35
                $mov     ecx,#a_libdir
36
                $int     0x40
37
 
38
                $or      eax,eax
39
                $jz      fail
40
                //stdcall dll.Link,eax,edx
41
                dll_Link(EAX, EDX);
42
                $push    eax
43
                $mov     eax, DSDWORD [eax]
44
                $cmp     DSDWORD [eax], 'lib_'
45
                $pop     eax
46
                //$jnz     loc02
47
                                //IntToStr(EBX);
48
                                //$push    eax
49
                                //WriteDebug(DSDWORD[EAX]);
50
                                //$pop     eax
51
                //stdcall dll.Init,[eax+4]
52
                //dll_Init(DSDWORD[EAX]); //dll_Init(DSDWORD[EAX+4]);
53
            @loc02:
54
                $pop     esi
55
                $add     esi,8
56
                $jmp     next_lib
57
  @exit_:        $xor     eax,eax
58
                return 0;
59
  @fail:        $add     esp,4
60
                $xor     eax,eax
61
                $inc     eax
62
                return -1;
63
}
64
 
65
//proc dll.Link, exp:dword,imp:dword
66
void dll_Link(dword exp, imp)
67
{
68
                $push    eax
69
                $mov     esi, imp
70
                $test    esi, esi
71
                $jz      done
72
  @next:        $lodsd
73
                $test    eax,eax
74
                $jz      done
75
 
76
                //stdcall dll.GetProcAddress,[exp],eax
77
                dll_GetProcAddress(exp,EAX);
78
                $or      eax,eax
79
                $jz      loc03
80
 
81
                $mov     DSDWORD[esi-4],eax
82
                $jmp     next
83
  @loc03:
84
                $mov     DSDWORD[esp],0
85
  @done:        $pop     eax
86
}
87
 
88
//proc dll.Init, dllentry:dword
89
void dll_Init(dword dllentry)
90
{
91
                $pushad
92
                EAX=#mem_Alloc;
93
                EBX=#mem_Free;
94
                ECX=#mem_ReAlloc;
95
                EDX=#dll_Load;
96
                DSDWORD [dllentry+4] stdcall ();
97
                $popad
98
}
99
 
100
//proc dll.GetProcAddress, exp:dword,sz_name:dword
101
dword dll_GetProcAddress(dword exp, sz_name)
102
{
103
                $push esi
104
                $mov     edx, exp
105
                $xor     eax,eax
106
  @next:        $or      edx,edx
107
                $jz      end_
108
                $cmp     edx,0
109
                $jz      end_
110
                strcmp(DSDWORD[EDX],sz_name);
111
                $test    eax,eax
112
                $jz      ok
113
                $add     edx,8
114
                $jmp     next
115
  @ok:
116
                $mov     eax, DSDWORD[edx+4]
117
  @end_:
118
                $pop  esi
119
    return EAX;
120
}
121
 
122
 
123
int load_dll2(dword dllname, import_table, byte need_init)
124
{
125
   //dword dllentry=0;
126
// load DLL
127
        $mov     eax, 68
128
        $mov     ebx, 19
129
        ECX=dllname;
130
        $int     0x40
131
        $test    eax, eax
132
        $jz      exit01
133
 
134
// initialize import
135
        $mov     edx,eax
136
        ESI=import_table;
137
 
138
@import_loop01:
139
        $lodsd
140
        $test    eax,eax
141
        $jz      import_done01
142
        $push    edx
143
@import_find01:
144
        $mov     ebx,DSDWORD[EDX]
145
        $test    ebx, ebx
146
        $jz      exit01
147
        $push    eax
148
@nex101:
149
        $mov     cl,DSBYTE[EAX];
150
        $cmp     cl,DSBYTE[EBX];
151
        $jnz     import_find_next01
152
        $test    cl,cl
153
        $jz      import_found01
154
        $inc     eax
155
        $inc     ebx
156
        $jmp     nex101
157
@import_find_next01:
158
        $pop     eax
159
        $add     edx, 8
160
        $jmp     import_find01
161
@import_found01:
162
        $pop     eax
163
        $mov     eax,DSDWORD[edx+4]
164
        $mov     DSDWORD[esi-4],eax
165
        $pop     edx
166
 
167
        $jmp     import_loop01
168
@import_done01:
169
        IF (need_init) dll_Init(EDX);
170
        return 0;
171
@exit01:
172
        return -1;
173
}