Rev 3014 | Rev 6823 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3014 | Rev 3038 | ||
---|---|---|---|
1 | ;----------------------------------------------------------------------------- |
1 | ;----------------------------------------------------------------------------- |
2 | proc dll.Load, import_table:dword |
2 | proc dll.Load, import_table:dword |
3 | mov esi, [import_table] |
3 | mov esi, [import_table] |
4 | .next_lib: |
4 | .next_lib: |
5 | mov edx, [esi] |
5 | mov edx, [esi] |
6 | or edx, edx |
6 | or edx, edx |
7 | jz .exit |
7 | jz .exit |
8 | push esi |
8 | push esi |
9 | mov esi, [esi + 4] |
9 | mov esi, [esi + 4] |
10 | mov edi, s_libdir.fname |
10 | mov edi, s_libdir.fname |
11 | @@: |
11 | @@: |
12 | lodsb |
12 | lodsb |
13 | stosb |
13 | stosb |
14 | or al, al |
14 | or al, al |
15 | jnz @b |
15 | jnz @b |
16 | mcall 68, 19, s_libdir |
16 | mcall 68, 19, s_libdir |
17 | or eax, eax |
17 | or eax, eax |
18 | jz .fail |
18 | jz .fail |
19 | stdcall dll.Link, eax, edx |
19 | stdcall dll.Link, eax, edx |
- | 20 | push eax |
|
- | 21 | mov eax, [eax] |
|
- | 22 | cmp dword[eax], 'lib_' |
|
- | 23 | pop eax |
|
- | 24 | jnz @f |
|
20 | stdcall dll.Init, [eax + 4] |
25 | stdcall dll.Init, [eax + 4] |
- | 26 | @@: |
|
21 | pop esi |
27 | pop esi |
22 | add esi, 8 |
28 | add esi, 8 |
23 | jmp .next_lib |
29 | jmp .next_lib |
24 | .exit: |
30 | .exit: |
25 | xor eax, eax |
31 | xor eax, eax |
26 | ret |
32 | ret |
27 | .fail: |
33 | .fail: |
28 | add esp, 4 |
34 | add esp, 4 |
29 | xor eax, eax |
35 | xor eax, eax |
30 | inc eax |
36 | inc eax |
31 | ret |
37 | ret |
32 | endp |
38 | endp |
33 | ;----------------------------------------------------------------------------- |
39 | ;----------------------------------------------------------------------------- |
34 | proc dll.Link, exp:dword, imp:dword |
40 | proc dll.Link, exp:dword, imp:dword |
35 | push eax |
41 | push eax |
36 | mov esi, [imp] |
42 | mov esi, [imp] |
37 | test esi, esi |
43 | test esi, esi |
38 | jz .done |
44 | jz .done |
39 | .next: |
45 | .next: |
40 | lodsd |
46 | lodsd |
41 | test eax, eax |
47 | test eax, eax |
42 | jz .done |
48 | jz .done |
43 | stdcall dll.GetProcAddress, [exp], eax |
49 | stdcall dll.GetProcAddress, [exp], eax |
44 | or eax, eax |
50 | or eax, eax |
45 | jz @f |
51 | jz @f |
46 | mov [esi - 4], eax |
52 | mov [esi - 4], eax |
47 | jmp .next |
53 | jmp .next |
48 | @@: |
54 | @@: |
49 | mov dword[esp], 0 |
55 | mov dword[esp], 0 |
50 | .done: |
56 | .done: |
51 | pop eax |
57 | pop eax |
52 | ret |
58 | ret |
53 | endp |
59 | endp |
54 | ;----------------------------------------------------------------------------- |
60 | ;----------------------------------------------------------------------------- |
55 | proc dll.Init, dllentry:dword |
61 | proc dll.Init, dllentry:dword |
56 | pushad |
62 | pushad |
57 | mov eax, mem.Alloc |
63 | mov eax, mem.Alloc |
58 | mov ebx, mem.Free |
64 | mov ebx, mem.Free |
59 | mov ecx, mem.ReAlloc |
65 | mov ecx, mem.ReAlloc |
60 | mov edx, dll.Load |
66 | mov edx, dll.Load |
61 | stdcall [dllentry] |
67 | stdcall [dllentry] |
62 | popad |
68 | popad |
63 | ret |
69 | ret |
64 | endp |
70 | endp |
65 | ;----------------------------------------------------------------------------- |
71 | ;----------------------------------------------------------------------------- |
66 | proc dll.GetProcAddress, exp:dword, sz_name:dword |
72 | proc dll.GetProcAddress, exp:dword, sz_name:dword |
67 | mov edx, [exp] |
73 | mov edx, [exp] |
68 | xor eax, eax |
74 | xor eax, eax |
69 | .next: |
75 | .next: |
70 | or edx, edx |
76 | or edx, edx |
71 | jz .end |
77 | jz .end |
72 | cmp dword[edx], 0 |
78 | cmp dword[edx], 0 |
73 | jz .end |
79 | jz .end |
74 | stdcall strcmp, [edx], [sz_name] |
80 | stdcall strcmp, [edx], [sz_name] |
75 | test eax, eax |
81 | test eax, eax |
76 | jz .ok |
82 | jz .ok |
77 | add edx, 8 |
83 | add edx, 8 |
78 | jmp .next |
84 | jmp .next |
79 | .ok: |
85 | .ok: |
80 | mov eax, [edx + 4] |
86 | mov eax, [edx + 4] |
81 | .end: |
87 | .end: |
82 | ret |
88 | ret |
83 | endp |
89 | endp |
84 | ;----------------------------------------------------------------------------- |
90 | ;----------------------------------------------------------------------------- |
85 | proc strcmp, str1:dword, str2:dword |
91 | proc strcmp, str1:dword, str2:dword |
86 | push esi edi |
92 | push esi edi |
87 | mov esi, [str1] |
93 | mov esi, [str1] |
88 | mov edi, [str2] |
94 | mov edi, [str2] |
89 | xor eax, eax |
95 | xor eax, eax |
90 | @@: |
96 | @@: |
91 | lodsb |
97 | lodsb |
92 | scasb |
98 | scasb |
93 | jne .fail |
99 | jne .fail |
94 | or al, al |
100 | or al, al |
95 | jnz @b |
101 | jnz @b |
96 | jmp .ok |
102 | jmp .ok |
97 | .fail: |
103 | .fail: |
98 | or eax, -1 |
104 | or eax, -1 |
99 | .ok: |
105 | .ok: |
100 | pop edi esi |
106 | pop edi esi |
101 | ret |
107 | ret |
102 | endp |
108 | endp |
103 | ;----------------------------------------------------------------------------- |
109 | ;----------------------------------------------------------------------------- |
104 | s_libdir: |
110 | s_libdir: |
105 | db '/sys/lib/' |
111 | db '/sys/lib/' |
106 | .fname rb 32 |
112 | .fname rb 32 |
107 | ;----------------------------------------------------------------------------- |
113 | ;----------------------------------------------------------------------------- |
108 | proc mem.Alloc, size |
114 | proc mem.Alloc, size |
109 | push ebx ecx |
115 | push ebx ecx |
110 | mov ecx, [size] |
116 | mov ecx, [size] |
111 | mcall 68, 12 |
117 | mcall 68, 12 |
112 | pop ecx ebx |
118 | pop ecx ebx |
113 | ret |
119 | ret |
114 | endp |
120 | endp |
115 | ;----------------------------------------------------------------------------- |
121 | ;----------------------------------------------------------------------------- |
116 | proc mem.ReAlloc, mptr, size |
122 | proc mem.ReAlloc, mptr, size |
117 | push ebx ecx edx |
123 | push ebx ecx edx |
118 | mov ecx, [size] |
124 | mov ecx, [size] |
119 | or ecx, ecx |
125 | or ecx, ecx |
120 | jz @f |
126 | jz @f |
121 | @@: |
127 | @@: |
122 | mov edx, [mptr] |
128 | mov edx, [mptr] |
123 | or edx, edx |
129 | or edx, edx |
124 | jz @f |
130 | jz @f |
125 | @@: |
131 | @@: |
126 | mcall 68, 20 |
132 | mcall 68, 20 |
127 | or eax, eax |
133 | or eax, eax |
128 | jz @f |
134 | jz @f |
129 | @@: |
135 | @@: |
130 | pop edx ecx ebx |
136 | pop edx ecx ebx |
131 | ret |
137 | ret |
132 | endp |
138 | endp |
133 | ;----------------------------------------------------------------------------- |
139 | ;----------------------------------------------------------------------------- |
134 | proc mem.Free, mptr |
140 | proc mem.Free, mptr |
135 | push ebx ecx |
141 | push ebx ecx |
136 | mov ecx,[mptr] |
142 | mov ecx,[mptr] |
137 | or ecx,ecx |
143 | or ecx,ecx |
138 | jz @f |
144 | jz @f |
139 | @@: |
145 | @@: |
140 | mcall 68, 13 |
146 | mcall 68, 13 |
141 | pop ecx ebx |
147 | pop ecx ebx |
142 | ret |
148 | ret |
143 | endp |
149 | endp |
144 | ;----------------------------------------------------------------------------- |
150 | ;----------------------------------------------------------------------------- |