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; |