Rev 529 | Rev 535 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 529 | Rev 530 | ||
---|---|---|---|
1 | $Revision$ |
1 | $Revision: 530 $ |
2 | ;------------------------------------------------------------------------- |
2 | ;------------------------------------------------------------------------- |
3 | ; |
3 | ; |
4 | ; ¬¥ ¨¬¥ ä ©«®¢ |
4 | ; File path partial substitution (according to configuration) |
5 | ; |
5 | ; |
6 | ; |
6 | ; |
7 | ; SPraid |
7 | ; SPraid |
8 | ; |
8 | ; |
9 | ;------------------------------------------------------------------------- |
9 | ;------------------------------------------------------------------------- |
10 | 10 | ||
11 | iglobal |
11 | iglobal |
12 | ; pointer to memory for path replace table, |
12 | ; pointer to memory for path replace table, |
13 | ; size of one record is 128 bytes: 64 bytes for search pattern + 64 bytes for replace string |
13 | ; size of one record is 128 bytes: 64 bytes for search pattern + 64 bytes for replace string |
14 | 14 | ||
15 | ; start with one entry: sys -> |
15 | ; start with one entry: sys -> |
16 | full_file_name_table dd sysdir_name |
16 | full_file_name_table dd sysdir_name |
17 | .size dd 1 |
17 | .size dd 1 |
18 | 18 | ||
19 | tmp_file_name_size dd 1 |
19 | tmp_file_name_size dd 1 |
20 | endg |
20 | endg |
21 | 21 | ||
22 | uglobal |
22 | uglobal |
23 | ; Parser_params will initialize: sysdir_name = "sys", sysdir_path = |
23 | ; Parser_params will initialize: sysdir_name = "sys", sysdir_path = |
24 | sysdir_name rb 64 |
24 | sysdir_name rb 64 |
25 | sysdir_path rb 64 |
25 | sysdir_path rb 64 |
26 | tmp_file_name_table dd ? |
26 | tmp_file_name_table dd ? |
27 | endg |
27 | endg |
28 | 28 | ||
29 | ; ¡¥à¥â ¯ à ¬¥âàë bx_from_load ¨ ¨¨æ¨ «¨§¨àã¥â § ¬¥ã ¤«ï /sys |
29 | ; ¡¥à¥â ¯ à ¬¥âàë bx_from_load ¨ ¨¨æ¨ «¨§¨àã¥â § ¬¥ã ¤«ï /sys |
30 | Parser_params: |
30 | Parser_params: |
31 | mov eax,[OS_BASE+0x10000+bx_from_load] |
31 | mov eax,[OS_BASE+0x10000+bx_from_load] |
32 | mov ecx,sysdir_path |
32 | mov ecx,sysdir_path |
33 | mov [ecx-64],dword 'sys' |
33 | mov [ecx-64],dword 'sys' |
34 | cmp al,'r' ; à ¬ ¤¨áª |
34 | cmp al,'r' ; à ¬ ¤¨áª |
35 | jnz @f |
35 | jnz @f |
36 | mov [ecx],dword 'RD/?' |
36 | mov [ecx],dword 'RD/?' |
37 | mov [ecx+3],byte ah |
37 | mov [ecx+3],byte ah |
38 | mov [ecx+4],byte 0 |
38 | mov [ecx+4],byte 0 |
39 | ret |
39 | ret |
40 | @@: |
40 | @@: |
41 | sub al,49 |
41 | sub al,49 |
42 | mov [ecx],dword 'HD?/' |
42 | mov [ecx],dword 'HD?/' |
43 | mov [ecx+2],byte al |
43 | mov [ecx+2],byte al |
44 | mov [ecx+4],byte ah |
44 | mov [ecx+4],byte ah |
45 | mov [ecx+5],dword '/KOL' |
45 | mov [ecx+5],dword '/KOL' |
46 | mov [ecx+9],dword 'IBRI' |
46 | mov [ecx+9],dword 'IBRI' |
47 | mov [ecx+13],byte 0 |
47 | mov [ecx+13],byte 0 |
48 | ret |
48 | ret |
49 | 49 | ||
50 | proc load_file_parse_table |
50 | proc load_file_parse_table |
51 | stdcall kernel_alloc,0x1000 |
51 | stdcall kernel_alloc,0x1000 |
52 | mov [tmp_file_name_table],eax |
52 | mov [tmp_file_name_table],eax |
53 | mov edi,eax |
53 | mov edi,eax |
54 | mov esi,sysdir_name |
54 | mov esi,sysdir_name |
55 | mov ecx,128/4 |
55 | mov ecx,128/4 |
56 | rep movsd |
56 | rep movsd |
57 | 57 | ||
58 | invoke ini.enum_keys,conf_fname,conf_path_sect,get_every_key |
58 | invoke ini.enum_keys,conf_fname,conf_path_sect,get_every_key |
59 | 59 | ||
60 | mov eax,[tmp_file_name_table] |
60 | mov eax,[tmp_file_name_table] |
61 | mov [full_file_name_table],eax |
61 | mov [full_file_name_table],eax |
62 | mov eax,[tmp_file_name_size] |
62 | mov eax,[tmp_file_name_size] |
63 | mov [full_file_name_table.size],eax |
63 | mov [full_file_name_table.size],eax |
64 | ret |
64 | ret |
65 | endp |
65 | endp |
66 | 66 | ||
67 | uglobal |
67 | uglobal |
68 | def_val_1 db 0 |
68 | def_val_1 db 0 |
69 | endg |
69 | endg |
70 | 70 | ||
71 | proc get_every_key stdcall, f_name, sec_name, key_name |
71 | proc get_every_key stdcall, f_name, sec_name, key_name |
72 | mov esi, [key_name] |
72 | mov esi, [key_name] |
73 | mov ecx, esi |
73 | mov ecx, esi |
74 | cmp byte [esi], '/' |
74 | cmp byte [esi], '/' |
75 | jnz @f |
75 | jnz @f |
76 | inc esi |
76 | inc esi |
77 | @@: |
77 | @@: |
78 | mov edi, [tmp_file_name_size] |
78 | mov edi, [tmp_file_name_size] |
79 | shl edi, 7 |
79 | shl edi, 7 |
80 | cmp edi, 0x1000 |
80 | cmp edi, 0x1000 |
81 | jae .stop_parse |
81 | jae .stop_parse |
82 | add edi, [tmp_file_name_table] |
82 | add edi, [tmp_file_name_table] |
83 | lea ebx, [edi+64] |
83 | lea ebx, [edi+64] |
84 | @@: |
84 | @@: |
85 | cmp edi, ebx |
85 | cmp edi, ebx |
86 | jae .skip_this_key |
86 | jae .skip_this_key |
87 | lodsb |
87 | lodsb |
88 | test al, al |
88 | test al, al |
89 | jz @f |
89 | jz @f |
90 | or al, 20h |
90 | or al, 20h |
91 | stosb |
91 | stosb |
92 | jmp @b |
92 | jmp @b |
93 | @@: |
93 | @@: |
94 | stosb |
94 | stosb |
95 | 95 | ||
96 | invoke ini.get_str, [f_name],[sec_name],ecx,ebx,64,def_val_1 |
96 | invoke ini.get_str, [f_name],[sec_name],ecx,ebx,64,def_val_1 |
97 | 97 | ||
98 | cmp byte [ebx], '/' |
98 | cmp byte [ebx], '/' |
99 | jnz @f |
99 | jnz @f |
100 | lea esi, [ebx+1] |
100 | lea esi, [ebx+1] |
101 | mov edi, ebx |
101 | mov edi, ebx |
102 | mov ecx, 63 |
102 | mov ecx, 63 |
103 | rep movsb |
103 | rep movsb |
104 | @@: |
104 | @@: |
105 | push ebp |
105 | push ebp |
106 | mov ebp, [tmp_file_name_table] |
106 | mov ebp, [tmp_file_name_table] |
107 | mov ecx, [tmp_file_name_size] |
107 | mov ecx, [tmp_file_name_size] |
108 | jecxz .noreplace |
108 | jecxz .noreplace |
109 | mov eax, ecx |
109 | mov eax, ecx |
110 | dec eax |
110 | dec eax |
111 | shl eax, 7 |
111 | shl eax, 7 |
112 | add ebp, eax |
112 | add ebp, eax |
113 | .replace_loop: |
113 | .replace_loop: |
114 | mov edi, ebx |
114 | mov edi, ebx |
115 | mov esi, ebp |
115 | mov esi, ebp |
116 | @@: |
116 | @@: |
117 | lodsb |
117 | lodsb |
118 | test al, al |
118 | test al, al |
119 | jz .doreplace |
119 | jz .doreplace |
120 | mov dl, [edi] |
120 | mov dl, [edi] |
121 | inc edi |
121 | inc edi |
122 | test dl, dl |
122 | test dl, dl |
123 | jz .replace_loop_cont |
123 | jz .replace_loop_cont |
124 | or dl, 20h |
124 | or dl, 20h |
125 | cmp al, dl |
125 | cmp al, dl |
126 | jz @b |
126 | jz @b |
127 | jmp .replace_loop_cont |
127 | jmp .replace_loop_cont |
128 | .doreplace: |
128 | .doreplace: |
129 | cmp byte [edi], 0 |
129 | cmp byte [edi], 0 |
130 | jz @f |
130 | jz @f |
131 | cmp byte [edi], '/' |
131 | cmp byte [edi], '/' |
132 | jnz .replace_loop_cont |
132 | jnz .replace_loop_cont |
133 | @@: |
133 | @@: |
134 | lea esi, [ebp+64] |
134 | lea esi, [ebp+64] |
135 | call .replace |
135 | call .replace |
136 | jc .skip_this_key2 |
136 | jc .skip_this_key2 |
137 | .replace_loop_cont: |
137 | .replace_loop_cont: |
138 | sub ebp, 128 |
138 | sub ebp, 128 |
139 | loop .replace_loop |
139 | loop .replace_loop |
140 | .noreplace: |
140 | .noreplace: |
141 | pop ebp |
141 | pop ebp |
142 | 142 | ||
143 | inc [tmp_file_name_size] |
143 | inc [tmp_file_name_size] |
144 | .skip_this_key: |
144 | .skip_this_key: |
145 | xor eax, eax |
145 | xor eax, eax |
146 | inc eax |
146 | inc eax |
147 | ret |
147 | ret |
148 | .skip_this_key2: |
148 | .skip_this_key2: |
149 | pop ebp |
149 | pop ebp |
150 | jmp .skip_this_key |
150 | jmp .skip_this_key |
151 | .stop_parse: |
151 | .stop_parse: |
152 | xor eax, eax |
152 | xor eax, eax |
153 | ret |
153 | ret |
154 | endp |
154 | endp |
155 | 155 | ||
156 | proc get_every_key.replace |
156 | proc get_every_key.replace |
157 | ; in: ebx->destination, esi->first part of name, edi->second part of name |
157 | ; in: ebx->destination, esi->first part of name, edi->second part of name |
158 | ; maximum length is 64 bytes |
158 | ; maximum length is 64 bytes |
159 | ; out: CF=1 <=> overflow |
159 | ; out: CF=1 <=> overflow |
160 | ; 1) allocate temporary buffer in stack |
160 | ; 1) allocate temporary buffer in stack |
161 | sub esp, 64 |
161 | sub esp, 64 |
162 | ; 2) save second part of name to temporary buffer |
162 | ; 2) save second part of name to temporary buffer |
163 | push esi |
163 | push esi |
164 | lea esi, [esp+4] ; esi->tmp buffer |
164 | lea esi, [esp+4] ; esi->tmp buffer |
165 | xchg esi, edi ; edi->tmp buffer, esi->source |
165 | xchg esi, edi ; edi->tmp buffer, esi->source |
166 | @@: |
166 | @@: |
167 | lodsb |
167 | lodsb |
168 | stosb |
168 | stosb |
169 | test al, al |
169 | test al, al |
170 | jnz @b |
170 | jnz @b |
171 | ; 3) copy first part of name to destination |
171 | ; 3) copy first part of name to destination |
172 | pop esi |
172 | pop esi |
173 | mov edi, ebx |
173 | mov edi, ebx |
174 | @@: |
174 | @@: |
175 | lodsb |
175 | lodsb |
176 | test al, al |
176 | test al, al |
177 | jz @f |
177 | jz @f |
178 | stosb |
178 | stosb |
179 | jmp @b |
179 | jmp @b |
180 | @@: |
180 | @@: |
181 | ; 4) restore second part of name from temporary buffer to destination |
181 | ; 4) restore second part of name from temporary buffer to destination |
182 | ; (may cause overflow) |
182 | ; (may cause overflow) |
183 | lea edx, [ebx+64] ; limit of destination |
183 | lea edx, [ebx+64] ; limit of destination |
184 | mov esi, esp |
184 | mov esi, esp |
185 | @@: |
185 | @@: |
186 | cmp edi, edx |
186 | cmp edi, edx |
187 | jae .overflow |
187 | jae .overflow |
188 | lodsb |
188 | lodsb |
189 | stosb |
189 | stosb |
190 | test al, al |
190 | test al, al |
191 | jnz @b |
191 | jnz @b |
192 | ; all is OK |
192 | ; all is OK |
193 | add esp, 64 ; CF is cleared |
193 | add esp, 64 ; CF is cleared |
194 | ret |
194 | ret |
195 | .overflow: |
195 | .overflow: |
196 | ; name is too long |
196 | ; name is too long |
197 | add esp, 64 |
197 | add esp, 64 |
198 | stc |
198 | stc |
199 | ret |
199 | ret |
200 | endp=> |
200 | endp=> |