Subversion Repositories Kolibri OS

Rev

Rev 7736 | Rev 8680 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2288 clevermous 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
6462 pathoswith 3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
2288 clevermous 5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
8
$Revision: 8676 $
9
 
2889 turbanoff 10
ERROR_SUCCESS        = 0
11
ERROR_DISK_BASE      = 1
12
ERROR_UNSUPPORTED_FS = 2
13
ERROR_UNKNOWN_FS     = 3
14
ERROR_PARTITION      = 4
15
ERROR_FILE_NOT_FOUND = 5
16
ERROR_END_OF_FILE    = 6
17
ERROR_MEMORY_POINTER = 7
18
ERROR_DISK_FULL      = 8
19
ERROR_FS_FAIL        = 9
20
ERROR_ACCESS_DENIED  = 10
21
ERROR_DEVICE         = 11
5994 pathoswith 22
ERROR_OUT_OF_MEMORY  = 12
2288 clevermous 23
 
6468 pathoswith 24
maxPathLength = 1000h
25
 
2288 clevermous 26
image_of_eax EQU esp+32
27
image_of_ebx EQU esp+20
28
 
6464 pathoswith 29
; System function 70
2288 clevermous 30
 
3296 clevermous 31
file_system_lfn_protected:
32
        pushad
33
        call    protect_from_terminate
34
        call    file_system_lfn
35
        call    unprotect_from_terminate
36
        popad
37
        mov     [image_of_eax], eax
38
        mov     [image_of_ebx], ebx
39
        ret
40
 
6798 pathoswith 41
fileSystemUnicode:
42
; in: ebx -> f.80 parameter structure
43
        mov     edi, [ebx+20]
44
        mov     esi, [ebx+24]
45
        jmp     @f
46
 
2288 clevermous 47
file_system_lfn:
6798 pathoswith 48
; in: ebx -> f.70 parameter structure
49
        xor     edi, edi
50
        lea     esi, [ebx+20]
51
        cmp     byte [esi], 0
2288 clevermous 52
        jnz     @f
6798 pathoswith 53
        mov     esi, [ebx+21]
2288 clevermous 54
@@:
6798 pathoswith 55
        cmp     word [esi], '/'
6502 pathoswith 56
        jnz     @f
6798 pathoswith 57
        cmp     edi, 2
6502 pathoswith 58
        jnz     .rootdir
6798 pathoswith 59
        cmp     dword[esi], '/'
6502 pathoswith 60
        jz      .rootdir
61
@@:
6792 pathoswith 62
        stdcall kernel_alloc, maxPathLength
63
        push    eax ebx
64
        xchg    eax, edi
65
        call    getFullPath
66
        pop     ebx ebp
67
        test    eax, eax
68
        jz      .notfound
6464 pathoswith 69
        cmp     dword[ebx], 7   ; start application
6502 pathoswith 70
        jnz     @f
6333 serge 71
        mov     edx, [ebx+4]
6792 pathoswith 72
        mov     ecx, [ebx+8]
73
        mov     ebx, ebp
74
        call    fs_execute
6333 serge 75
        mov     [image_of_eax], eax
76
        ret
6464 pathoswith 77
 
6333 serge 78
@@:
6502 pathoswith 79
        lea     esi, [ebp+2]
80
        mov     ax, [esi]
6464 pathoswith 81
        or      ax, 2020h
82
        cmp     ax, 'cd'
83
        jz      .CD
84
        call    dyndisk_handler ; not returns if success
85
.notfound:
6468 pathoswith 86
        stdcall kernel_free, ebp
6464 pathoswith 87
        mov     dword[image_of_eax], ERROR_FILE_NOT_FOUND
88
        ret
89
 
90
.CD:
91
        add     esi, 2
92
        xor     eax, eax
93
        lodsb       ; disk number
94
        sub     eax, '0'
95
        cmp     eax, 10
96
        jnc     .notfound
