Rev 6464 | Rev 6471 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6464 | Rev 6468 | ||
---|---|---|---|
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
2 | ;; ;; |
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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
7 | 7 | ||
8 | $Revision: 6464 $ |
8 | $Revision: 6468 $ |
9 | 9 | ||
10 | ERROR_SUCCESS = 0 |
10 | ERROR_SUCCESS = 0 |
11 | ERROR_DISK_BASE = 1 |
11 | ERROR_DISK_BASE = 1 |
12 | ERROR_UNSUPPORTED_FS = 2 |
12 | ERROR_UNSUPPORTED_FS = 2 |
13 | ERROR_UNKNOWN_FS = 3 |
13 | ERROR_UNKNOWN_FS = 3 |
14 | ERROR_PARTITION = 4 |
14 | ERROR_PARTITION = 4 |
15 | ERROR_FILE_NOT_FOUND = 5 |
15 | ERROR_FILE_NOT_FOUND = 5 |
16 | ERROR_END_OF_FILE = 6 |
16 | ERROR_END_OF_FILE = 6 |
17 | ERROR_MEMORY_POINTER = 7 |
17 | ERROR_MEMORY_POINTER = 7 |
18 | ERROR_DISK_FULL = 8 |
18 | ERROR_DISK_FULL = 8 |
19 | ERROR_FAT_TABLE = 9 ;deprecated |
- | |
20 | ERROR_FS_FAIL = 9 |
19 | ERROR_FS_FAIL = 9 |
21 | ERROR_ACCESS_DENIED = 10 |
20 | ERROR_ACCESS_DENIED = 10 |
22 | ERROR_DEVICE = 11 |
21 | ERROR_DEVICE = 11 |
23 | ERROR_OUT_OF_MEMORY = 12 |
22 | ERROR_OUT_OF_MEMORY = 12 |
- | 23 | ||
- | 24 | maxPathLength = 1000h |
|
24 | 25 | ||
25 | image_of_eax EQU esp+32 |
26 | image_of_eax EQU esp+32 |
26 | image_of_ebx EQU esp+20 |
27 | image_of_ebx EQU esp+20 |
27 | 28 | ||
28 | ; System function 70 |
29 | ; System function 70 |
29 | 30 | ||
30 | file_system_lfn_protected: |
31 | file_system_lfn_protected: |
31 | pushad |
32 | pushad |
32 | call protect_from_terminate |
33 | call protect_from_terminate |
33 | call file_system_lfn |
34 | call file_system_lfn |
34 | call unprotect_from_terminate |
35 | call unprotect_from_terminate |
35 | popad |
36 | popad |
36 | mov [image_of_eax], eax |
37 | mov [image_of_eax], eax |
37 | mov [image_of_ebx], ebx |
38 | mov [image_of_ebx], ebx |
38 | ret |
39 | ret |
39 | 40 | ||
40 | file_system_lfn: |
41 | file_system_lfn: |
41 | ; in: ebx -> parameter structure |
42 | ; in: ebx -> parameter structure |
42 | ; operation codes: |
43 | ; operation codes: |
43 | ; 0 = read file |
44 | ; 0 = read file |
44 | ; 1 = read folder |
45 | ; 1 = read folder |
45 | ; 2 = create/rewrite file |
46 | ; 2 = create/rewrite file |
46 | ; 3 = write/append to file |
47 | ; 3 = write/append to file |
47 | ; 4 = set file end |
48 | ; 4 = set file end |
48 | ; 5 = get file info |
49 | ; 5 = get file info |
49 | ; 6 = set file info |
50 | ; 6 = set file info |
50 | ; start application |
51 | ; start application |
51 | ; 8 = delete file/folder |
52 | ; 8 = delete file/folder |
52 | ; 9 = create folder |
53 | ; 9 = create folder |
53 | lea esi, [ebx+20] |
54 | lea ebp, [ebx+20] |
54 | lodsb |
- | |
55 | test al, al |
55 | cmp byte [ebp], 0 |
56 | jnz @f |
56 | jnz @f |
57 | mov esi, [esi] |
57 | mov ebp, [ebx+21] |
58 | lodsb |
- | |
59 | @@: |
58 | @@: |
60 | lea ebp, [esi-1] |
- | |
61 | if 0 |
- | |
62 | cmp [ebx], dword 0 |
- | |
63 | jne .1 |
- | |
64 | DEBUGF 1,'read file %s\n',ebp |
- | |
65 | jmp @f |
- | |
66 | .1: |
- | |
67 | cmp [ebx], dword 5 |
- | |
68 | jne @f |
- | |
69 | DEBUGF 1,'get file attributes %s\n',ebp |
- | |
70 | @@: |
- | |
71 | end if |
- | |
72 | cmp dword[ebx], 7 ; start application |
59 | cmp dword[ebx], 7 ; start application |
73 | jne @f |
60 | jne @f |
74 | mov edx, [ebx+4] |
61 | mov edx, [ebx+4] |
75 | mov ebx, [ebx+8] |
62 | mov ebx, [ebx+8] |
76 | call fs_execute ; ebp, ebx, edx |
63 | call fs_execute ; ebp, ebx, edx |
77 | mov [image_of_eax], eax |
64 | mov [image_of_eax], eax |
78 | ret |
65 | ret |
79 | 66 | ||
80 | @@: |
67 | @@: |
81 | cmp al, '/' |
- | |
82 | jz .notcurdir |
- | |
83 | dec esi |
- | |
84 | mov ebp, esi |
- | |
85 | test al, al |
- | |
86 | jnz @f |
- | |
87 | xor ebp, ebp |
- | |
88 | @@: |
- | |
89 | mov esi, [current_slot] |
- | |
90 | mov esi, [esi+APPDATA.cur_dir] |
- | |
91 | jmp .parse_normal |
- | |
92 | - | ||
93 | .notcurdir: |
- | |
94 | cmp byte [esi], 0 |
68 | cmp word [ebp], '/' |
95 | jz .rootdir |
69 | jz .rootdir |
- | 70 | stdcall kernel_alloc, maxPathLength |
|
- | 71 | push ebx |
|
- | 72 | mov ebx, ebp |
|
- | 73 | mov ebp, eax |
|
- | 74 | push maxPathLength |
|
- | 75 | push eax |
|
96 | call process_replace_file_name |
76 | call get_full_file_name |
97 | .parse_normal: |
77 | pop ebx |
- | 78 | mov esi, ebp |
|
98 | mov ax, [esi] |
79 | mov ax, [ebp] |
99 | or ax, 2020h |
80 | or ax, 2020h |
100 | cmp ax, 'cd' |
81 | cmp ax, 'cd' |
101 | jz .CD |
82 | jz .CD |
102 | call dyndisk_handler ; not returns if success |
83 | call dyndisk_handler ; not returns if success |
103 | .notfound: |
84 | .notfound: |
- | 85 | stdcall kernel_free, ebp |
|
104 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
86 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
105 | ret |
87 | ret |
106 | 88 | ||
107 | .CD: |
89 | .CD: |
108 | add esi, 2 |
90 | add esi, 2 |
109 | xor eax, eax |
91 | xor eax, eax |
110 | lodsb ; disk number |
92 | lodsb ; disk number |
111 | sub eax, '0' |
93 | sub eax, '0' |
112 | cmp eax, 10 |
94 | cmp eax, 10 |
113 | jnc .notfound |
95 | jnc .notfound |
114 | mov edi, eax |
96 | mov edi, eax |
115 | lodsb |
97 | lodsb |
116 | test eax, eax |
98 | test eax, eax |
117 | jz .maindir |
99 | jz .maindir |
118 | cmp al, '/' |
100 | cmp al, '/' |
119 | jnz .notfound |
101 | jnz .notfound |
120 | lodsb ; partition number |
102 | lodsb ; partition number |
121 | test eax, eax |
103 | test eax, eax |
122 | jz .maindir |
104 | jz .maindir |
123 | cmp al, '1' |
105 | cmp al, '1' |
124 | jnz .notfound |
106 | jnz .notfound |
125 | cmp byte [esi], '/' |
107 | cmp byte [esi], '/' |
126 | jnz @f |
108 | jnz @f |
127 | inc esi |
109 | inc esi |
128 | @@: |
110 | @@: |
129 | cmp byte [esi], 0 |
- | |
130 | jnz @f |
- | |
131 | test ebp, ebp |
- | |
132 | jz @f |
- | |
133 | mov esi, ebp |
- | |
134 | xor ebp, ebp |
- | |
135 | @@: |
- | |
136 | call reserve_cd |
111 | call reserve_cd |
137 | mov eax, edi |
112 | mov eax, edi |
138 | bt eax, 0 |
113 | bt eax, 0 |
139 | setc [DiskNumber] |
114 | setc [DiskNumber] |
140 | bt eax, 1 |
115 | bt eax, 1 |
141 | setc [ChannelNumber] |
116 | setc [ChannelNumber] |
142 | inc [ChannelNumber] |
117 | inc [ChannelNumber] |
143 | inc eax |
118 | inc eax |
144 | mov [cdpos], eax |
119 | mov [cdpos], eax |
145 | call reserve_cd_channel |
120 | call reserve_cd_channel |
146 | mov eax, edi |
121 | mov eax, edi |
147 | not eax |
122 | not eax |
148 | and eax, 3 |
123 | and eax, 3 |
149 | shl eax, 1 |
124 | shl eax, 1 |
150 | inc eax |
125 | inc eax |
151 | shr edi, 2 |
126 | shr edi, 2 |
152 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
127 | mov dword[image_of_eax], ERROR_FILE_NOT_FOUND |
153 | bt [edi*5+DRIVE_DATA+1], ax |
128 | bt [edi*5+DRIVE_DATA+1], ax |
154 | jnc @f |
129 | jnc @f |
155 | mov ecx, [ebx+12] |
130 | mov ecx, [ebx+12] |
156 | mov edx, [ebx+16] |
131 | mov edx, [ebx+16] |
157 | mov eax, [ebx] |
132 | mov eax, [ebx] |
158 | mov dword[image_of_eax], ERROR_UNSUPPORTED_FS |
133 | mov dword[image_of_eax], ERROR_UNSUPPORTED_FS |
159 | cmp eax, fs_NumCdServices |
134 | cmp eax, fs_NumCdServices |
160 | jae @f |
135 | jae @f |
161 | add ebx, 4 |
136 | add ebx, 4 |
162 | call dword[fs_CdServices + eax*4] |
137 | call dword[fs_CdServices + eax*4] |
163 | call free_cd_channel |
- | |
164 | and [cd_status], 0 |
- | |
165 | mov [image_of_eax], eax |
138 | mov [image_of_eax], eax |
166 | mov [image_of_ebx], ebx |
139 | mov [image_of_ebx], ebx |
167 | ret |
- | |
168 | - | ||
169 | @@: |
140 | @@: |
170 | call free_cd_channel |
141 | call free_cd_channel |
171 | and [cd_status], 0 |
142 | and [cd_status], 0 |
- | 143 | stdcall kernel_free, ebp |
|
172 | ret |
144 | ret |
173 | 145 | ||
174 | .nextCD: |
146 | .nextCD: |
175 | test eax, eax ; partition number |
147 | test eax, eax ; partition number |
176 | stc |
148 | stc |
177 | jnz @f ; no more partitions |
149 | jnz @f ; no more partitions |
178 | mov al, 1 ; /cdX/1 |
150 | mov al, 1 ; /cdX/1 |
179 | clc |
151 | clc |
180 | @@: |
152 | @@: |
181 | ret |
153 | ret |
182 | 154 | ||
183 | .maindir: ; list partitions |
155 | .maindir: ; list partitions |
184 | mov esi, .nextCD |
156 | mov esi, .nextCD |
185 | .maindir_noesi: ; backjump from dyndisk_handler |
157 | .maindir_noesi: ; backjump from dyndisk_handler |
- | 158 | push ebp |
|
- | 159 | mov ebp, ecx |
|
- | 160 | call kernel_free |
|
186 | cmp dword[ebx], 1 |
161 | cmp dword[ebx], 1 |
187 | jnz .access_denied ; read folder? |
162 | jnz .access_denied ; read folder? |
188 | push ecx |
163 | push ebp |
- | 164 | pushd [ebx+4] ; first block |
|
189 | mov ebp, [ebx+12] ; the number of blocks to read |
165 | mov ebp, [ebx+12] ; the number of blocks to read |
190 | mov edx, [ebx+16] ; where to write the result |
166 | mov edx, [ebx+16] ; buffer |
191 | push dword[ebx+4] ; first block |
- | |
192 | mov ebx, [ebx+8] ; flags |
167 | mov ebx, [ebx+8] ; flags |
193 | mov ecx, 32/4 |
168 | mov ecx, 32/4 |
194 | mov edi, edx |
169 | mov edi, edx |
195 | xor eax, eax |
170 | xor eax, eax |
196 | rep stosd |
171 | rep stosd |
197 | mov byte [edx], 1 ; version |
172 | mov byte [edx], 1 ; version |
198 | .maindir_loop: |
173 | .maindir_loop: |
199 | call esi |
174 | call esi |
200 | jc .maindir_done |
175 | jc .maindir_done |
201 | inc dword[edx+8] |
176 | inc dword[edx+8] |
202 | dec dword[esp] |
177 | dec dword[esp] |
203 | jns .maindir_loop |
178 | jns .maindir_loop |
204 | dec ebp |
179 | dec ebp |
205 | js .maindir_loop |
180 | js .maindir_loop |
206 | inc dword[edx+4] |
181 | inc dword[edx+4] |
207 | mov dword[edi], 16 ; attributes: folder |
182 | mov dword[edi], 16 ; attributes: folder |
208 | mov dword[edi+4], ebx ; name encoding |
183 | mov dword[edi+4], ebx ; name encoding |
209 | push eax |
184 | push eax |
210 | mov ecx, 32/4 |
185 | mov ecx, 32/4 |
211 | add edi, 8 |
186 | add edi, 8 |
212 | xor eax, eax |
187 | xor eax, eax |
213 | rep stosd |
188 | rep stosd |
214 | pop eax |
189 | pop eax |
215 | push eax edx edi |
190 | push eax edx edi |
216 | ; convert number in eax to decimal string |
191 | ; convert number in eax to decimal string |
217 | push -'0' |
192 | push -'0' |
218 | mov ecx, 10 |
193 | mov ecx, 10 |
219 | @@: |
194 | @@: |
220 | xor edx, edx |
195 | xor edx, edx |
221 | div ecx |
196 | div ecx |
222 | push edx |
197 | push edx |
223 | test eax, eax |
198 | test eax, eax |
224 | jnz @b |
199 | jnz @b |
225 | cmp ebx, 1 |
200 | cmp ebx, 1 |
226 | jz .uni |
201 | jz .uni |
227 | @@: |
202 | @@: |
228 | pop eax |
203 | pop eax |
229 | add eax, '0' |
204 | add eax, '0' |
230 | stosb |
205 | stosb |
231 | test eax, eax |
206 | test eax, eax |
232 | jnz @b |
207 | jnz @b |
233 | pop edi edx eax |
208 | pop edi edx eax |
234 | add edi, 264 |
209 | add edi, 264 |
235 | jmp .maindir_loop |
210 | jmp .maindir_loop |
236 | 211 | ||
237 | .uni: |
212 | .uni: |
238 | pop eax |
213 | pop eax |
239 | add eax, '0' |
214 | add eax, '0' |
240 | stosw |
215 | stosw |
241 | test eax, eax |
216 | test eax, eax |
242 | jnz .uni |
217 | jnz .uni |
243 | pop edi edx eax |
218 | pop edi edx eax |
244 | add edi, 520 |
219 | add edi, 520 |
245 | jmp .maindir_loop |
220 | jmp .maindir_loop |
246 | 221 | ||
247 | .maindir_done: |
222 | .maindir_done: |
248 | pop eax eax |
223 | pop eax eax |
249 | mov ebx, [edx+4] |
224 | mov ebx, [edx+4] |
250 | xor eax, eax |
225 | xor eax, eax |
251 | dec ebp |
226 | dec ebp |
252 | js @f |
227 | js @f |
253 | mov al, ERROR_END_OF_FILE |
228 | mov al, ERROR_END_OF_FILE |
254 | @@: |
229 | @@: |
255 | mov [image_of_eax], eax |
230 | mov [image_of_eax], eax |
256 | mov [image_of_ebx], ebx |
231 | mov [image_of_ebx], ebx |
257 | ret |
232 | ret |
258 | 233 | ||
259 | .access_denied: |
234 | .access_denied: |
260 | mov dword[image_of_eax], ERROR_ACCESS_DENIED |
235 | mov dword[image_of_eax], ERROR_ACCESS_DENIED |
261 | ret |
236 | ret |
262 | 237 | ||
263 | .rootdir: ; / - virtual root folder |
238 | .rootdir: ; / - virtual root folder |
264 | cmp dword[ebx], 1 ; read folder? |
239 | cmp dword[ebx], 1 ; read folder? |
265 | jnz .access_denied |
240 | jnz .access_denied |
266 | mov ebp, [ebx+12] ; number of blocks |
241 | mov ebp, [ebx+12] ; number of blocks |
267 | mov edx, [ebx+16] ; return area |
242 | mov edx, [ebx+16] ; return area |
268 | push dword[ebx+4] ; first block |
243 | push dword[ebx+4] ; first block |
269 | mov ebx, [ebx+8] ; flags |
244 | mov ebx, [ebx+8] ; flags |
270 | mov ecx, 32/4 |
245 | mov ecx, 32/4 |
271 | mov edi, edx |
246 | mov edi, edx |
272 | xor eax, eax |
247 | xor eax, eax |
273 | rep stosd |
248 | rep stosd |
274 | mov byte [edx], 1 ; version |
249 | mov byte [edx], 1 ; version |
275 | sub esp, 16 |
250 | sub esp, 16 |
276 | .rootdir_loop: |
251 | .rootdir_loop: |
277 | push edi |
252 | push edi |
278 | lea edi, [esp+4] |
253 | lea edi, [esp+4] |
279 | call dyndisk_enum_root |
254 | call dyndisk_enum_root |
280 | pop edi |
255 | pop edi |
281 | test eax, eax |
256 | test eax, eax |
282 | jz .rootdirCD |
257 | jz .rootdirCD |
283 | inc dword[edx+8] |
258 | inc dword[edx+8] |
284 | dec dword[esp+16] |
259 | dec dword[esp+16] |
285 | jns .rootdir_loop |
260 | jns .rootdir_loop |
286 | dec ebp |
261 | dec ebp |
287 | js .rootdir_loop |
262 | js .rootdir_loop |
288 | inc dword[edx+4] |
263 | inc dword[edx+4] |
289 | mov dword[edi], 16 ; attributes: folder |
264 | mov dword[edi], 16 ; attributes: folder |
290 | mov dword[edi+4], ebx ; name encoding |
265 | mov dword[edi+4], ebx ; name encoding |
291 | push eax |
266 | push eax |
292 | mov ecx, 32/4 |
267 | mov ecx, 32/4 |
293 | add edi, 8 |
268 | add edi, 8 |
294 | xor eax, eax |
269 | xor eax, eax |
295 | rep stosd |
270 | rep stosd |
296 | push esi edi |
271 | push edi |
297 | lea esi, [esp+12] |
272 | lea esi, [esp+8] |
298 | cmp ebx, 1 |
273 | cmp ebx, 1 |
299 | jz .uni2 |
274 | jz .uni2 |
300 | @@: |
275 | @@: |
301 | lodsb |
276 | lodsb |
302 | stosb |
277 | stosb |
303 | test eax, eax |
278 | test eax, eax |
304 | jnz @b |
279 | jnz @b |
305 | pop edi esi eax |
280 | pop edi eax |
306 | add edi, 264 |
281 | add edi, 264 |
307 | jmp .rootdir_loop |
282 | jmp .rootdir_loop |
308 | 283 | ||
309 | .uni2: |
284 | .uni2: |
310 | lodsb |
285 | lodsb |
311 | stosw |
286 | stosw |
312 | test eax, eax |
287 | test eax, eax |
313 | jnz .uni2 |
288 | jnz .uni2 |
314 | pop edi esi eax |
289 | pop edi eax |
315 | add edi, 520 |
290 | add edi, 520 |
316 | jmp .rootdir_loop |
291 | jmp .rootdir_loop |
317 | 292 | ||
318 | .rootdirCD: |
293 | .rootdirCD: |
319 | add esp, 16 |
294 | add esp, 16 |
320 | or esi, -1 |
295 | or esi, -1 |
321 | .rootdirCD_loop: |
296 | .rootdirCD_loop: |
322 | inc esi |
297 | inc esi |
323 | cmp esi, 10 |
298 | cmp esi, 10 |
324 | jnc .rootdir_done |
299 | jnc .rootdir_done |
325 | mov eax, esi |
300 | mov eax, esi |
326 | not eax |
301 | not eax |
327 | and eax, 3 |
302 | and eax, 3 |
328 | shl eax, 1 |
303 | shl eax, 1 |
329 | inc eax |
304 | inc eax |
330 | mov ecx, esi |
305 | mov ecx, esi |
331 | shr ecx, 2 |
306 | shr ecx, 2 |
332 | bt [ecx*5+DRIVE_DATA+1], ax |
307 | bt [ecx*5+DRIVE_DATA+1], ax |
333 | jnc .rootdirCD_loop |
308 | jnc .rootdirCD_loop |
334 | inc dword[edx+8] |
309 | inc dword[edx+8] |
335 | dec dword[esp] |
310 | dec dword[esp] |
336 | jns .rootdirCD_loop |
311 | jns .rootdirCD_loop |
337 | dec ebp |
312 | dec ebp |
338 | js .rootdirCD_loop |
313 | js .rootdirCD_loop |
339 | inc dword[edx+4] |
314 | inc dword[edx+4] |
340 | mov dword[edi], 16 ; attributes: folder |
315 | mov dword[edi], 16 ; attributes: folder |
341 | mov dword[edi+4], ebx ; name encoding |
316 | mov dword[edi+4], ebx ; name encoding |
342 | mov ecx, 32/4 |
317 | mov ecx, 32/4 |
343 | add edi, 8 |
318 | add edi, 8 |
344 | xor eax, eax |
319 | xor eax, eax |
345 | rep stosd |
320 | rep stosd |
346 | mov eax, esi |
321 | mov eax, esi |
347 | add eax, '0' |
322 | add eax, '0' |
348 | cmp ebx, 1 |
323 | cmp ebx, 1 |
349 | jz @f |
324 | jz @f |
350 | mov word [edi], 'cd' |
325 | mov word [edi], 'cd' |
351 | mov [edi+2], ax |
326 | mov [edi+2], ax |
352 | add edi, 264 |
327 | add edi, 264 |
353 | jmp .rootdirCD_loop |
328 | jmp .rootdirCD_loop |
354 | 329 | ||
355 | @@: |
330 | @@: |
356 | mov dword[edi], 640063h |
331 | mov dword[edi], 640063h |
357 | mov [edi+4], eax |
332 | mov [edi+4], eax |
358 | add edi, 520 |
333 | add edi, 520 |
359 | jmp .rootdirCD_loop |
334 | jmp .rootdirCD_loop |
360 | 335 | ||
361 | .rootdir_done: |
336 | .rootdir_done: |
362 | pop eax |
337 | pop eax |
363 | mov ebx, [edx+4] |
338 | mov ebx, [edx+4] |
364 | xor eax, eax |
339 | xor eax, eax |
365 | dec ebp |
340 | dec ebp |
366 | js @f |
341 | js @f |
367 | mov al, ERROR_END_OF_FILE |
342 | mov al, ERROR_END_OF_FILE |
368 | @@: |
343 | @@: |
369 | mov [image_of_eax], eax |
344 | mov [image_of_eax], eax |
370 | mov [image_of_ebx], ebx |
345 | mov [image_of_ebx], ebx |
371 | ret |
346 | ret |
372 | - | ||
373 | fs_NotImplemented: |
- | |
374 | mov eax, 2 |
- | |
375 | ret |
- | |
376 | - | ||
377 | ;----------------------------------------------------------------------------- |
- | |
378 | fs_CdServices: |
- | |
379 | dd fs_CdRead |
- | |
380 | dd fs_CdReadFolder |
- | |
381 | dd fs_NotImplemented |
- | |
382 | dd fs_NotImplemented |
- | |
383 | dd fs_NotImplemented |
- | |
384 | dd fs_CdGetFileInfo |
- | |
385 | dd fs_NotImplemented |
- | |
386 | dd 0 |
- | |
387 | dd fs_NotImplemented |
- | |
388 | dd fs_NotImplemented |
- | |
389 | fs_NumCdServices = ($ - fs_CdServices)/4 |
347 | |
390 | ;----------------------------------------------------------------------------- |
348 | ;----------------------------------------------------------------------------- |
391 | process_replace_file_name: |
349 | process_replace_file_name: |
392 | ; in: [esi] = virtual path |
350 | ; in: [esi] = virtual path |
393 | ; out: [esi]+[ebp] = physical path |
351 | ; out: [esi]+[ebp] = physical path |
394 | pushfd |
352 | pushfd |
395 | cli |
353 | cli |
396 | mov ebp, [full_file_name_table] |
354 | mov ebp, [full_file_name_table] |
397 | xor edi, edi |
355 | xor edi, edi |
398 | .loop: |
356 | .loop: |
399 | cmp edi, [full_file_name_table.size] |
357 | cmp edi, [full_file_name_table.size] |
400 | jae .notfound |
358 | jae .notfound |
401 | push esi edi |
359 | push esi edi |
402 | shl edi, 7 |
360 | shl edi, 7 |
403 | add edi, ebp |
361 | add edi, ebp |
404 | @@: |
362 | @@: |
405 | cmp byte [edi], 0 |
363 | cmp byte [edi], 0 |
406 | jz .dest_done |
364 | jz .dest_done |
407 | lodsb |
365 | lodsb |
408 | test al, al |
366 | test al, al |
409 | jz .cont |
367 | jz .cont |
410 | or al, 20h |
368 | or al, 20h |
411 | scasb |
369 | scasb |
412 | jz @b |
370 | jz @b |
413 | .cont: |
371 | .cont: |
414 | pop edi esi |
372 | pop edi esi |
415 | inc edi |
373 | inc edi |
416 | jmp .loop |
374 | jmp .loop |
417 | 375 | ||
418 | .dest_done: |
376 | .dest_done: |
419 | cmp byte [esi], 0 |
377 | cmp byte [esi], 0 |
420 | jz .found |
378 | jz .found |
421 | cmp byte [esi], '/' |
379 | cmp byte [esi], '/' |
422 | jnz .cont |
380 | jnz .cont |
423 | inc esi |
381 | inc esi |
424 | .found: |
382 | .found: |
425 | pop edi eax |
383 | pop edi eax |
426 | shl edi, 7 |
384 | shl edi, 7 |
427 | add edi, ebp |
385 | add edi, ebp |
428 | mov ebp, esi |
386 | mov ebp, esi |
429 | cmp byte [esi], 0 |
387 | cmp byte [esi], 0 |
430 | lea esi, [edi+64] |
388 | lea esi, [edi+64] |
431 | jnz .ret |
389 | jnz .ret |
432 | .notfound: |
390 | .notfound: |
433 | xor ebp, ebp |
391 | xor ebp, ebp |
434 | .ret: |
392 | .ret: |
435 | popfd |
393 | popfd |
436 | ret |
394 | ret |
437 | 395 | ||
438 | ;----------------------------------------------------------------------------- |
396 | ;----------------------------------------------------------------------------- |
439 | uglobal |
397 | uglobal |
440 | lock_flag_for_f30_3 rb 1 |
398 | lock_flag_for_f30_3 rb 1 |
441 | endg |
399 | endg |
442 | 400 | ||
443 | sys_current_directory: ; sysfunction 30 |
401 | sys_current_directory: ; sysfunction 30 |
444 | mov eax, [current_slot] |
402 | mov eax, [current_slot] |
445 | mov edi, [eax+APPDATA.cur_dir] |
403 | mov edi, [eax+APPDATA.cur_dir] |
446 | dec ebx |
404 | dec ebx |
447 | jz .set |
405 | jz .set |
448 | dec ebx |
406 | dec ebx |
449 | jz .get |
407 | jz .get |
450 | dec ebx |
408 | dec ebx |
451 | jz .mount_additional_directory |
409 | jz .mount_additional_directory |
452 | ret |
410 | ret |
453 | 411 | ||
454 | .mount_additional_directory: |
412 | .mount_additional_directory: |
455 | ; in: ecx -> dir name+dir path (128) |
413 | ; in: ecx -> dir name+dir path (128) |
456 | cmp [lock_flag_for_f30_3], 1 ; check lock |
414 | cmp [lock_flag_for_f30_3], 1 ; check lock |
457 | je @f |
415 | je @f |
458 | mov esi, ecx |
416 | mov esi, ecx |
459 | mov edi, sysdir_name1 |
417 | mov edi, sysdir_name1 |
460 | mov ecx, 63 |
418 | mov ecx, 63 |
461 | pushfd |
419 | pushfd |
462 | cli |
420 | cli |
463 | cld |
421 | cld |
464 | rep movsb ; copying fake directory name |
422 | rep movsb ; copying fake directory name |
465 | inc esi |
423 | inc esi |
466 | xor eax, eax |
424 | xor eax, eax |
467 | stosb ; terminator of name, in case if we get the inlet trash |
425 | stosb ; terminator of name, in case if we get the inlet trash |
468 | mov ecx, 63 |
426 | mov ecx, 63 |
469 | rep movsb ; copying real directory path for mounting |
427 | rep movsb ; copying real directory path for mounting |
470 | xor eax, eax |
428 | xor eax, eax |
471 | stosb |
429 | stosb |
472 | ; increase the pointer of inputs for procedure "process_replace_file_name" |
430 | ; increase the pointer of inputs for procedure "process_replace_file_name" |
473 | mov [full_file_name_table.size], 2 |
431 | mov [full_file_name_table.size], 2 |
474 | mov [lock_flag_for_f30_3], 1 ; lock |
432 | mov [lock_flag_for_f30_3], 1 ; lock |
475 | popfd |
433 | popfd |
476 | @@: |
434 | @@: |
477 | ret |
435 | ret |
478 | - | ||
479 | max_cur_dir equ 0x1000 ; length |
- | |
480 | 436 | ||
481 | .get: ; in: ecx -> buffer, edx = length |
437 | .get: ; in: ecx -> buffer, edx = length |
482 | mov ebx, edi ; buffer |
438 | mov ebx, edi ; buffer |
483 | push ecx |
439 | push ecx |
484 | push edi |
440 | push edi |
485 | xor eax, eax |
441 | xor eax, eax |
486 | mov ecx, max_cur_dir |
442 | mov ecx, maxPathLength |
487 | repne scasb |
443 | repne scasb |
488 | jnz .error |
444 | jnz .error |
489 | sub edi, ebx |
445 | sub edi, ebx |
490 | inc edi |
446 | inc edi |
491 | mov [esp+32+8], edi ; return in eax |
447 | mov [esp+32+8], edi ; return in eax |
492 | cmp edx, edi |
448 | cmp edx, edi |
493 | jbe @f |
449 | jbe @f |
494 | mov edx, edi |
450 | mov edx, edi |
495 | @@: |
451 | @@: |
496 | pop esi |
452 | pop esi |
497 | pop edi |
453 | pop edi |
498 | cmp edx, 1 |
454 | cmp edx, 1 |
499 | jbe .ret |
455 | jbe .ret |
500 | mov al, '/' |
456 | mov al, '/' |
501 | stosb |
457 | stosb |
502 | mov ecx, edx |
458 | mov ecx, edx |
503 | rep movsb |
459 | rep movsb |
504 | .ret: |
460 | .ret: |
505 | ret |
461 | ret |
506 | 462 | ||
507 | .error: |
463 | .error: |
508 | add esp, 8 |
464 | add esp, 8 |
509 | or dword[esp+32], -1 |
465 | or dword[esp+32], -1 |
510 | ret |
466 | ret |
511 | 467 | ||
512 | .set: |
468 | .set: |
513 | pop eax |
469 | pop eax |
514 | push max_cur_dir |
470 | push maxPathLength |
515 | push edi |
471 | push edi |
516 | push eax |
472 | push eax |
517 | mov ebx, ecx |
473 | mov ebx, ecx |
518 | get_full_file_name: |
474 | get_full_file_name: |
519 | ; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length |
475 | ; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length |
520 | ; destroys all registers |
476 | ; destroys all registers |
521 | push ebp |
477 | push ebp |
522 | mov esi, [current_slot] |
- | |
523 | mov esi, [esi+APPDATA.cur_dir] |
- | |
524 | mov edx, esi |
- | |
525 | @@: |
- | |
526 | inc esi |
- | |
527 | cmp byte [esi-1], 0 |
- | |
528 | jnz @b |
- | |
529 | dec esi |
- | |
530 | cmp byte [ebx], '/' |
478 | cmp byte [ebx], '/' |
- | 479 | jnz .set_relative |
|
- | 480 | lea esi, [ebx+1] |
|
- | 481 | call process_replace_file_name |
|
- | 482 | mov edi, [esp+8] |
|
- | 483 | mov edx, [esp+12] |
|
- | 484 | add edx, edi |
|
- | 485 | .set_copy: |
|
- | 486 | lodsb |
|
- | 487 | stosb |
|
- | 488 | test al, al |
|
531 | jz .set_absolute |
489 | jz .set_part2 |
- | 490 | .set_copy_cont: |
|
- | 491 | cmp edi, edx |
|
- | 492 | jb .set_copy |
|
- | 493 | .overflow: |
|
- | 494 | dec edi |
|
- | 495 | .fail: |
|
- | 496 | mov byte [edi], 0 |
|
- | 497 | xor eax, eax |
|
- | 498 | pop ebp |
|
- | 499 | ret 8 |
|
- | 500 | ||
- | 501 | .set_part2: |
|
- | 502 | mov esi, ebp |
|
- | 503 | xor ebp, ebp |
|
- | 504 | test esi, esi |
|
- | 505 | jz .ret.ok |
|
- | 506 | mov byte [edi-1], '/' |
|
- | 507 | jmp .set_copy_cont |
|
- | 508 | ||
- | 509 | .set_relative: |
|
- | 510 | mov edi, [current_slot] |
|
- | 511 | mov edi, [edi+APPDATA.cur_dir] |
|
- | 512 | mov edx, edi |
|
- | 513 | mov ecx, [esp+12] |
|
- | 514 | xor eax, eax |
|
- | 515 | repnz scasb |
|
- | 516 | mov esi, edi |
|
- | 517 | dec esi |
|
532 | mov edi, [esp+8] |
518 | mov edi, [esp+8] |
- | 519 | jecxz .fail |
|
533 | .relative: |
520 | .relative: |
534 | cmp byte [ebx], 0 |
521 | cmp byte [ebx], 0 |
535 | jz .set_ok |
522 | jz .set_ok |
536 | cmp word [ebx], '.' |
523 | cmp word [ebx], '.' |
537 | jz .set_ok |
524 | jz .set_ok |
538 | cmp word [ebx], './' |
525 | cmp word [ebx], './' |
539 | jnz @f |
526 | jnz @f |
540 | add ebx, 2 |
527 | add ebx, 2 |
541 | jmp .relative |
528 | jmp .relative |
542 | 529 | ||
543 | @@: |
530 | @@: |
544 | cmp word [ebx], '..' |
531 | cmp word [ebx], '..' |
545 | jnz .doset_relative |
532 | jnz .doset_relative |
546 | cmp byte [ebx+2], 0 |
533 | cmp byte [ebx+2], 0 |
547 | jz @f |
534 | jz @f |
548 | cmp byte [ebx+2], '/' |
535 | cmp byte [ebx+2], '/' |
549 | jnz .doset_relative |
536 | jnz .doset_relative |
550 | @@: |
537 | @@: |
551 | dec esi |
538 | dec esi |
552 | cmp byte [esi], '/' |
539 | cmp byte [esi], '/' |
553 | jnz @b |
540 | jnz @b |
554 | add ebx, 3 |
541 | add ebx, 3 |
555 | jmp .relative |
542 | jmp .relative |
556 | 543 | ||
557 | .set_ok: |
544 | .set_ok: |
558 | cmp edx, edi ; is destination equal to APPDATA.cur_dir? |
545 | cmp edx, edi ; is destination equal to APPDATA.cur_dir? |
559 | jz .set_ok.cur_dir |
- | |
560 | sub esi, edx |
- | |
561 | cmp esi, [esp+12] |
- | |
562 | jb .set_ok.copy |
- | |
563 | .fail: |
- | |
564 | mov byte [edi], 0 |
- | |
565 | xor eax, eax |
- | |
566 | pop ebp |
- | |
567 | ret 8 |
546 | jz @f |
568 | - | ||
569 | .set_ok.copy: |
- | |
570 | mov ecx, esi |
547 | mov ecx, esi |
- | 548 | sub ecx, edx |
|
571 | mov esi, edx |
549 | mov esi, edx |
572 | rep movsb |
550 | rep movsb |
573 | mov byte [edi], 0 |
551 | mov byte [edi], 0 |
574 | .ret.ok: |
552 | .ret.ok: |
575 | mov al, 1 |
553 | mov al, 1 |
576 | pop ebp |
554 | pop ebp |
577 | ret 8 |
555 | ret 8 |
578 | 556 | ||
579 | .set_ok.cur_dir: |
557 | @@: |
580 | mov byte [esi], 0 |
558 | mov byte [esi], 0 |
581 | jmp .ret.ok |
559 | jmp .ret.ok |
582 | 560 | ||
583 | .doset_relative: |
561 | .doset_relative: |
584 | cmp edx, edi |
562 | cmp edx, edi |
585 | jz .doset_relative.cur_dir |
563 | jz .doset_relative.cur_dir |
586 | sub esi, edx |
- | |
587 | cmp esi, [esp+12] |
- | |
588 | jae .fail |
- | |
589 | mov ecx, esi |
564 | mov ecx, esi |
- | 565 | sub ecx, edx |
|
590 | mov esi, edx |
566 | mov esi, edx |
591 | mov edx, edi |
567 | mov edx, edi |
592 | rep movsb |
568 | rep movsb |
593 | jmp .doset_relative.copy |
569 | jmp .doset_relative.copy |
594 | 570 | ||
595 | .doset_relative.cur_dir: |
571 | .doset_relative.cur_dir: |
596 | mov edi, esi |
572 | mov edi, esi |
597 | .doset_relative.copy: |
573 | .doset_relative.copy: |
598 | add edx, [esp+12] |
574 | add edx, [esp+12] |
599 | mov byte [edi], '/' |
575 | mov byte [edi], '/' |
600 | inc edi |
576 | inc edi |
601 | cmp edi, edx |
577 | cmp edi, edx |
602 | jae .overflow |
578 | jae .overflow |
603 | @@: |
579 | @@: |
604 | mov al, [ebx] |
580 | mov al, [ebx] |
605 | inc ebx |
581 | inc ebx |
606 | stosb |
582 | stosb |
607 | test al, al |
583 | test al, al |
608 | jz .ret.ok |
584 | jz .ret.ok |
609 | cmp edi, edx |
585 | cmp edi, edx |
610 | jb @b |
586 | jb @b |
611 | .overflow: |
- | |
612 | dec edi |
- | |
613 | jmp .fail |
- | |
614 | - | ||
615 | .set_absolute: |
- | |
616 | lea esi, [ebx+1] |
- | |
617 | call process_replace_file_name |
- | |
618 | mov edi, [esp+8] |
- | |
619 | mov edx, [esp+12] |
- | |
620 | add edx, edi |
- | |
621 | .set_copy: |
- | |
622 | lodsb |
- | |
623 | stosb |
- | |
624 | test al, al |
- | |
625 | jz .set_part2 |
- | |
626 | .set_copy_cont: |
- | |
627 | cmp edi, edx |
- | |
628 | jb .set_copy |
- | |
629 | jmp .overflow |
587 | jmp .overflow |
630 | - | ||
631 | .set_part2: |
- | |
632 | mov esi, ebp |
- | |
633 | xor ebp, ebp |
- | |
634 | test esi, esi |
- | |
635 | jz .ret.ok |
- | |
636 | mov byte [edi-1], '/' |
- | |
637 | jmp .set_copy_cont |
- | |
638 | 588 | ||
639 | include "parse_fn.inc" |
589 | include "parse_fn.inc" |
640 | include "fs_common.inc" |
590 | include "fs_common.inc" |
641 | include "iso9660.inc" ; read for CD filesystem |
591 | include "iso9660.inc" ; read for CD filesystem |
642 | include "fat.inc" |
592 | include "fat.inc" |
643 | include "ntfs.inc" |
593 | include "ntfs.inc" |
644 | include "ext.inc" |
594 | include "ext.inc" |
645 | include "xfs.asm" |
595 | include "xfs.asm" |