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