97
        mov     edi, eax
2288 clevermous 98
        lodsb
6464 pathoswith 99
        test    eax, eax
100
        jz      .maindir
2288 clevermous 101
        cmp     al, '/'
6464 pathoswith 102
        jnz     .notfound
103
        lodsb       ; partition number
104
        test    eax, eax
105
        jz      .maindir
106
        cmp     al, '1'
107
        jnz     .notfound
108
        cmp     byte [esi], '/'
109
        jnz     @f
110
        inc     esi
111
@@:
112
        call    reserve_cd
113
        mov     eax, edi
114
        bt      eax, 0
115
        setc    [DiskNumber]
116
        bt      eax, 1
117
        setc    [ChannelNumber]
118
        inc     [ChannelNumber]
119
        inc     eax
120
        mov     [cdpos], eax
121
        call    reserve_cd_channel
122
        mov     eax, edi
123
        not     eax
124
        and     eax, 3
125
        shl     eax, 1
126
        inc     eax
127
        shr     edi, 2
128
        mov     dword[image_of_eax], ERROR_FILE_NOT_FOUND
129
        bt      [edi*5+DRIVE_DATA+1], ax
130
        jnc     @f
131
        mov     ecx, [ebx+12]
132
        mov     edx, [ebx+16]
133
        mov     eax, [ebx]
134
        mov     dword[image_of_eax], ERROR_UNSUPPORTED_FS
135
        cmp     eax, fs_NumCdServices
136
        jae     @f
137
        add     ebx, 4
6611 clevermous 138
        push    ebp
6464 pathoswith 139
        call    dword[fs_CdServices + eax*4]
6611 clevermous 140
        pop     ebp
6464 pathoswith 141
        mov     [image_of_eax], eax
142
        mov     [image_of_ebx], ebx
143
@@:
144
        call    free_cd_channel
145
        and     [cd_status], 0
6468 pathoswith 146
        stdcall kernel_free, ebp
6464 pathoswith 147
        ret
148
 
149
.nextCD:
150
        test    eax, eax    ; partition number
6875 pathoswith 151
        jnz     @f
152
        inc     eax     ; /cdX/1
153
        ret
154
 
155
@@:
6464 pathoswith 156
        stc
157
        ret
158
 
159
.maindir:   ; list partitions
160
        mov     esi, .nextCD
6875 pathoswith 161
        xor     ecx, ecx
6464 pathoswith 162
.maindir_noesi:     ; backjump from dyndisk_handler
6468 pathoswith 163
        push    ebp
164
        mov     ebp, ecx
165
        call    kernel_free
6875 pathoswith 166
        mov     edi, [ebx+16]   ; buffer
167
        cmp     byte [ebx], 5
168
        jz      .deviceInfo
169
        cmp     byte [ebx], 1   ; read folder?
170
        jnz     .access_denied
6468 pathoswith 171
        push    ebp
172
        pushd   [ebx+4]         ; first block
6464 pathoswith 173
        mov     ebp, [ebx+12]   ; the number of blocks to read
2288 clevermous 174
        mov     ebx, [ebx+8]    ; flags
6464 pathoswith 175
        mov     ecx, 32/4
6875 pathoswith 176
        mov     edx, edi
6464 pathoswith 177
        xor     eax, eax
2288 clevermous 178
        rep stosd
179
        mov     byte [edx], 1   ; version
180
.maindir_loop:
181
        call    esi
182
        jc      .maindir_done
6464 pathoswith 183
        inc     dword[edx+8]
184
        dec     dword[esp]
2288 clevermous 185
        jns     .maindir_loop
186
        dec     ebp
187
        js      .maindir_loop
6464 pathoswith 188
        inc     dword[edx+4]
189
        mov     dword[edi], 16      ; attributes: folder
190
        mov     dword[edi+4], ebx   ; name encoding
2288 clevermous 191
        push    eax
