Subversion Repositories Kolibri OS

Rev

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

Rev 3067 Rev 4567
Line 1... Line -...
1
//Asper
-
 
2
char a_libdir[43]  = "/sys/lib/\0";
1
char a_libdir[43]  = "/sys/lib/\0";
Line -... Line 2...
-
 
2
 
-
 
3
// stdcall with 1 parameter
-
 
4
void dll_Load() {
-
 
5
asm {
-
 
6
        push    ebp
-
 
7
        mov     ebp, esp
-
 
8
        mov     esi, SSDWORD[EBP+8]
-
 
9
@next_lib:    
-
 
10
        mov     edx, DSDWORD[ESI]
-
 
11
        or      edx, edx
-
 
12
        jz      exit
-
 
13
        push    esi
-
 
14
        mov     esi, DSDWORD[ESI+4]
-
 
15
        mov     edi, #a_libdir+9
-
 
16
 
-
 
17
@loc01: 
-
 
18
        lodsb
-
 
19
        stosb
-
 
20
        or      al, al
-
 
21
        jnz     loc01
-
 
22
 
-
 
23
        mov     eax, 68
-
 
24
        mov     ebx, 19
-
 
25
        mov     ecx, #a_libdir
-
 
26
        int     0x40
-
 
27
        or      eax, eax
-
 
28
        jz      fail
-
 
29
 
-
 
30
        push    edx
-
 
31
        push    eax
-
 
32
        call    dll_Link
-
 
33
 
-
 
34
        push    eax
-
 
35
        mov     eax, DSDWORD[eax]
-
 
36
        cmp     DSDWORD[EAX], '_bil'    // somehow this needs to be reversed..
-
 
37
        pop     eax
Line 3... Line -...
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_
38
        jnz     loc02
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
                
39
 
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]
40
        push    DSDWORD[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
-
 
Line -... Line 41...
-
 
41
        call    dll_Init
-
 
42
@loc02:
-
 
43
 
-
 
44
        pop     esi
73
                $test    eax,eax
45
        add     esi, 8
-
 
46
        jmp     next_lib
-
 
47
@exit:
-
 
48
        xor     eax, eax
-
 
49
        leave
74
                $jz      done
50
        ret     4
75
 
51
        
76
                //stdcall dll.GetProcAddress,[exp],eax
52
@fail:        
-
 
53
        add     esp, 4
-
 
54
        xor     eax, eax
-
 
55
        inc     eax
-
 
56
        leave
Line -... Line 57...
-
 
57
        ret     4
-
 
58
    }
-
 
59
}
-
 
60
 
-
 
61
//stdcall with 2 parameters
-
 
62
void dll_Link() {
-
 
63
asm {
-
 
64
        push    ebp
-
 
65
        mov     ebp, esp
-
 
66
        push    eax
-
 
67
        mov     esi, SSDWORD[EBP+12]
-
 
68
        test    esi, esi
-
 
69
        jz      done
-
 
70
@next:        
-
 
71
        lodsd
-
 
72
        test    eax, eax
-
 
73
        jz      done
-
 
74
        push    eax
77
                dll_GetProcAddress(exp,EAX);
75
        push    SSDWORD[EBP+8]
78
                $or      eax,eax
76
        call    dll_GetProcAddress
79
                $jz      loc03
77
        or      eax, eax
80
 
78
        jz      loc03
-
 
79
        mov     DSDWORD[esi-4], eax
81
                $mov     DSDWORD[esi-4],eax
80
        jmp     next
-
 
81
@loc03: 
-
 
82
        mov     SSDWORD[esp], 0
-
 
83
@done:
82
                $jmp     next
84
        pop     eax
Line -... Line 85...
-
 
85
        leave
83
  @loc03: 
86
        ret     8
84
                $mov     DSDWORD[esp],0
87
    }
85
  @done:        $pop     eax
88
}
-
 
89
 
86
}
90
 
-
 
91
//stdcall with 1 parameter
87
 
