Rev 1378 | Rev 1491 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
1289 | diamond | 3 | ;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;; |
431 | serge | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
7 | |||
593 | mikedld | 8 | $Revision: 1379 $ |
9 | |||
10 | |||
521 | diamond | 11 | image_of_eax EQU esp+36 |
12 | image_of_ebx EQU esp+24 |
||
488 | spraid | 13 | |
72 | diamond | 14 | ; System function 70 - files with long names (LFN) |
71 | diamond | 15 | ; diamond, 2006 |
16 | |||
17 | iglobal |
||
18 | ; in this table names must be in lowercase |
||
19 | rootdirs: |
||
585 | mario79 | 20 | db 2,'rd' |
21 | dd fs_OnRamdisk |
||
22 | dd fs_NextRamdisk |
||
23 | db 7,'ramdisk' |
||
24 | dd fs_OnRamdisk |
||
25 | dd fs_NextRamdisk |
||
26 | db 2,'fd' |
||
27 | dd fs_OnFloppy |
||
28 | dd fs_NextFloppy |
||
29 | db 10,'floppydisk' |
||
30 | dd fs_OnFloppy |
||
31 | dd fs_NextFloppy |
||
32 | db 3,'hd0' |
||
33 | dd fs_OnHd0 |
||
34 | dd fs_NextHd0 |
||
35 | db 3,'hd1' |
||
36 | dd fs_OnHd1 |
||
37 | dd fs_NextHd1 |
||
38 | db 3,'hd2' |
||
39 | dd fs_OnHd2 |
||
40 | dd fs_NextHd2 |
||
41 | db 3,'hd3' |
||
42 | dd fs_OnHd3 |
||
43 | dd fs_NextHd3 |
||
87 | mario79 | 44 | ;********************************************** |
585 | mario79 | 45 | db 3,'cd0' |
46 | dd fs_OnCd0 |
||
47 | dd fs_NextCd |
||
48 | db 3,'cd1' |
||
49 | dd fs_OnCd1 |
||
50 | dd fs_NextCd |
||
51 | db 3,'cd2' |
||
52 | dd fs_OnCd2 |
||
53 | dd fs_NextCd |
||
54 | db 3,'cd3' |
||
55 | dd fs_OnCd3 |
||
56 | dd fs_NextCd |
||
237 | serge | 57 | ;*********************************************** |
585 | mario79 | 58 | db 0 |
75 | diamond | 59 | |
87 | mario79 | 60 | |
75 | diamond | 61 | virtual_root_query: |
585 | mario79 | 62 | dd fs_HasRamdisk |
63 | db 'rd',0 |
||
64 | dd fs_HasFloppy |
||
65 | db 'fd',0 |
||
66 | dd fs_HasHd0 |
||
67 | db 'hd0',0 |
||
68 | dd fs_HasHd1 |
||
69 | db 'hd1',0 |
||
70 | dd fs_HasHd2 |
||
71 | db 'hd2',0 |
||
72 | dd fs_HasHd3 |
||
73 | db 'hd3',0 |
||
87 | mario79 | 74 | ;********************************************** |
585 | mario79 | 75 | dd fs_HasCd0 |
76 | db 'cd0',0 |
||
77 | dd fs_HasCd1 |
||
78 | db 'cd1',0 |
||
79 | dd fs_HasCd2 |
||
80 | db 'cd2',0 |
||
81 | dd fs_HasCd3 |
||
82 | db 'cd3',0 |
||
87 | mario79 | 83 | ;********************************************** |
585 | mario79 | 84 | dd 0 |
709 | diamond | 85 | |
86 | fs_additional_handlers: |
||
87 | dd biosdisk_handler, biosdisk_enum_root |
||
88 | ; add new handlers here |
||
89 | dd 0 |
||
90 | |||
71 | diamond | 91 | endg |
92 | |||
93 | file_system_lfn: |
||
94 | ; in: eax->fileinfo block |
||
95 | ; operation codes: |
||
72 | diamond | 96 | ; 0 : read file |
75 | diamond | 97 | ; 1 : read folder |
83 | diamond | 98 | ; 2 : create/rewrite file |
133 | diamond | 99 | ; 3 : write/append to file |
100 | ; 4 : set end of file |
||
86 | diamond | 101 | ; 5 : get file/directory attributes structure |
102 | ; 6 : set file/directory attributes structure |
||
91 | diamond | 103 | ; 7 : start application |
171 | diamond | 104 | ; 8 : delete file |
321 | diamond | 105 | ; 9 : create directory |
71 | diamond | 106 | |
1379 | turbanoff | 107 | ; parse file name |
585 | mario79 | 108 | xchg ebx, eax |
109 | lea esi, [ebx+20] |
||
110 | lodsb |
||
111 | test al, al |
||
112 | jnz @f |
||
113 | mov esi, [esi] |
||
114 | lodsb |
||
84 | diamond | 115 | @@: |
585 | mario79 | 116 | cmp al, '/' |
117 | jz .notcurdir |
||
118 | dec esi |
||
119 | mov ebp, esi |
||
120 | test al, al |
||
121 | jnz @f |
||
122 | xor ebp, ebp |
||
521 | diamond | 123 | @@: |
585 | mario79 | 124 | mov esi, [current_slot] |
125 | mov esi, [esi+APPDATA.cur_dir] |
||
126 | jmp .parse_normal |
||
521 | diamond | 127 | .notcurdir: |
585 | mario79 | 128 | cmp byte [esi], 0 |
129 | jz .rootdir |
||
130 | call process_replace_file_name |
||
521 | diamond | 131 | .parse_normal: |
585 | mario79 | 132 | cmp dword [ebx], 7 |
133 | jne @F |
||
134 | mov edx, [ebx+4] |
||
135 | mov ebx, [ebx+8] |
||
136 | call fs_execute ; esi+ebp, ebx, edx |
||
137 | mov [image_of_eax], eax |
||
138 | ret |
||
237 | serge | 139 | @@: |
585 | mario79 | 140 | mov edi, rootdirs-8 |
141 | xor ecx, ecx |
||
142 | push esi |
||
71 | diamond | 143 | .scan1: |
585 | mario79 | 144 | pop esi |
145 | add edi, ecx |
||
146 | scasd |
||
147 | scasd |
||
148 | mov cl, byte [edi] |
||
149 | test cl, cl |
||
709 | diamond | 150 | jz .notfound_try |
585 | mario79 | 151 | inc edi |
152 | push esi |
||
71 | diamond | 153 | @@: |
585 | mario79 | 154 | lodsb |
155 | or al, 20h |
||
156 | scasb |
||
157 | loopz @b |
||
158 | jnz .scan1 |
||
159 | lodsb |
||
160 | cmp al, '/' |
||
161 | jz .found1 |
||
162 | test al, al |
||
163 | jnz .scan1 |
||
164 | pop eax |
||
71 | diamond | 165 | ; directory /xxx |
166 | .maindir: |
||
709 | diamond | 167 | mov esi, [edi+4] |
168 | .maindir_noesi: |
||
585 | mario79 | 169 | cmp dword [ebx], 1 |
170 | jnz .access_denied |
||
171 | xor eax, eax |
||
1378 | turbanoff | 172 | mov ebp, [ebx+12] ;количество блоков для считывания |
173 | mov edx, [ebx+16] ;куда записывать рузельтат |
||
465 | serge | 174 | ; add edx, std_application_base_address |
585 | mario79 | 175 | push dword [ebx+4] ; first block |
176 | mov ebx, [ebx+8] ; flags |
||
78 | diamond | 177 | ; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler |
585 | mario79 | 178 | mov edi, edx |
709 | diamond | 179 | push ecx |
585 | mario79 | 180 | mov ecx, 32/4 |
181 | rep stosd |
||
709 | diamond | 182 | pop ecx |
585 | mario79 | 183 | mov byte [edx], 1 ; version |
75 | diamond | 184 | .maindir_loop: |
1379 | turbanoff | 185 | call esi |
585 | mario79 | 186 | jc .maindir_done |
187 | inc dword [edx+8] |
||
188 | dec dword [esp] |
||
189 | jns .maindir_loop |
||
190 | dec ebp |
||
191 | js .maindir_loop |
||
192 | inc dword [edx+4] |
||
193 | mov dword [edi], 0x10 ; attributes: folder |
||
194 | mov dword [edi+4], 1 ; name type: UNICODE |
||
195 | push eax |
||
196 | xor eax, eax |
||
197 | add edi, 8 |
||
709 | diamond | 198 | push ecx |
585 | mario79 | 199 | mov ecx, 40/4-2 |
200 | rep stosd |
||
709 | diamond | 201 | pop ecx |
585 | mario79 | 202 | pop eax |
203 | push eax edx |
||
75 | diamond | 204 | ; convert number in eax to decimal UNICODE string |
585 | mario79 | 205 | push edi |
709 | diamond | 206 | push ecx |
585 | mario79 | 207 | push -'0' |
709 | diamond | 208 | mov ecx, 10 |
75 | diamond | 209 | @@: |
585 | mario79 | 210 | xor edx, edx |
211 | div ecx |
||
212 | push edx |
||
213 | test eax, eax |
||
214 | jnz @b |
||
75 | diamond | 215 | @@: |
585 | mario79 | 216 | pop eax |
217 | add al, '0' |
||
218 | stosb |
||
219 | test bl, 1 ; UNICODE name? |
||
220 | jz .ansi2 |
||
221 | mov byte [edi], 0 |
||