6464 pathoswith 192
        mov     ecx, 32/4
193
        add     edi, 8
2288 clevermous 194
        xor     eax, eax
195
        rep stosd
196
        pop     eax
6464 pathoswith 197
        push    eax edx edi
198
; convert number in eax to decimal string
2288 clevermous 199
        push    -'0'
200
        mov     ecx, 10
201
@@:
202
        xor     edx, edx
203
        div     ecx
204
        push    edx
205
        test    eax, eax
206
        jnz     @b
6875 pathoswith 207
        cmp     ebx, 2
6464 pathoswith 208
        jz      .uni
2288 clevermous 209
@@:
210
        pop     eax
6464 pathoswith 211
        add     eax, '0'
2288 clevermous 212
        stosb
6464 pathoswith 213
        test    eax, eax
2288 clevermous 214
        jnz     @b
6464 pathoswith 215
        pop     edi edx eax
6875 pathoswith 216
        cmp     ebx, 3
217
        jz      @f
6464 pathoswith 218
        add     edi, 264
219
        jmp     .maindir_loop
220
 
221
.uni:
222
        pop     eax
223
        add     eax, '0'
224
        stosw
225
        test    eax, eax
226
        jnz     .uni
227
        pop     edi edx eax
6875 pathoswith 228
@@:
2288 clevermous 229
        add     edi, 520
230
        jmp     .maindir_loop
6464 pathoswith 231
 
2288 clevermous 232
.maindir_done:
6464 pathoswith 233
        pop     eax eax
2288 clevermous 234
        mov     ebx, [edx+4]
235
        xor     eax, eax
236
        dec     ebp
237
        js      @f
238
        mov     al, ERROR_END_OF_FILE
239
@@:
240
        mov     [image_of_eax], eax
241
        mov     [image_of_ebx], ebx
242
        ret
6464 pathoswith 243
 
2288 clevermous 244
.access_denied:
6464 pathoswith 245
        mov     dword[image_of_eax], ERROR_ACCESS_DENIED
2288 clevermous 246
        ret
247
 
6875 pathoswith 248
.deviceInfo:
249
        test    ebp, ebp
250
        jz      @f
251
        mov     eax, dword[ebp+DISK.MediaInfo.Capacity]
252
        mov     edx, dword[ebp+DISK.MediaInfo.Capacity+4]
253
        shld    edx, eax, 9
254
        shl     eax, 9
255
        mov     [edi+36], edx
256
        mov     [edi+32], eax
257
@@:
258
        and     dword[image_of_eax], 0
259
        ret
260
 
6464 pathoswith 261
.rootdir:   ; / - virtual root folder
6875 pathoswith 262
        cmp     byte [ebx], 5
263
        jz      @b
264
        cmp     byte [ebx], 1   ; read folder?
6464 pathoswith 265
        jnz     .access_denied
266
        mov     ebp, [ebx+12]   ; number of blocks
267
        mov     edx, [ebx+16]   ; return area
268
        push    dword[ebx+4]    ; first block
2288 clevermous 269
        mov     ebx, [ebx+8]    ; flags
6464 pathoswith 270
        mov     ecx, 32/4
271
        mov     edi, edx
2288 clevermous 272
        xor     eax, eax
273
        rep stosd
274
        mov     byte [edx], 1   ; version
4277 clevermous 275
        sub     esp, 16
6464 pathoswith 276
.rootdir_loop:
4277 clevermous 277
        push    edi
278
        lea     edi, [esp+4]
279
        call    dyndisk_enum_root
280
        pop     edi
281
        test    eax, eax
6464 pathoswith 282
        jz      .rootdirCD
283
        inc     dword[edx+8]
284
        dec     dword[esp+16]
285
        jns     .rootdir_loop
4277 clevermous 286
        dec     ebp
6464 pathoswith 287
        js      .rootdir_loop
288
        inc     dword[edx+4]