92
void dll_Init() {
88
//proc dll.Init, dllentry:dword
93
asm {
89
void dll_Init(dword dllentry)
94
        push    ebp
90
{
95
        mov     ebp, esp
91
                $pushad
96
        pushad
-
 
97
        mov     eax, #mem_Alloc
-
 
98
        mov     ebx, #mem_Free;
92
                EAX=#mem_Alloc;
99
        mov     ecx, #mem_ReAlloc;
-
 
100
        mov     edx, #dll_Load;
93
                EBX=#mem_Free;
101
        call    SSDWORD[EBP+8]
Line -... Line 102...
-
 
102
        popad
94
                ECX=#mem_ReAlloc;
103
        leave
95
                EDX=#dll_Load;
104
        ret     4
96
                DSDWORD [dllentry+4] stdcall ();                
105
    }
97
                $popad
106
}
98
}
107
 
-
 
108
 
99
 
109
// stdcall with 2 parameters
-
 
110
void dll_GetProcAddress(){
-
 
111
asm {
100
//proc dll.GetProcAddress, exp:dword,sz_name:dword
112
        push    ebp
101
dword dll_GetProcAddress(dword exp, sz_name)
113
        mov     ebp, esp
102
{
114
        mov     edx, CSDWORD[EBP+8]
103
                $push esi
115
        xor     eax, eax
-
 
116
 
-
 
117
@next:        
104
                $mov     edx, exp
118
        or      edx, edx
-
 
119
        jz      end
105
                $xor     eax,eax
120
        cmp     CSDWORD[edx], 0
106
  @next:        $or      edx,edx
121
        jz      end
107
                $jz      end_
122
 
108
                $cmp     edx,0
123
        push    CSDWORD[EBP+12]
109
                $jz      end_
124
        push    CSDWORD[EDX]
110
                strcmp(DSDWORD[EDX],sz_name);
125
        call    dll_StrCmp
111
                $test    eax,eax
126
        test    eax, eax
112
                $jz      ok
127
        jz      ok
113
                $add     edx,8
128
        add     edx, 8
-
 
129
        jmp     next
114
                $jmp     next
130
@ok:
Line -... Line 131...
-
 
131
        mov     eax, DSDWORD[EDX+4]
-
 
132
@end:
-
 
133
        leave
-
 
134
        ret     8
-
 
135
    }
-
 
136
}
-
 
137
 
-
 
138
 
-
 
139
// stdcall with 2 parameters
-
 
140
void dll_StrCmp() {
-
 
141
asm {
-
 
142
        push    ebp
-
 
143
        mov     ebp, esp
-
 
144
        push    esi
-
 
145
        push    edi
-
 
146
        mov     esi, CSDWORD[EBP+8]
-
 
147
        mov     edi, CSDWORD[EBP+12]
-
 
148
        xor     eax, eax
-
 
149
@label1:
-
 
150
        lodsb
-
 
151
        scasb
-
 
152
        jne     fail
-
 
153
        or      al, al
-
 
154
        jnz     label1
-
 
155
        jmp     label_ok
-
 
156
@fail:
-
 
157
        or      eax, -1
115
  @ok:
158
@label_ok:
116
                $mov     eax, DSDWORD[edx+4]
159
        pop     edi
117
  @end_:         
160
        pop     esi
118
                $pop  esi
161
        leave
119
    return EAX;
162
        ret     8
Line 164... Line 207...
164
        $mov     DSDWORD[esi-4],eax
207
        $mov     DSDWORD[esi-4],eax
165
        $pop     edx
208
        $pop     edx
Line 166... Line 209...
166
       
209
       
167
        $jmp     import_loop01
210
        $jmp     import_loop01
168
@import_done01:
211
@import_done01:
169
        IF (need_init) dll_Init(EDX);
212
        IF (need_init) dll_Init (DSDWORD[EDX+4]);
170
        return 0;
213
        return 0;
171
@exit01:
214
@exit01:
172
        return -1;
215
        return -1;