Subversion Repositories Kolibri OS

Rev

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"