289
        mov     dword[edi], 16      ; attributes: folder
290
        mov     dword[edi+4], ebx   ; name encoding
4277 clevermous 291
        push    eax
6464 pathoswith 292
        mov     ecx, 32/4
293
        add     edi, 8
4277 clevermous 294
        xor     eax, eax
295
        rep stosd
6468 pathoswith 296
        push    edi
297
        lea     esi, [esp+8]
6875 pathoswith 298
        cmp     ebx, 2
6464 pathoswith 299
        jz      .uni2
4277 clevermous 300
@@:
301
        lodsb
302
        stosb
6464 pathoswith 303
        test    eax, eax
4277 clevermous 304
        jnz     @b
6468 pathoswith 305
        pop     edi eax
6875 pathoswith 306
        cmp     ebx, 3
307
        jz      @f
6464 pathoswith 308
        add     edi, 264
309
        jmp     .rootdir_loop
310
 
311
.uni2:
312
        lodsb
313
        stosw
314
        test    eax, eax
315
        jnz     .uni2
6468 pathoswith 316
        pop     edi eax
6875 pathoswith 317
@@:
4277 clevermous 318
        add     edi, 520
6464 pathoswith 319
        jmp     .rootdir_loop
320
 
321
.rootdirCD:
4277 clevermous 322
        add     esp, 16
6464 pathoswith 323
        or      esi, -1
324
.rootdirCD_loop:
325
        inc     esi
326
        cmp     esi, 10
327
        jnc     .rootdir_done
328
        mov     eax, esi
329
        not     eax
330
        and     eax, 3
331
        shl     eax, 1
332
        inc     eax
333
        mov     ecx, esi
334
        shr     ecx, 2
335
        bt      [ecx*5+DRIVE_DATA+1], ax
336
        jnc     .rootdirCD_loop
337
        inc     dword[edx+8]
338
        dec     dword[esp]
339
        jns     .rootdirCD_loop
2288 clevermous 340
        dec     ebp
6464 pathoswith 341
        js      .rootdirCD_loop
342
        inc     dword[edx+4]
343
        mov     dword[edi], 16      ; attributes: folder
344
        mov     dword[edi+4], ebx   ; name encoding
345
        mov     ecx, 32/4
2288 clevermous 346
        add     edi, 8
6464 pathoswith 347
        xor     eax, eax
2288 clevermous 348
        rep stosd
6464 pathoswith 349
        mov     eax, esi
350
        add     eax, '0'
351
        cmp     ebx, 1
352
        jz      @f
353
        mov     word [edi], 'cd'
354
        mov     [edi+2], ax
355
        add     edi, 264
356
        jmp     .rootdirCD_loop
357
 
2288 clevermous 358
@@:
6464 pathoswith 359
        mov     dword[edi], 640063h
360
        mov     [edi+4], eax
2288 clevermous 361
        add     edi, 520
6464 pathoswith 362
        jmp     .rootdirCD_loop
363
 
364
.rootdir_done:
2288 clevermous 365
        pop     eax
366
        mov     ebx, [edx+4]
367
        xor     eax, eax
368
        dec     ebp
369
        js      @f
370
        mov     al, ERROR_END_OF_FILE
371
@@:
372
        mov     [image_of_eax], eax
373
        mov     [image_of_ebx], ebx
374
        ret
375
 
4700 mario79 376
;-----------------------------------------------------------------------------
2288 clevermous 377
process_replace_file_name:
6464 pathoswith 378
; in: [esi] = virtual path
379
; out: [esi]+[ebp] = physical path
3689 mario79 380
        xor     edi, edi
6471 pathoswith 381
        xor     ebp, ebp
2288 clevermous 382
.loop:
3711 clevermous 383
        cmp     edi, [full_file_name_table.size]
3689 mario79 384
        jae     .notfound
2288 clevermous 385
        push    esi edi
