Rev 1004 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1004 | Rev 1016 | ||
---|---|---|---|
1 | proc dll.Load, import_table:dword |
1 | proc dll.Load, import_table:dword |
2 | mov esi,[import_table] |
2 | mov esi,[import_table] |
3 | .next_lib: mov edx,[esi] |
3 | .next_lib: mov edx,[esi] |
4 | or edx,edx |
4 | or edx,edx |
5 | jz .exit |
5 | jz .exit |
6 | push esi |
6 | push esi |
7 | mov esi,[esi+4] |
7 | mov esi,[esi+4] |
8 | mov edi,s_libdir.fname |
8 | mov edi,s_libdir.fname |
9 | @@: lodsb |
9 | @@: lodsb |
10 | stosb |
10 | stosb |
11 | or al,al |
11 | or al,al |
12 | jnz @b |
12 | jnz @b |
13 | mcall 68,19,s_libdir |
13 | mcall 68,19,s_libdir |
14 | or eax,eax |
14 | or eax,eax |
15 | jz .fail |
15 | jz .fail |
16 | stdcall dll.Link,eax,edx |
16 | stdcall dll.Link,eax,edx |
17 | stdcall dll.Init,[eax+4] |
17 | push eax |
- | 18 | mov eax, [eax] |
|
- | 19 | cmp dword [eax], 'lib_' |
|
- | 20 | pop eax |
|
- | 21 | jnz @f |
|
- | 22 | stdcall dll.Init,[eax+4] |
|
18 | pop esi |
23 | @@: |
- | 24 | pop esi |
|
19 | add esi,8 |
25 | add esi,8 |
20 | jmp .next_lib |
26 | jmp .next_lib |
21 | .exit: xor eax,eax |
27 | .exit: xor eax,eax |
22 | ret |
28 | ret |
23 | .fail: add esp,4 |
29 | .fail: add esp,4 |
24 | xor eax,eax |
30 | xor eax,eax |
25 | inc eax |
31 | inc eax |
26 | ret |
32 | ret |
27 | endp |
33 | endp |
28 | 34 | ||
29 | proc dll.Link, exp:dword,imp:dword |
35 | proc dll.Link, exp:dword,imp:dword |
30 | push eax |
36 | push eax |
31 | mov esi,[imp] |
37 | mov esi,[imp] |
32 | test esi,esi |
38 | test esi,esi |
33 | jz .done |
39 | jz .done |
34 | .next: lodsd |
40 | .next: lodsd |
35 | test eax,eax |
41 | test eax,eax |
36 | jz .done |
42 | jz .done |
37 | stdcall dll.GetProcAddress,[exp],eax |
43 | stdcall dll.GetProcAddress,[exp],eax |
38 | or eax,eax |
44 | or eax,eax |
39 | jz @f |
45 | jz @f |
40 | mov [esi-4],eax |
46 | mov [esi-4],eax |
41 | jmp .next |
47 | jmp .next |
42 | @@: mov dword[esp],0 |
48 | @@: mov dword[esp],0 |
43 | .done: pop eax |
49 | .done: pop eax |
44 | ret |
50 | ret |
45 | endp |
51 | endp |
46 | 52 | ||
47 | proc dll.Init, dllentry:dword |
53 | proc dll.Init, dllentry:dword |
48 | pushad |
54 | pushad |
49 | mov eax,mem.Alloc |
55 | mov eax,mem.Alloc |
50 | mov ebx,mem.Free |
56 | mov ebx,mem.Free |
51 | mov ecx,mem.ReAlloc |
57 | mov ecx,mem.ReAlloc |
52 | mov edx,dll.Load |
58 | mov edx,dll.Load |
53 | stdcall [dllentry] |
59 | stdcall [dllentry] |
54 | popad |
60 | popad |
55 | ret |
61 | ret |
56 | endp |
62 | endp |
57 | 63 | ||
58 | proc dll.GetProcAddress, exp:dword,sz_name:dword |
64 | proc dll.GetProcAddress, exp:dword,sz_name:dword |
59 | mov edx,[exp] |
65 | mov edx,[exp] |
60 | xor eax,eax |
66 | xor eax,eax |
61 | .next: or edx,edx |
67 | .next: or edx,edx |
62 | jz .end |
68 | jz .end |
63 | cmp dword[edx],0 |
69 | cmp dword[edx],0 |
64 | jz .end |
70 | jz .end |
65 | stdcall strcmp,[edx],[sz_name] |
71 | stdcall strcmp,[edx],[sz_name] |
66 | test eax,eax |
72 | test eax,eax |
67 | jz .ok |
73 | jz .ok |
68 | add edx,8 |
74 | add edx,8 |
69 | jmp .next |
75 | jmp .next |
70 | .ok: mov eax,[edx+4] |
76 | .ok: mov eax,[edx+4] |
71 | .end: ret |
77 | .end: ret |
72 | endp |
78 | endp |
73 | 79 | ||
74 | proc strcmp, str1:dword,str2:dword |
80 | proc strcmp, str1:dword,str2:dword |
75 | push esi edi |
81 | push esi edi |
76 | mov esi,[str1] |
82 | mov esi,[str1] |
77 | mov edi,[str2] |
83 | mov edi,[str2] |
78 | xor eax,eax |
84 | xor eax,eax |
79 | @@: lodsb |
85 | @@: lodsb |
80 | scasb |
86 | scasb |
81 | jne .fail |
87 | jne .fail |
82 | or al,al |
88 | or al,al |
83 | jnz @b |
89 | jnz @b |
84 | jmp .ok |
90 | jmp .ok |
85 | .fail: or eax,-1 |
91 | .fail: or eax,-1 |
86 | .ok: pop edi esi |
92 | .ok: pop edi esi |
87 | ret |
93 | ret |
88 | endp |
94 | endp |
89 | 95 | ||
90 | s_libdir: |
96 | s_libdir: |
91 | db '/sys/lib/' |
97 | db '/sys/lib/' |
92 | .fname rb 32 |
98 | .fname rb 32 |