Rev 6462 | Rev 6468 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6462 | Rev 6464 | ||
---|---|---|---|
Line 3... | Line 3... | ||
3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
3 | ;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;; |
4 | ;; Distributed under terms of the GNU General Public License. ;; |
4 | ;; Distributed under terms of the GNU General Public License. ;; |
5 | ;; ;; |
5 | ;; ;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 6462 $ |
8 | $Revision: 6464 $ |
9 | 9 | ||
10 | ERROR_SUCCESS = 0 |
10 | ERROR_SUCCESS = 0 |
11 | ERROR_DISK_BASE = 1 |
11 | ERROR_DISK_BASE = 1 |
Line 23... | Line 23... | ||
23 | ERROR_OUT_OF_MEMORY = 12 |
23 | ERROR_OUT_OF_MEMORY = 12 |
Line 24... | Line 24... | ||
24 | 24 | ||
25 | image_of_eax EQU esp+32 |
25 | image_of_eax EQU esp+32 |
Line 26... | Line -... | ||
26 | image_of_ebx EQU esp+20 |
- | |
27 | - | ||
28 | ; System function 70 - files with long names (LFN) |
- | |
29 | ; diamond, 2006 |
- | |
30 | - | ||
31 | iglobal |
- | |
32 | ; in this table names must be in lowercase |
- | |
33 | rootdirs: |
- | |
34 | ;********************************************** |
- | |
35 | db 3,'cd0' |
- | |
36 | dd fs_OnCd0 |
- | |
37 | dd fs_NextCd |
- | |
38 | db 3,'cd1' |
- | |
39 | dd fs_OnCd1 |
- | |
40 | dd fs_NextCd |
- | |
41 | db 3,'cd2' |
- | |
42 | dd fs_OnCd2 |
- | |
43 | dd fs_NextCd |
- | |
44 | db 3,'cd3' |
- | |
45 | dd fs_OnCd3 |
- | |
46 | dd fs_NextCd |
- | |
47 | db 3,'cd4' |
- | |
48 | dd fs_OnCd4 |
- | |
49 | dd fs_NextCd |
- | |
50 | db 3,'cd5' |
- | |
51 | dd fs_OnCd5 |
- | |
52 | dd fs_NextCd |
- | |
53 | db 3,'cd6' |
- | |
54 | dd fs_OnCd6 |
- | |
55 | dd fs_NextCd |
- | |
56 | db 3,'cd7' |
- | |
57 | dd fs_OnCd7 |
- | |
58 | dd fs_NextCd |
- | |
59 | db 3,'cd8' |
- | |
60 | dd fs_OnCd8 |
- | |
61 | dd fs_NextCd |
- | |
62 | db 3,'cd9' |
- | |
63 | dd fs_OnCd9 |
- | |
64 | dd fs_NextCd |
- | |
65 | db 4,'cd10' |
- | |
66 | dd fs_OnCd10 |
- | |
67 | dd fs_NextCd |
- | |
68 | db 4,'cd11' |
- | |
69 | dd fs_OnCd11 |
- | |
70 | dd fs_NextCd |
- | |
71 | ;*********************************************** |
- | |
72 | db 0 |
- | |
73 | - | ||
74 | - | ||
75 | virtual_root_query: |
- | |
76 | ;********************************************** |
- | |
77 | dd fs_HasCd0 |
- | |
78 | db 'cd0',0 |
- | |
79 | dd fs_HasCd1 |
- | |
80 | db 'cd1',0 |
- | |
81 | dd fs_HasCd2 |
- | |
82 | db 'cd2',0 |
- | |
83 | dd fs_HasCd3 |
- | |
84 | db 'cd3',0 |
- | |
85 | dd fs_HasCd4 |
- | |
86 | db 'cd4',0 |
- | |
87 | dd fs_HasCd5 |
- | |
88 | db 'cd5',0 |
- | |
89 | dd fs_HasCd6 |
- | |
90 | db 'cd6',0 |
- | |
91 | dd fs_HasCd7 |
- | |
92 | db 'cd7',0 |
- | |
93 | dd fs_HasCd8 |
- | |
94 | db 'cd8',0 |
- | |
95 | dd fs_HasCd9 |
- | |
96 | db 'cd9',0 |
- | |
97 | dd fs_HasCd10 |
- | |
98 | db 'cd10',0 |
- | |
99 | dd fs_HasCd11 |
- | |
100 | db 'cd11',0 |
26 | image_of_ebx EQU esp+20 |
101 | ;********************************************** |
- | |
Line 102... | Line 27... | ||
102 | dd 0 |
27 | |
103 | endg |
28 | ; System function 70 |
104 | 29 | ||
105 | file_system_lfn_protected: |
30 | file_system_lfn_protected: |
Line 111... | Line 36... | ||
111 | mov [image_of_eax], eax |
36 | mov [image_of_eax], eax |
112 | mov [image_of_ebx], ebx |
37 | mov [image_of_ebx], ebx |
113 | ret |
38 | ret |
Line 114... | Line 39... | ||
114 | 39 | ||
115 | file_system_lfn: |
40 | file_system_lfn: |
116 | ; in: ebx->fileinfo block |
41 | ; in: ebx -> parameter structure |
117 | ; operation codes: |
42 | ; operation codes: |
118 | ; 0 : read file |
43 | ; 0 = read file |
119 | ; 1 : read folder |
44 | ; 1 = read folder |
120 | ; 2 : create/rewrite file |
45 | ; 2 = create/rewrite file |
121 | ; 3 : write/append to file |
46 | ; 3 = write/append to file |
122 | ; 4 : set end of file |
47 | ; 4 = set file end |
123 | ; 5 : get file/directory attributes structure |
48 | ; 5 = get file info |
124 | ; 6 : set file/directory attributes structure |
49 | ; 6 = set file info |
125 | ; 7 : start application |
50 | ; start application |
126 | ; 8 : delete file |
51 | ; 8 = delete file/folder |
127 | ; 9 : create directory |
- | |
128 | - | ||
129 | ; parse file name |
52 | ; 9 = create folder |
130 | lea esi, [ebx+20] |
53 | lea esi, [ebx+20] |
131 | lodsb |
54 | lodsb |
132 | test al, al |
55 | test al, al |
133 | jnz @f |
56 | jnz @f |
134 | mov esi, [esi] |
57 | mov esi, [esi] |
135 | lodsb |
58 | lodsb |
136 | @@: |
59 | @@: |
137 | lea ebp, [esi-1] |
60 | lea ebp, [esi-1] |
138 | if 0 |
61 | if 0 |
139 | cmp [ebx], dword 0 |
62 | cmp [ebx], dword 0 |
140 | jne @F |
63 | jne .1 |
141 | DEBUGF 1,'read file %s\n',ebp |
64 | DEBUGF 1,'read file %s\n',ebp |
142 | jmp .1 |
65 | jmp @f |
143 | @@: |
66 | .1: |
144 | cmp [ebx], dword 5 |
67 | cmp [ebx], dword 5 |
145 | jne @F |
68 | jne @f |
146 | DEBUGF 1,'get file attributes %s\n',ebp |
69 | DEBUGF 1,'get file attributes %s\n',ebp |
147 | @@: |
- | |
148 | .1: |
70 | @@: |
149 | end if |
- | |
150 | 71 | end if |
|
151 | cmp dword [ebx], 7 |
72 | cmp dword[ebx], 7 ; start application |
152 | jne @F |
73 | jne @f |
153 | mov edx, [ebx+4] |
74 | mov edx, [ebx+4] |
154 | mov ebx, [ebx+8] |
75 | mov ebx, [ebx+8] |
155 | call fs_execute; ebp, ebx, edx |
76 | call fs_execute ; ebp, ebx, edx |
156 | mov [image_of_eax], eax |
77 | mov [image_of_eax], eax |
- | 78 | ret |
|
157 | ret |
79 | |
158 | @@: |
80 | @@: |
159 | cmp al, '/' |
81 | cmp al, '/' |
160 | jz .notcurdir |
82 | jz .notcurdir |
161 | dec esi |
83 | dec esi |
Line 165... | Line 87... | ||
165 | xor ebp, ebp |
87 | xor ebp, ebp |
166 | @@: |
88 | @@: |
167 | mov esi, [current_slot] |
89 | mov esi, [current_slot] |
168 | mov esi, [esi+APPDATA.cur_dir] |
90 | mov esi, [esi+APPDATA.cur_dir] |
169 | jmp .parse_normal |
91 | jmp .parse_normal |
- | 92 | ||
170 | .notcurdir: |
93 | .notcurdir: |
171 | cmp byte [esi], 0 |
94 | cmp byte [esi], 0 |
172 | jz .rootdir |
95 | jz .rootdir |
173 | call process_replace_file_name |
96 | call process_replace_file_name |
174 | .parse_normal: |
97 | .parse_normal: |
175 | mov edi, rootdirs-8 |
98 | mov ax, [esi] |
176 | xor ecx, ecx |
99 | or ax, 2020h |
177 | push esi |
100 | cmp ax, 'cd' |
178 | .scan1: |
- | |
179 | pop esi |
101 | jz .CD |
180 | add edi, ecx |
102 | call dyndisk_handler ; not returns if success |
181 | scasd |
- | |
182 | scasd |
103 | .notfound: |
183 | mov cl, byte [edi] |
104 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
184 | test cl, cl |
105 | ret |
- | 106 | ||
185 | jz .notfound_try |
107 | .CD: |
186 | inc edi |
108 | add esi, 2 |
187 | push esi |
109 | xor eax, eax |
188 | @@: |
- | |
189 | lodsb |
110 | lodsb ; disk number |
190 | or al, 20h |
111 | sub eax, '0' |
191 | scasb |
112 | cmp eax, 10 |
192 | loopz @b |
113 | jnc .notfound |
193 | jnz .scan1 |
114 | mov edi, eax |
194 | lodsb |
115 | lodsb |
- | 116 | test eax, eax |
|
- | 117 | jz .maindir |
|
195 | cmp al, '/' |
118 | cmp al, '/' |
196 | jz .found1 |
119 | jnz .notfound |
- | 120 | lodsb ; partition number |
|
197 | test al, al |
121 | test eax, eax |
- | 122 | jz .maindir |
|
- | 123 | cmp al, '1' |
|
- | 124 | jnz .notfound |
|
- | 125 | cmp byte [esi], '/' |
|
- | 126 | jnz @f |
|
- | 127 | inc esi |
|
- | 128 | @@: |
|
- | 129 | cmp byte [esi], 0 |
|
198 | jnz .scan1 |
130 | jnz @f |
- | 131 | test ebp, ebp |
|
- | 132 | jz @f |
|
- | 133 | mov esi, ebp |
|
- | 134 | xor ebp, ebp |
|
- | 135 | @@: |
|
- | 136 | call reserve_cd |
|
- | 137 | mov eax, edi |
|
- | 138 | bt eax, 0 |
|
- | 139 | setc [DiskNumber] |
|
- | 140 | bt eax, 1 |
|
- | 141 | setc [ChannelNumber] |
|
- | 142 | inc [ChannelNumber] |
|
199 | pop eax |
143 | inc eax |
- | 144 | mov [cdpos], eax |
|
- | 145 | call reserve_cd_channel |
|
- | 146 | mov eax, edi |
|
200 | ; directory /xxx |
147 | not eax |
- | 148 | and eax, 3 |
|
- | 149 | shl eax, 1 |
|
- | 150 | inc eax |
|
- | 151 | shr edi, 2 |
|
- | 152 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
|
- | 153 | bt [edi*5+DRIVE_DATA+1], ax |
|
- | 154 | jnc @f |
|
- | 155 | mov ecx, [ebx+12] |
|
- | 156 | mov edx, [ebx+16] |
|
- | 157 | mov eax, [ebx] |
|
- | 158 | mov dword[image_of_eax], ERROR_UNSUPPORTED_FS |
|
- | 159 | cmp eax, fs_NumCdServices |
|
- | 160 | jae @f |
|
- | 161 | add ebx, 4 |
|
- | 162 | call dword[fs_CdServices + eax*4] |
|
- | 163 | call free_cd_channel |
|
- | 164 | and [cd_status], 0 |
|
- | 165 | mov [image_of_eax], eax |
|
- | 166 | mov [image_of_ebx], ebx |
|
- | 167 | ret |
|
- | 168 | ||
- | 169 | @@: |
|
- | 170 | call free_cd_channel |
|
- | 171 | and [cd_status], 0 |
|
- | 172 | ret |
|
- | 173 | ||
201 | .maindir: |
174 | .nextCD: |
- | 175 | test eax, eax ; partition number |
|
- | 176 | stc |
|
- | 177 | jnz @f ; no more partitions |
|
202 | mov esi, [edi+4] |
178 | mov al, 1 ; /cdX/1 |
- | 179 | clc |
|
- | 180 | @@: |
|
- | 181 | ret |
|
- | 182 | ||
203 | .maindir_noesi: |
183 | .maindir: ; list partitions |
- | 184 | mov esi, .nextCD |
|
- | 185 | .maindir_noesi: ; backjump from dyndisk_handler |
|
204 | cmp dword [ebx], 1 |
186 | cmp dword[ebx], 1 |
205 | jnz .access_denied |
187 | jnz .access_denied ; read folder? |
206 | xor eax, eax |
188 | push ecx |
207 | mov ebp, [ebx+12] ;the number of blocks to read |
189 | mov ebp, [ebx+12] ; the number of blocks to read |
208 | mov edx, [ebx+16] ;where to write the result |
190 | mov edx, [ebx+16] ; where to write the result |
209 | ; add edx, std_application_base_address |
- | |
210 | push dword [ebx+4] ; first block |
191 | push dword[ebx+4] ; first block |
211 | mov ebx, [ebx+8] ; flags |
192 | mov ebx, [ebx+8] ; flags |
212 | ; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler |
- | |
213 | mov edi, edx |
- | |
214 | push ecx |
- | |
215 | mov ecx, 32/4 |
193 | mov ecx, 32/4 |
- | 194 | mov edi, edx |
|
- | 195 | xor eax, eax |
|
216 | rep stosd |
196 | rep stosd |
217 | pop ecx |
- | |
218 | mov byte [edx], 1 ; version |
197 | mov byte [edx], 1 ; version |
219 | .maindir_loop: |
198 | .maindir_loop: |
220 | call esi |
199 | call esi |
221 | jc .maindir_done |
200 | jc .maindir_done |
222 | inc dword [edx+8] |
201 | inc dword[edx+8] |
223 | dec dword [esp] |
202 | dec dword[esp] |
224 | jns .maindir_loop |
203 | jns .maindir_loop |
225 | dec ebp |
204 | dec ebp |
226 | js .maindir_loop |
205 | js .maindir_loop |
227 | inc dword [edx+4] |
206 | inc dword[edx+4] |
228 | mov dword [edi], 0x10 ; attributes: folder |
207 | mov dword[edi], 16 ; attributes: folder |
229 | mov dword [edi+4], 1 ; name type: UNICODE |
208 | mov dword[edi+4], ebx ; name encoding |
230 | push eax |
209 | push eax |
231 | xor eax, eax |
210 | mov ecx, 32/4 |
232 | add edi, 8 |
211 | add edi, 8 |
233 | push ecx |
- | |
234 | mov ecx, 40/4-2 |
212 | xor eax, eax |
235 | rep stosd |
213 | rep stosd |
236 | pop ecx |
- | |
237 | pop eax |
214 | pop eax |
238 | push eax edx |
215 | push eax edx edi |
239 | ; convert number in eax to decimal UNICODE string |
216 | ; convert number in eax to decimal string |
240 | push edi |
- | |
241 | push ecx |
- | |
242 | push -'0' |
217 | push -'0' |
243 | mov ecx, 10 |
218 | mov ecx, 10 |
244 | @@: |
219 | @@: |
245 | xor edx, edx |
220 | xor edx, edx |
246 | div ecx |
221 | div ecx |
247 | push edx |
222 | push edx |
248 | test eax, eax |
223 | test eax, eax |
249 | jnz @b |
224 | jnz @b |
- | 225 | cmp ebx, 1 |
|
- | 226 | jz .uni |
|
250 | @@: |
227 | @@: |
251 | pop eax |
228 | pop eax |
252 | add al, '0' |
229 | add eax, '0' |
253 | stosb |
230 | stosb |
254 | test bl, 1 ; UNICODE name? |
- | |
255 | jz .ansi2 |
- | |
256 | mov byte [edi], 0 |
- | |
257 | inc edi |
- | |
258 | .ansi2: |
- | |
259 | test al, al |
231 | test eax, eax |
260 | jnz @b |
232 | jnz @b |
261 | mov byte [edi-1], 0 |
233 | pop edi edx eax |
- | 234 | add edi, 264 |
|
- | 235 | jmp .maindir_loop |
|
- | 236 | ||
- | 237 | .uni: |
|
262 | pop ecx |
238 | pop eax |
- | 239 | add eax, '0' |
|
- | 240 | stosw |
|
- | 241 | test eax, eax |
|
263 | pop edi |
242 | jnz .uni |
264 | ; UNICODE name length is 520 bytes, ANSI - 264 |
243 | pop edi edx eax |
265 | add edi, 520 |
244 | add edi, 520 |
266 | test bl, 1 |
- | |
267 | jnz @f |
- | |
268 | sub edi, 520-264 |
- | |
269 | @@: |
- | |
270 | pop edx eax |
- | |
271 | jmp .maindir_loop |
245 | jmp .maindir_loop |
- | 246 | ||
272 | .maindir_done: |
247 | .maindir_done: |
273 | pop eax |
248 | pop eax eax |
274 | mov ebx, [edx+4] |
249 | mov ebx, [edx+4] |
275 | xor eax, eax |
250 | xor eax, eax |
276 | dec ebp |
251 | dec ebp |
277 | js @f |
252 | js @f |
278 | mov al, ERROR_END_OF_FILE |
253 | mov al, ERROR_END_OF_FILE |
279 | @@: |
254 | @@: |
280 | mov [image_of_eax], eax |
255 | mov [image_of_eax], eax |
281 | mov [image_of_ebx], ebx |
256 | mov [image_of_ebx], ebx |
282 | ret |
257 | ret |
283 | ; directory / |
- | |
284 | .rootdir: |
258 | |
285 | cmp dword [ebx], 1 ; read folder? |
- | |
286 | jz .readroot |
- | |
287 | .access_denied: |
259 | .access_denied: |
288 | mov dword [image_of_eax], 10 ; access denied |
260 | mov dword[image_of_eax], ERROR_ACCESS_DENIED |
289 | ret |
261 | ret |
Line 290... | Line 262... | ||
290 | 262 | ||
291 | .readroot: |
263 | .rootdir: ; / - virtual root folder |
292 | ; virtual root folder - special handler |
264 | cmp dword[ebx], 1 ; read folder? |
293 | mov ebp, [ebx+12] |
265 | jnz .access_denied |
294 | mov edx, [ebx+16] |
266 | mov ebp, [ebx+12] ; number of blocks |
295 | ; add edx, std_application_base_address |
267 | mov edx, [ebx+16] ; return area |
296 | push dword [ebx+4] ; first block |
268 | push dword[ebx+4] ; first block |
297 | mov ebx, [ebx+8] ; flags |
- | |
298 | xor eax, eax |
- | |
299 | ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area |
- | |
300 | mov edi, edx |
269 | mov ebx, [ebx+8] ; flags |
- | 270 | mov ecx, 32/4 |
|
- | 271 | mov edi, edx |
|
301 | mov ecx, 32/4 |
272 | xor eax, eax |
302 | rep stosd |
273 | rep stosd |
303 | mov byte [edx], 1 ; version |
274 | mov byte [edx], 1 ; version |
304 | sub esp, 16 |
275 | sub esp, 16 |
305 | .readroot_ah_loop2: |
276 | .rootdir_loop: |
306 | push edi |
277 | push edi |
307 | lea edi, [esp+4] |
278 | lea edi, [esp+4] |
308 | call dyndisk_enum_root |
279 | call dyndisk_enum_root |
309 | pop edi |
280 | pop edi |
310 | test eax, eax |
281 | test eax, eax |
311 | jz .readroot_done_dynamic |
282 | jz .rootdirCD |
312 | inc dword [edx+8] |
283 | inc dword[edx+8] |
313 | dec dword [esp+16] |
284 | dec dword[esp+16] |
314 | jns .readroot_ah_loop2 |
285 | jns .rootdir_loop |
315 | dec ebp |
286 | dec ebp |
316 | js .readroot_ah_loop2 |
- | |
317 | push eax |
- | |
318 | xor eax, eax |
287 | js .rootdir_loop |
319 | inc dword [edx+4] |
288 | inc dword[edx+4] |
320 | mov dword [edi], 0x10 ; attributes: folder |
289 | mov dword[edi], 16 ; attributes: folder |
- | 290 | mov dword[edi+4], ebx ; name encoding |
|
- | 291 | push eax |
|
321 | mov dword [edi+4], ebx |
292 | mov ecx, 32/4 |
322 | add edi, 8 |
293 | add edi, 8 |
323 | mov ecx, 40/4-2 |
294 | xor eax, eax |
324 | rep stosd |
295 | rep stosd |
325 | push esi edi |
296 | push esi edi |
- | 297 | lea esi, [esp+12] |
|
- | 298 | cmp ebx, 1 |
|
326 | lea esi, [esp+12] |
299 | jz .uni2 |
327 | @@: |
300 | @@: |
328 | lodsb |
301 | lodsb |
329 | stosb |
- | |
330 | test bl, 1 |
- | |
331 | jz .ansi3 |
- | |
332 | mov byte [edi], 0 |
- | |
333 | inc edi |
- | |
334 | .ansi3: |
302 | stosb |
335 | test al, al |
303 | test eax, eax |
336 | jnz @b |
304 | jnz @b |
- | 305 | pop edi esi eax |
|
- | 306 | add edi, 264 |
|
- | 307 | jmp .rootdir_loop |
|
- | 308 | ||
- | 309 | .uni2: |
|
- | 310 | lodsb |
|
- | 311 | stosw |
|
- | 312 | test eax, eax |
|
- | 313 | jnz .uni2 |
|
337 | pop edi esi eax |
314 | pop edi esi eax |
338 | add edi, 520 |
- | |
339 | test bl, 1 |
- | |
340 | jnz .readroot_ah_loop2 |
- | |
341 | sub edi, 520-264 |
315 | add edi, 520 |
- | 316 | jmp .rootdir_loop |
|
342 | jmp .readroot_ah_loop2 |
317 | |
343 | .readroot_done_dynamic: |
318 | .rootdirCD: |
344 | add esp, 16 |
319 | add esp, 16 |
345 | mov esi, virtual_root_query |
320 | or esi, -1 |
346 | .readroot_loop: |
321 | .rootdirCD_loop: |
347 | cmp dword [esi], eax |
322 | inc esi |
348 | jz .readroot_done |
323 | cmp esi, 10 |
349 | call dword [esi] |
324 | jnc .rootdir_done |
350 | add esi, 4 |
325 | mov eax, esi |
351 | test eax, eax |
326 | not eax |
352 | jnz @f |
- | |
353 | .readroot_next: |
327 | and eax, 3 |
354 | or ecx, -1 |
328 | shl eax, 1 |
355 | xchg esi, edi |
329 | inc eax |
356 | repnz scasb |
330 | mov ecx, esi |
357 | xchg esi, edi |
331 | shr ecx, 2 |
358 | jmp .readroot_loop |
- | |
359 | @@: |
332 | bt [ecx*5+DRIVE_DATA+1], ax |
360 | xor eax, eax |
333 | jnc .rootdirCD_loop |
361 | inc dword [edx+8] |
334 | inc dword[edx+8] |
362 | dec dword [esp] |
335 | dec dword[esp] |
363 | jns .readroot_next |
336 | jns .rootdirCD_loop |
364 | dec ebp |
337 | dec ebp |
365 | js .readroot_next |
338 | js .rootdirCD_loop |
366 | inc dword [edx+4] |
339 | inc dword[edx+4] |
367 | mov dword [edi], 0x10 ; attributes: folder |
340 | mov dword[edi], 16 ; attributes: folder |
- | 341 | mov dword[edi+4], ebx ; name encoding |
|
368 | mov dword [edi+4], ebx ; name type: UNICODE |
342 | mov ecx, 32/4 |
369 | add edi, 8 |
343 | add edi, 8 |
370 | mov ecx, 40/4-2 |
344 | xor eax, eax |
- | 345 | rep stosd |
|
- | 346 | mov eax, esi |
|
- | 347 | add eax, '0' |
|
371 | rep stosd |
348 | cmp ebx, 1 |
- | 349 | jz @f |
|
- | 350 | mov word [edi], 'cd' |
|
- | 351 | mov [edi+2], ax |
|
- | 352 | add edi, 264 |
|
- | 353 | jmp .rootdirCD_loop |
|
372 | push edi |
354 | |
373 | @@: |
- | |
374 | lodsb |
- | |
375 | stosb |
- | |
376 | test bl, 1 |
- | |
377 | jz .ansi |
355 | @@: |
378 | mov byte [edi], 0 |
- | |
379 | inc edi |
- | |
380 | .ansi: |
356 | mov dword[edi], 640063h |
381 | test eax, eax |
- | |
382 | jnz @b |
- | |
383 | pop edi |
357 | mov [edi+4], eax |
384 | add edi, 520 |
- | |
385 | test bl, 1 |
- | |
386 | jnz .readroot_loop |
- | |
387 | sub edi, 520-264 |
358 | add edi, 520 |
- | 359 | jmp .rootdirCD_loop |
|
388 | jmp .readroot_loop |
360 | |
389 | .readroot_done: |
361 | .rootdir_done: |
390 | pop eax |
362 | pop eax |
391 | mov ebx, [edx+4] |
363 | mov ebx, [edx+4] |
392 | xor eax, eax |
364 | xor eax, eax |
393 | dec ebp |
365 | dec ebp |
394 | js @f |
366 | js @f |
395 | mov al, ERROR_END_OF_FILE |
367 | mov al, ERROR_END_OF_FILE |
396 | @@: |
368 | @@: |
397 | mov [image_of_eax], eax |
369 | mov [image_of_eax], eax |
398 | mov [image_of_ebx], ebx |
370 | mov [image_of_ebx], ebx |
399 | ret |
- | |
400 | .notfound_try: |
- | |
401 | call dyndisk_handler |
- | |
402 | .notfound: |
- | |
403 | mov dword [image_of_eax], ERROR_FILE_NOT_FOUND |
- | |
404 | and dword [image_of_ebx], 0 |
- | |
405 | ret |
- | |
406 | - | ||
407 | .notfounda: |
- | |
408 | cmp edi, esp |
- | |
409 | jnz .notfound |
- | |
410 | call dword [edi+4] |
- | |
411 | add esp, 16 |
- | |
412 | jmp .notfound |
- | |
413 | - | ||
414 | .found1: |
- | |
415 | pop eax |
- | |
416 | cmp byte [esi], 0 |
- | |
417 | jz .maindir |
- | |
418 | .found2: |
- | |
419 | ; read partition number |
- | |
420 | xor ecx, ecx |
- | |
421 | xor eax, eax |
- | |
422 | @@: |
- | |
423 | lodsb |
- | |
424 | cmp al, '/' |
- | |
425 | jz .done1 |
- | |
426 | test al, al |
- | |
427 | jz .done1 |
- | |
428 | sub al, '0' |
- | |
429 | cmp al, 9 |
- | |
430 | ja .notfounda |
- | |
431 | lea ecx, [ecx*5] |
- | |
432 | lea ecx, [ecx*2+eax] |
- | |
433 | jmp @b |
- | |
434 | .done1: |
- | |
435 | jecxz .notfounda |
- | |
436 | test al, al |
- | |
437 | jnz @f |
- | |
438 | dec esi |
- | |
439 | @@: |
- | |
440 | cmp byte [esi], 0 |
- | |
441 | jnz @f |
- | |
442 | test ebp, ebp |
- | |
443 | jz @f |
- | |
444 | mov esi, ebp |
- | |
445 | xor ebp, ebp |
- | |
446 | @@: |
- | |
447 | ; now [edi] contains handler address, ecx - partition number, |
- | |
448 | ; esi points to ASCIIZ string - rest of name |
- | |
449 | jmp dword [edi] |
- | |
450 | - | ||
451 | ; handlers for devices |
- | |
452 | ; in: ecx = 0 => query virtual directory /xxx |
- | |
453 | ; in: ecx = partition number |
- | |
454 | ; esi -> relative (for device) name |
- | |
455 | ; ebx -> fileinfo |
- | |
456 | ; ebp = 0 or pointer to rest of name from folder addressed by esi |
- | |
Line 457... | Line 371... | ||
457 | ; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx |
371 | ret |
458 | 372 | ||
459 | fs_NotImplemented: |
373 | fs_NotImplemented: |
460 | mov eax, 2 |
- | |
461 | ret |
- | |
462 | ;----------------------------------------------------------------------------- |
- | |
463 | fs_OnCd0: |
- | |
464 | call reserve_cd |
- | |
465 | mov [ChannelNumber], 1 |
- | |
466 | mov [DiskNumber], 0 |
- | |
467 | push 6 |
- | |
468 | push 1 |
- | |
469 | jmp fs_OnCd |
- | |
470 | ;----------------------------------------------------------------------------- |
- | |
471 | fs_OnCd1: |
- | |
472 | call reserve_cd |
- | |
473 | mov [ChannelNumber], 1 |
- | |
474 | mov [DiskNumber], 1 |
- | |
475 | push 4 |
- | |
476 | push 2 |
- | |
477 | jmp fs_OnCd |
- | |
478 | ;----------------------------------------------------------------------------- |
- | |
479 | fs_OnCd2: |
- | |
480 | call reserve_cd |
- | |
481 | mov [ChannelNumber], 2 |
- | |
482 | mov [DiskNumber], 0 |
- | |
483 | push 2 |
- | |
484 | push 3 |
- | |
485 | jmp fs_OnCd |
- | |
486 | ;----------------------------------------------------------------------------- |
- | |
487 | fs_OnCd3: |
- | |
488 | call reserve_cd |
- | |
489 | mov [ChannelNumber], 2 |
- | |
490 | mov [DiskNumber], 1 |
- | |
491 | push 0 |
- | |
492 | push 4 |
- | |
493 | jmp fs_OnCd |
- | |
494 | ;----------------------------------------------------------------------------- |
- | |
495 | fs_OnCd4: |
- | |
496 | call reserve_cd |
- | |
497 | mov [ChannelNumber], 1 |
- | |
498 | mov [DiskNumber], 0 |
- | |
499 | push 6 |
- | |
500 | push 5 |
- | |
501 | jmp fs_OnCd |
- | |
502 | ;----------------------------------------------------------------------------- |
- | |
503 | fs_OnCd5: |
- | |
504 | call reserve_cd |
- | |
505 | mov [ChannelNumber], 1 |
- | |
506 | mov [DiskNumber], 1 |
- | |
507 | push 4 |
- | |
508 | push 6 |
- | |
509 | jmp fs_OnCd |
- | |
510 | ;----------------------------------------------------------------------------- |
- | |
511 | fs_OnCd6: |
- | |
512 | call reserve_cd |
- | |
513 | mov [ChannelNumber], 2 |
- | |
514 | mov [DiskNumber], 0 |
- | |
515 | push 2 |
- | |
516 | push 7 |
- | |
517 | jmp fs_OnCd |
- | |
518 | ;----------------------------------------------------------------------------- |
- | |
519 | fs_OnCd7: |
- | |
520 | call reserve_cd |
- | |
521 | mov [ChannelNumber], 2 |
- | |
522 | mov [DiskNumber], 1 |
- | |
523 | push 0 |
- | |
524 | push 8 |
- | |
525 | jmp fs_OnCd |
- | |
526 | ;----------------------------------------------------------------------------- |
- | |
527 | fs_OnCd8: |
- | |
528 | call reserve_cd |
- | |
529 | mov [ChannelNumber], 1 |
- | |
530 | mov [DiskNumber], 0 |
- | |
531 | push 6 |
- | |
532 | push 9 |
- | |
533 | jmp fs_OnCd |
- | |
534 | ;----------------------------------------------------------------------------- |
- | |
535 | fs_OnCd9: |
- | |
536 | call reserve_cd |
- | |
537 | mov [ChannelNumber], 1 |
- | |
538 | mov [DiskNumber], 1 |
- | |
539 | push 4 |
- | |
540 | push 10 |
- | |
541 | jmp fs_OnCd |
- | |
542 | ;----------------------------------------------------------------------------- |
- | |
543 | fs_OnCd10: |
- | |
544 | call reserve_cd |
- | |
545 | mov [ChannelNumber], 2 |
- | |
546 | mov [DiskNumber], 0 |
- | |
547 | push 2 |
- | |
548 | push 11 |
- | |
549 | jmp fs_OnCd |
- | |
550 | ;----------------------------------------------------------------------------- |
- | |
551 | fs_OnCd11: |
- | |
552 | call reserve_cd |
- | |
553 | mov [ChannelNumber], 2 |
- | |
554 | mov [DiskNumber], 1 |
- | |
555 | push 0 |
- | |
556 | push 12 |
- | |
557 | ;----------------------------------------------------------------------------- |
- | |
558 | fs_OnCd: |
- | |
559 | pop eax |
- | |
560 | mov [cdpos], eax |
- | |
561 | call reserve_cd_channel |
- | |
562 | pop eax |
- | |
563 | cmp ecx, 0x100 |
- | |
564 | jae .nf |
- | |
565 | push ecx ebx |
- | |
566 | mov cl, al |
- | |
567 | - | ||
568 | push eax |
- | |
569 | mov eax, [cdpos] |
- | |
570 | dec eax |
- | |
571 | shr eax, 2 |
- | |
572 | lea eax, [eax*5] |
- | |
573 | mov bl, [eax+DRIVE_DATA+1] |
- | |
574 | pop eax |
- | |
575 | - | ||
576 | shr bl, cl |
- | |
Line 577... | Line -... | ||
577 | test bl, 2 |
- | |
578 | pop ebx ecx |
- | |
579 | - | ||
580 | jnz @f |
- | |
581 | .nf: |
- | |
582 | call free_cd_channel |
- | |
583 | and [cd_status], 0 |
- | |
584 | mov dword [image_of_eax], 5 ; not found |
- | |
585 | ret |
- | |
586 | @@: |
- | |
587 | mov ecx, [ebx+12] |
- | |
588 | mov edx, [ebx+16] |
- | |
589 | ; add edx, std_application_base_address |
- | |
590 | mov eax, [ebx] |
- | |
591 | cmp eax, fs_NumCdServices |
- | |
592 | jae .not_impl |
- | |
593 | add ebx, 4 |
- | |
594 | call dword [fs_CdServices + eax*4] |
- | |
595 | call free_cd_channel |
- | |
596 | and [cd_status], 0 |
- | |
597 | mov [image_of_eax], eax |
- | |
598 | mov [image_of_ebx], ebx |
- | |
599 | ret |
- | |
600 | .not_impl: |
- | |
601 | call free_cd_channel |
- | |
602 | and [cd_status], 0 |
374 | mov eax, 2 |
603 | mov dword [image_of_eax], 2 ; not implemented |
375 | ret |
604 | ret |
376 | |
605 | ;----------------------------------------------------------------------------- |
377 | ;----------------------------------------------------------------------------- |
606 | fs_CdServices: |
378 | fs_CdServices: |
Line 614... | Line 386... | ||
614 | dd 0 |
386 | dd 0 |
615 | dd fs_NotImplemented |
387 | dd fs_NotImplemented |
616 | dd fs_NotImplemented |
388 | dd fs_NotImplemented |
617 | fs_NumCdServices = ($ - fs_CdServices)/4 |
389 | fs_NumCdServices = ($ - fs_CdServices)/4 |
618 | ;----------------------------------------------------------------------------- |
390 | ;----------------------------------------------------------------------------- |
619 | fs_HasCd0: |
- | |
620 | test byte [DRIVE_DATA+1], 10000000b |
- | |
621 | setnz al |
- | |
622 | ret |
- | |
623 | ;-------------------------------------- |
- | |
624 | fs_HasCd1: |
- | |
625 | test byte [DRIVE_DATA+1], 00100000b |
- | |
626 | setnz al |
- | |
627 | ret |
- | |
628 | ;-------------------------------------- |
- | |
629 | fs_HasCd2: |
- | |
630 | test byte [DRIVE_DATA+1], 00001000b |
- | |
631 | setnz al |
- | |
632 | ret |
- | |
633 | ;-------------------------------------- |
- | |
634 | fs_HasCd3: |
- | |
635 | test byte [DRIVE_DATA+1], 00000010b |
- | |
636 | setnz al |
- | |
637 | ret |
- | |
638 | ;-------------------------------------- |
- | |
639 | fs_HasCd4: |
- | |
640 | test byte [DRIVE_DATA+6], 10000000b |
- | |
641 | setnz al |
- | |
642 | ret |
- | |
643 | ;-------------------------------------- |
- | |
644 | fs_HasCd5: |
- | |
645 | test byte [DRIVE_DATA+6], 00100000b |
- | |
646 | setnz al |
- | |
647 | ret |
- | |
648 | ;-------------------------------------- |
- | |
649 | fs_HasCd6: |
- | |
650 | test byte [DRIVE_DATA+6], 00001000b |
- | |
651 | setnz al |
- | |
652 | ret |
- | |
653 | ;-------------------------------------- |
- | |
654 | fs_HasCd7: |
- | |
655 | test byte [DRIVE_DATA+6], 00000010b |
- | |
656 | setnz al |
- | |
657 | ret |
- | |
658 | ;-------------------------------------- |
- | |
659 | fs_HasCd8: |
- | |
660 | test byte [DRIVE_DATA+11], 10000000b |
- | |
661 | setnz al |
- | |
662 | ret |
- | |
663 | ;-------------------------------------- |
- | |
664 | fs_HasCd9: |
- | |
665 | test byte [DRIVE_DATA+11], 00100000b |
- | |
666 | setnz al |
- | |
667 | ret |
- | |
668 | ;-------------------------------------- |
- | |
669 | fs_HasCd10: |
- | |
670 | test byte [DRIVE_DATA+11], 00001000b |
- | |
671 | setnz al |
- | |
672 | ret |
- | |
673 | ;-------------------------------------- |
- | |
674 | fs_HasCd11: |
- | |
675 | test byte [DRIVE_DATA+11], 00000010b |
- | |
676 | setnz al |
- | |
677 | ret |
- | |
678 | ;----------------------------------------------------------------------------- |
- | |
679 | ; |
- | |
680 | ; fs_NextXXX functions: |
- | |
681 | ; in: eax = partition number, from which start to scan |
- | |
682 | ; out: CF=1 => no more partitions |
- | |
683 | ; CF=0 => eax=next partition number |
- | |
684 | ; |
- | |
685 | ;----------------------------------------------------------------------------- |
- | |
686 | fs_NextCd: |
- | |
687 | ; we always have /cdX/1 |
- | |
688 | test eax, eax |
- | |
689 | stc |
- | |
690 | jnz @f |
- | |
691 | mov al, 1 |
- | |
692 | clc |
- | |
693 | @@: |
- | |
694 | ret |
- | |
695 | ;----------------------------------------------------------------------------- |
- | |
696 | process_replace_file_name: |
391 | process_replace_file_name: |
697 | ; in |
- | |
698 | ; esi - path with filename(f.70) |
392 | ; in: [esi] = virtual path |
699 | ; |
- | |
700 | ; out |
- | |
701 | ; ebp - full filename |
393 | ; out: [esi]+[ebp] = physical path |
702 | pushfd |
394 | pushfd |
703 | cli |
395 | cli |
704 | mov ebp, [full_file_name_table] |
396 | mov ebp, [full_file_name_table] |
705 | xor edi, edi |
397 | xor edi, edi |
706 | .loop: |
398 | .loop: |
707 | cmp edi, [full_file_name_table.size] |
399 | cmp edi, [full_file_name_table.size] |
708 | jae .notfound |
400 | jae .notfound |
709 | push esi edi |
401 | push esi edi |
710 | shl edi, 7 ; edi*128 |
402 | shl edi, 7 |
711 | add edi, ebp |
403 | add edi, ebp |
712 | @@: |
404 | @@: |
713 | cmp byte [edi], 0 ; end of dir_name |
405 | cmp byte [edi], 0 |
714 | jz .dest_done |
406 | jz .dest_done |
715 | lodsb |
407 | lodsb |
716 | test al, al |
408 | test al, al |
717 | jz .cont |
409 | jz .cont |
718 | or al, 20h ; 32 - space char |
410 | or al, 20h |
719 | scasb |
411 | scasb |
720 | jz @b |
412 | jz @b |
- | 413 | .cont: |
|
- | 414 | pop edi esi |
|
- | 415 | inc edi |
|
721 | jmp .cont |
416 | jmp .loop |
- | 417 | ||
722 | .dest_done: |
418 | .dest_done: |
723 | cmp byte [esi], 0 |
419 | cmp byte [esi], 0 |
724 | jz .found |
420 | jz .found |
725 | cmp byte [esi], '/' |
421 | cmp byte [esi], '/' |
726 | jnz .cont |
422 | jnz .cont |
727 | inc esi |
423 | inc esi |
728 | jmp .found |
- | |
729 | .cont: |
- | |
730 | pop edi esi |
- | |
731 | inc edi |
- | |
732 | jmp .loop |
- | |
733 | .found: |
424 | .found: |
734 | pop edi eax |
425 | pop edi eax |
735 | shl edi, 7 ; edi*128 |
426 | shl edi, 7 |
736 | add edi, ebp |
427 | add edi, ebp |
737 | mov ebp, esi |
428 | mov ebp, esi |
738 | cmp byte [esi], 0 |
429 | cmp byte [esi], 0 |
739 | lea esi, [edi+64] |
430 | lea esi, [edi+64] |
740 | jnz .ret |
431 | jnz .ret |
741 | .notfound: |
432 | .notfound: |
742 | xor ebp, ebp |
433 | xor ebp, ebp |
743 | .ret: |
434 | .ret: |
744 | popfd |
435 | popfd |
745 | ret |
436 | ret |
- | 437 | ||
746 | ;----------------------------------------------------------------------------- |
438 | ;----------------------------------------------------------------------------- |
747 | uglobal |
439 | uglobal |
748 | lock_flag_for_f30_3 rb 1 |
440 | lock_flag_for_f30_3 rb 1 |
749 | endg |
441 | endg |
Line 750... | Line 442... | ||
750 | 442 | ||
751 | sys_current_directory: |
- | |
752 | ; mov esi, [current_slot] |
- | |
753 | ; mov esi, [esi+APPDATA.cur_dir] |
- | |
754 | ; mov edx, esi |
- | |
755 | - | ||
756 | ;get length string of appdata.cur_dir |
443 | sys_current_directory: ; sysfunction 30 |
757 | mov eax, [current_slot] |
444 | mov eax, [current_slot] |
758 | mov edi, [eax+APPDATA.cur_dir] |
- | |
759 | 445 | mov edi, [eax+APPDATA.cur_dir] |
|
760 | dec ebx |
446 | dec ebx |
761 | jz .set |
447 | jz .set |
762 | dec ebx |
448 | dec ebx |
763 | jz .get |
449 | jz .get |
764 | dec ebx |
450 | dec ebx |
765 | jz .mount_additional_directory |
451 | jz .mount_additional_directory |
Line 766... | Line 452... | ||
766 | ret |
452 | ret |
767 | 453 | ||
768 | .mount_additional_directory: |
- | |
769 | ; sysfunction 30.2: [for app] eax=30,ebx=3,ecx->dir name+dir path (128) |
- | |
770 | ; for our code: nothing |
- | |
771 | 454 | .mount_additional_directory: |
|
772 | ; check lock of the function |
455 | ; in: ecx -> dir name+dir path (128) |
773 | cmp [lock_flag_for_f30_3], 1 |
- | |
774 | je @f |
456 | cmp [lock_flag_for_f30_3], 1 ; check lock |
775 | 457 | je @f |
|
776 | mov esi, ecx |
- | |
777 | mov edi, sysdir_name1 |
458 | mov esi, ecx |
778 | ; copying fake directory name |
459 | mov edi, sysdir_name1 |
779 | mov ecx, 63 |
460 | mov ecx, 63 |
780 | pushfd |
461 | pushfd |
781 | cli |
- | |
782 | cld |
462 | cli |
783 | rep movsb |
463 | cld |
784 | ; terminator of name, in case if we get the inlet trash |
464 | rep movsb ; copying fake directory name |
785 | inc esi |
- | |
786 | xor eax, eax |
465 | inc esi |
787 | stosb |
466 | xor eax, eax |
788 | ; copying real directory path for mounting |
- | |
789 | mov ecx, 63 |
467 | stosb ; terminator of name, in case if we get the inlet trash |
790 | rep movsb |
468 | mov ecx, 63 |
791 | ; terminator of name, in case if we get the inlet trash |
469 | rep movsb ; copying real directory path for mounting |
792 | xor eax, eax |
470 | xor eax, eax |
793 | stosb |
471 | stosb |
794 | ; increase the pointer of inputs for procedure "process_replace_file_name" |
- | |
795 | mov [full_file_name_table.size], 2 |
- | |
796 | ; block the ability to call f.30.3 because for one session is necessary |
472 | ; increase the pointer of inputs for procedure "process_replace_file_name" |
797 | ; for us only once |
473 | mov [full_file_name_table.size], 2 |
798 | mov [lock_flag_for_f30_3], 1 |
474 | mov [lock_flag_for_f30_3], 1 ; lock |
799 | popfd |
475 | popfd |
Line 800... | Line -... | ||
800 | @@: |
- | |
801 | ret |
- | |
802 | - | ||
803 | .get: |
476 | @@: |
804 | ; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len |
- | |
805 | ; for our code: ebx->buffer,ecx=len |
- | |
Line -... | Line 477... | ||
- | 477 | ret |
|
- | 478 | ||
806 | max_cur_dir equ 0x1000 |
479 | max_cur_dir equ 0x1000 ; length |
807 | 480 | ||
808 | mov ebx, edi |
- | |
809 | 481 | .get: ; in: ecx -> buffer, edx = length |
|
810 | push ecx |
482 | mov ebx, edi ; buffer |
811 | push edi |
- | |
812 | 483 | push ecx |
|
813 | xor eax, eax |
484 | push edi |
814 | mov ecx, max_cur_dir |
- | |
815 | 485 | xor eax, eax |
|
816 | repne scasb ;find zerro at and string |
486 | mov ecx, max_cur_dir |
817 | jnz .error ; no zero in cur_dir: internal error, should not happen |
487 | repne scasb |
818 | - | ||
819 | sub edi, ebx ;lenght for copy |
488 | jnz .error |
820 | inc edi |
489 | sub edi, ebx |
821 | mov [esp+32+8], edi ;return in eax |
490 | inc edi |
822 | 491 | mov [esp+32+8], edi ; return in eax |
|
823 | cmp edx, edi |
- | |
824 | jbe @f |
492 | cmp edx, edi |
825 | mov edx, edi |
- | |
826 | @@: |
493 | jbe @f |
827 | ;source string |
494 | mov edx, edi |
828 | pop esi |
495 | @@: |
829 | ;destination string |
- | |
830 | pop edi |
496 | pop esi |
831 | cmp edx, 1 |
497 | pop edi |
832 | jbe .ret |
498 | cmp edx, 1 |
833 | 499 | jbe .ret |
|
834 | mov al, '/' ;start string with '/' |
500 | mov al, '/' |
835 | stosb |
501 | stosb |
Line 836... | Line 502... | ||
836 | mov ecx, edx |
502 | mov ecx, edx |
837 | rep movsb ;copy string |
503 | rep movsb |
838 | .ret: |
504 | .ret: |
839 | ret |
505 | ret |
- | 506 | ||
840 | 507 | .error: |
|
841 | .error: |
- | |
842 | add esp, 8 |
508 | add esp, 8 |
843 | or dword [esp+32], -1 ;error not found zerro at string ->[eax+APPDATA.cur_dir] |
509 | or dword[esp+32], -1 |
844 | ret |
510 | ret |
845 | .set: |
511 | |
846 | ; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string |
512 | .set: |
847 | ; for our code: ebx->string to set |
- | |
848 | ; use generic resolver with APPDATA.cur_dir as destination |
- | |
849 | push max_cur_dir ;0x1000 |
- | |
850 | push edi ;destination |
- | |
851 | mov ebx, ecx |
- | |
852 | call get_full_file_name |
513 | pop eax |
- | 514 | push max_cur_dir |
|
- | 515 | push edi |
|
853 | ret |
516 | push eax |
854 | 517 | mov ebx, ecx |
|
855 | ; in: ebx = file name, [esp+4] = destination, [esp+8] = sizeof destination |
518 | get_full_file_name: |
856 | ; destroys all registers except ebp,esp |
519 | ; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length |
857 | get_full_file_name: |
520 | ; destroys all registers |
Line 864... | Line 527... | ||
864 | cmp byte [esi-1], 0 |
527 | cmp byte [esi-1], 0 |
865 | jnz @b |
528 | jnz @b |
866 | dec esi |
529 | dec esi |
867 | cmp byte [ebx], '/' |
530 | cmp byte [ebx], '/' |
868 | jz .set_absolute |
531 | jz .set_absolute |
869 | ; string gives relative path |
- | |
870 | mov edi, [esp+8] ; destination |
532 | mov edi, [esp+8] |
871 | .relative: |
533 | .relative: |
872 | cmp byte [ebx], 0 |
534 | cmp byte [ebx], 0 |
873 | jz .set_ok |
535 | jz .set_ok |
874 | cmp word [ebx], '.' |
536 | cmp word [ebx], '.' |
875 | jz .set_ok |
537 | jz .set_ok |
876 | cmp word [ebx], './' |
538 | cmp word [ebx], './' |
877 | jnz @f |
539 | jnz @f |
878 | add ebx, 2 |
540 | add ebx, 2 |
879 | jmp .relative |
541 | jmp .relative |
- | 542 | ||
880 | @@: |
543 | @@: |
881 | cmp word [ebx], '..' |
544 | cmp word [ebx], '..' |
882 | jnz .doset_relative |
545 | jnz .doset_relative |
883 | cmp byte [ebx+2], 0 |
546 | cmp byte [ebx+2], 0 |
884 | jz @f |
547 | jz @f |
Line 888... | Line 551... | ||
888 | dec esi |
551 | dec esi |
889 | cmp byte [esi], '/' |
552 | cmp byte [esi], '/' |
890 | jnz @b |
553 | jnz @b |
891 | add ebx, 3 |
554 | add ebx, 3 |
892 | jmp .relative |
555 | jmp .relative |
- | 556 | ||
893 | .set_ok: |
557 | .set_ok: |
894 | cmp edx, edi ; is destination equal to APPDATA.cur_dir? |
558 | cmp edx, edi ; is destination equal to APPDATA.cur_dir? |
895 | jz .set_ok.cur_dir |
559 | jz .set_ok.cur_dir |
896 | sub esi, edx |
560 | sub esi, edx |
897 | cmp esi, [esp+12] |
561 | cmp esi, [esp+12] |
898 | jb .set_ok.copy |
562 | jb .set_ok.copy |
899 | .fail: |
563 | .fail: |
900 | mov byte [edi], 0 |
564 | mov byte [edi], 0 |
901 | xor eax, eax ; fail |
565 | xor eax, eax |
902 | pop ebp |
566 | pop ebp |
903 | ret 8 |
567 | ret 8 |
- | 568 | ||
904 | .set_ok.copy: |
569 | .set_ok.copy: |
905 | mov ecx, esi |
570 | mov ecx, esi |
906 | mov esi, edx |
571 | mov esi, edx |
907 | rep movsb |
572 | rep movsb |
908 | mov byte [edi], 0 |
573 | mov byte [edi], 0 |
909 | .ret.ok: |
574 | .ret.ok: |
910 | mov al, 1 ; ok |
575 | mov al, 1 |
911 | pop ebp |
576 | pop ebp |
912 | ret 8 |
577 | ret 8 |
- | 578 | ||
913 | .set_ok.cur_dir: |
579 | .set_ok.cur_dir: |
914 | mov byte [esi], 0 |
580 | mov byte [esi], 0 |
915 | jmp .ret.ok |
581 | jmp .ret.ok |
- | 582 | ||
916 | .doset_relative: |
583 | .doset_relative: |
917 | cmp edx, edi |
584 | cmp edx, edi |
918 | jz .doset_relative.cur_dir |
585 | jz .doset_relative.cur_dir |
919 | sub esi, edx |
586 | sub esi, edx |
920 | cmp esi, [esp+12] |
587 | cmp esi, [esp+12] |
Line 922... | Line 589... | ||
922 | mov ecx, esi |
589 | mov ecx, esi |
923 | mov esi, edx |
590 | mov esi, edx |
924 | mov edx, edi |
591 | mov edx, edi |
925 | rep movsb |
592 | rep movsb |
926 | jmp .doset_relative.copy |
593 | jmp .doset_relative.copy |
- | 594 | ||
927 | .doset_relative.cur_dir: |
595 | .doset_relative.cur_dir: |
928 | mov edi, esi |
596 | mov edi, esi |
929 | .doset_relative.copy: |
597 | .doset_relative.copy: |
930 | add edx, [esp+12] |
598 | add edx, [esp+12] |
931 | mov byte [edi], '/' |
599 | mov byte [edi], '/' |
Line 941... | Line 609... | ||
941 | cmp edi, edx |
609 | cmp edi, edx |
942 | jb @b |
610 | jb @b |
943 | .overflow: |
611 | .overflow: |
944 | dec edi |
612 | dec edi |
945 | jmp .fail |
613 | jmp .fail |
- | 614 | ||
946 | .set_absolute: |
615 | .set_absolute: |
947 | lea esi, [ebx+1] |
616 | lea esi, [ebx+1] |
948 | call process_replace_file_name |
617 | call process_replace_file_name |
949 | mov edi, [esp+8] |
618 | mov edi, [esp+8] |
950 | mov edx, [esp+12] |
619 | mov edx, [esp+12] |
Line 956... | Line 625... | ||
956 | jz .set_part2 |
625 | jz .set_part2 |
957 | .set_copy_cont: |
626 | .set_copy_cont: |
958 | cmp edi, edx |
627 | cmp edi, edx |
959 | jb .set_copy |
628 | jb .set_copy |
960 | jmp .overflow |
629 | jmp .overflow |
- | 630 | ||
961 | .set_part2: |
631 | .set_part2: |
962 | mov esi, ebp |
632 | mov esi, ebp |
963 | xor ebp, ebp |
633 | xor ebp, ebp |
964 | test esi, esi |
634 | test esi, esi |
965 | jz .ret.ok |
635 | jz .ret.ok |