6464 pathoswith 386
        shl     edi, 7
6471 pathoswith 387
        add     edi, [full_file_name_table]
2288 clevermous 388
@@:
6464 pathoswith 389
        cmp     byte [edi], 0
2288 clevermous 390
        jz      .dest_done
391
        lodsb
392
        test    al, al
393
        jz      .cont
394
        scasb
395
        jz      @b
6798 pathoswith 396
        or      al, 20h
397
        cmp     [edi-1], al
398
        jz      @b
6464 pathoswith 399
.cont:
400
        pop     edi esi
401
        inc     edi
402
        jmp     .loop
403
 
2288 clevermous 404
.dest_done:
405
        cmp     byte [esi], 0
406
        jz      .found
407
        cmp     byte [esi], '/'
408
        jnz     .cont
409
.found:
410
        pop     edi eax
6464 pathoswith 411
        shl     edi, 7
6471 pathoswith 412
        add     edi, [full_file_name_table]
2288 clevermous 413
        mov     ebp, esi
414
        lea     esi, [edi+64]
415
.notfound:
416
        ret
6464 pathoswith 417
 
3689 mario79 418
;-----------------------------------------------------------------------------
3663 mario79 419
uglobal
6471 pathoswith 420
addDirSeal db  ?
3663 mario79 421
endg
6338 serge 422
 
6464 pathoswith 423
sys_current_directory:  ; sysfunction 30
2288 clevermous 424
        mov     eax, [current_slot]
425
        mov     edi, [eax+APPDATA.cur_dir]
6798 pathoswith 426
        xor     eax, eax
2288 clevermous 427
        dec     ebx
428
        jz      .set
429
        dec     ebx
430
        jz      .get
3663 mario79 431
        dec     ebx
432
        jz      .mount_additional_directory
6798 pathoswith 433
        mov     eax, edx
6471 pathoswith 434
        dec     ebx
6798 pathoswith 435
        jz      .set
436
        mov     eax, esi
437
        dec     ebx
438
        jz      .get
6471 pathoswith 439
@@:
2288 clevermous 440
        ret
3663 mario79 441
 
442
.mount_additional_directory:
6464 pathoswith 443
; in: ecx -> dir name+dir path (128)
6471 pathoswith 444
        mov     al, 1
445
        xchg    [addDirSeal], al
446
        test    al, al
447
        jnz     @b
3663 mario79 448
        mov     esi, ecx
449
        mov     edi, sysdir_name1
6798 pathoswith 450
        mov     ecx, 64
6464 pathoswith 451
        rep movsb   ; copying fake directory name
6798 pathoswith 452
        mov     byte [edi-1], 0
6471 pathoswith 453
        mov     cl, 63
454
        call    cp866toUTF8_string
455
        mov     byte [edi], 0
3663 mario79 456
        mov     [full_file_name_table.size], 2
457
        ret
6338 serge 458
 
6798 pathoswith 459
.get:
460
; in: ecx -> buffer, edx = length, eax = encoding
8676 rgimad 461
        stdcall is_region_userspace, ecx, edx
462
        jnz     @f
463
 
464
        ; if illegal buffer given
465
        xor     edx, edx
466
        jmp     .ret
467
@@:
468
 
6471 pathoswith 469
        mov     esi, edi
6534 pathoswith 470
        inc     esi
6471 pathoswith 471
        mov     edi, ecx
472
        cmp     edx, maxPathLength
473
        jc      @f
474
        mov     edx, maxPathLength
2288 clevermous 475
@@:
476
        mov     ecx, edx
6798 pathoswith 477
        jecxz   .ret
478
        cmp     eax, 2
479
        jz      .get16
480
        cmp     eax, 3
481
        jz      .get8
6471 pathoswith 482
@@:
483
        dec     ecx
484
        js      @f
485
        call    utf8to16
486
        call    uni2ansi_char
487
        stosb
488
        test    al, al
489
        jnz     @b
490
        sub     edx, ecx
491
@@:
6798 pathoswith 492
        mov     byte [edi-1], 0
493
.ret:
494
        mov     [esp+32], edx
2288 clevermous 495
        ret
496
 
6798 pathoswith 497
.get8:
498
        push    edi
499
        mov     edi, esi
500
        xor     eax, eax
501
        repnz scasb
502
        sub     edx, ecx
503
        mov     ecx, edx
504
        pop     edi
505
        rep movsb
506
        jmp     @b
507
 
6471 pathoswith 508
.get16:
6798 pathoswith 509
        shr     ecx, 1
6471 pathoswith 510
        shr     edx, 1
511
@@:
512
        dec     ecx
513
        js      @f
514
        call    utf8to16
515
        stosw
516
        test    ax, ax
517
        jnz     @b
518
        sub     edx, ecx
519
@@:
6798 pathoswith 520
        shl     edx, 1
521
        mov     word [edi-2], 0
522
        jmp     .ret
6464 pathoswith 523
 
2288 clevermous 524
.set:
6792 pathoswith 525
        mov     esi, ecx
526
getFullPath:
527
; in: esi -> file path, eax = string encoding, edi -> destination
528
; out: UTF-8 string (with marker), eax = length, 0 -> error
529
        test    eax, eax
530
        jnz     @f
531
        cmp     byte [esi], 4
6502 pathoswith 532
        jnc     @f
6792 pathoswith 533
        cmp     byte [esi], 0
534
        jz      @f
535
        lodsb
6471 pathoswith 536
@@:
537
        cmp     byte [esi], '/'
6792 pathoswith 538
        jnz     .relative
539
        cmp     eax, 2
540
        jnz     @f
541
        cmp     word [esi], '/'
542
        jnz     .relative
6471 pathoswith 543
        inc     esi
6792 pathoswith 544
        inc     esi
545
        jmp     .start
546
 
547
@@:
548
        inc     esi
6758 pathoswith 549
        cmp     byte [esi], 4
6792 pathoswith 550
        jnc     .start
551
        lodsb
6758 pathoswith 552
        cmp     byte [esi], '/'
553
        jnz     .start
554
        inc     esi
555
.start:
6792 pathoswith 556
        push    eax edi
6468 pathoswith 557
        call    process_replace_file_name
6792 pathoswith 558
        mov     edi, [esp]
559
        mov     ecx, maxPathLength
6502 pathoswith 560
        mov     al, 3
561
        mov     ah, '/'
562
        stosw
563
        sub     ecx, 2
6471 pathoswith 564
        test    ebp, ebp
565
        jz      .absolute
566
@@:
6468 pathoswith 567
        lodsb
568
        stosb
6471 pathoswith 569
        dec     ecx
6468 pathoswith 570
        test    al, al
6471 pathoswith 571
        jnz     @b
572
        mov     esi, ebp
6468 pathoswith 573
        dec     edi
6471 pathoswith 574
.absolute:
6792 pathoswith 575
        cmp     byte [esp+4], 2
6502 pathoswith 576
        jz      .utf16
6792 pathoswith 577
        cmp     byte [esp+4], 3
6502 pathoswith 578
        jz      .utf8
6471 pathoswith 579
        call    cp866toUTF8_string
6787 pathoswith 580
        jns     .end
6471 pathoswith 581
        jmp     .fail
582
 
6502 pathoswith 583
.utf8:
584
        dec     ecx
585
        js      .fail
586
        lodsb
587
        stosb
588
        test    al, al
6787 pathoswith 589
        jz      .end
6502 pathoswith 590
        jmp     .utf8
591
 
592
.utf16:
6471 pathoswith 593
        call    UTF16to8_string
6787 pathoswith 594
        jns     .end
6468 pathoswith 595
.fail:
596
        mov     byte [edi], 0
6792 pathoswith 597
        pop     eax eax
6468 pathoswith 598
        xor     eax, eax
6792 pathoswith 599
        ret
6468 pathoswith 600
 
6792 pathoswith 601
.relative:
602
        push    eax edi
603
        mov     ebx, esi
6468 pathoswith 604
        mov     edi, [current_slot]
605
        mov     edi, [edi+APPDATA.cur_dir]
606
        mov     edx, edi
6792 pathoswith 607
        mov     ecx, maxPathLength
6468 pathoswith 608
        xor     eax, eax
609
        repnz scasb
610
        mov     esi, edi
6792 pathoswith 611
        mov     edi, [esp]
6468 pathoswith 612
        jecxz   .fail
6502 pathoswith 613
        cmp     byte [ebx], 0
614
        jz      .set_ok
6792 pathoswith 615
        dec     esi
6471 pathoswith 616
        cmp     edx, edi    ; is destination equal to cur_dir?
617
        mov     edi, esi
618
        jz      @f
6792 pathoswith 619
        mov     edi, [esp]
2288 clevermous 620
        mov     ecx, esi
6468 pathoswith 621
        sub     ecx, edx
2288 clevermous 622
        mov     esi, edx
623
        mov     edx, edi
624
        rep movsb
6471 pathoswith 625
@@:
2288 clevermous 626
        mov     byte [edi], '/'
627
        inc     edi
6471 pathoswith 628
        mov     esi, ebx
629
        mov     ecx, edx
6792 pathoswith 630
        add     ecx, maxPathLength
6471 pathoswith 631
        sub     ecx, edi
632
        jmp     .absolute
633
 
6787 pathoswith 634
.set_ok:
635
        cmp     edx, edi    ; is destination equal to cur_dir?
6471 pathoswith 636
        jz      @f
6787 pathoswith 637
        mov     ecx, esi
638
        sub     ecx, edx
639
        mov     esi, edx
640
        rep movsb
2288 clevermous 641
@@:
6792 pathoswith 642
        pop     eax
643
        sub     edi, eax
644
        pop     eax
645
        mov     eax, edi
646
        ret
6787 pathoswith 647
 
648
.end:
649
        or      ecx, -1
6792 pathoswith 650
        mov     edi, [esp]
6787 pathoswith 651
        xor     eax, eax
652
        push    edi
653
        repnz scasb
654
        not     ecx
655
        pop     edi
656
.parse:
657
        mov     al, '/'
658
        repnz scasb
659
        jecxz   @b
660
        cmp     byte [edi], '.'
661
        jnz     .parse
662
        mov     esi, edi
663
@@:
664
        lodsw
665
        sub     ecx, 2
666
        cmp     ax, './'
667
        jz      @b
668
        cmp     ax, '..'
669
        jnz     @f
6471 pathoswith 670
        cmp     byte [esi], '/'
6787 pathoswith 671
        jnz     @f
672
        mov     edx, ecx
673
        mov     ecx, edi
6792 pathoswith 674
        sub     ecx, [esp]
6787 pathoswith 675
        sub     ecx, 2
676
        jc      .fail
677
        sub     edi, 2
678
        lodsb
679
        dec     edx
680
        std
681
        repnz scasb
682
        cld
683
        add     edi, 2
684
        mov     ecx, edx
685
        jmp     @b
6464 pathoswith 686
 
6787 pathoswith 687
@@:
688
        sub     esi, 2
689
        add     ecx, 2
690
        cmp     esi, edi
691
        jz      .parse
692
        push    edi ecx
693
        rep movsb
694
        pop     ecx edi
695
        jmp     .parse
696
 
6462 pathoswith 697
include "parse_fn.inc"
698
include "fs_common.inc"
699
include "iso9660.inc"   ; read for CD filesystem
700
include "fat.inc"
701
include "ntfs.inc"
702
include "ext.inc"
7736 dunkaist 703
include "xfs.asm"