Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
425 victor 1
$Revision: 425 $
72 diamond 2
; System function 70 - files with long names (LFN)
71 diamond 3
; diamond, 2006
4
 
5
iglobal
6
; in this table names must be in lowercase
7
rootdirs:
75 diamond 8
        db      2,'rd'
9
        dd      fs_OnRamdisk
10
        dd      fs_NextRamdisk
11
        db      7,'ramdisk'
12
        dd      fs_OnRamdisk
13
        dd      fs_NextRamdisk
14
        db      2,'fd'
15
        dd      fs_OnFloppy
16
        dd      fs_NextFloppy
17
        db      10,'floppydisk'
18
        dd      fs_OnFloppy
19
        dd      fs_NextFloppy
20
        db      3,'hd0'
21
        dd      fs_OnHd0
22
        dd      fs_NextHd0
23
        db      3,'hd1'
24
        dd      fs_OnHd1
25
        dd      fs_NextHd1
26
        db      3,'hd2'
27
        dd      fs_OnHd2
28
        dd      fs_NextHd2
29
        db      3,'hd3'
30
        dd      fs_OnHd3
31
        dd      fs_NextHd3
87 mario79 32
;**********************************************
33
        db      3,'cd0'
34
        dd      fs_OnCd0
35
        dd      fs_NextCd
36
        db      3,'cd1'
37
        dd      fs_OnCd1
38
        dd      fs_NextCd
39
        db      3,'cd2'
40
        dd      fs_OnCd2
41
        dd      fs_NextCd
42
        db      3,'cd3'
43
        dd      fs_OnCd3
44
        dd      fs_NextCd
237 serge 45
;***********************************************
75 diamond 46
        db      0
47
 
87 mario79 48
 
75 diamond 49
virtual_root_query:
50
        dd      fs_HasRamdisk
78 diamond 51
        db      'rd',0
75 diamond 52
        dd      fs_HasFloppy
78 diamond 53
        db      'fd',0
75 diamond 54
        dd      fs_HasHd0
78 diamond 55
        db      'hd0',0
75 diamond 56
        dd      fs_HasHd1
78 diamond 57
        db      'hd1',0
75 diamond 58
        dd      fs_HasHd2
78 diamond 59
        db      'hd2',0
75 diamond 60
        dd      fs_HasHd3
78 diamond 61
        db      'hd3',0
87 mario79 62
;**********************************************
63
        dd      fs_HasCd0
64
        db      'cd0',0
65
        dd      fs_HasCd1
66
        db      'cd1',0
67
        dd      fs_HasCd2
68
        db      'cd2',0
69
        dd      fs_HasCd3
70
        db      'cd3',0
71
;**********************************************
75 diamond 72
        dd      0
71 diamond 73
endg
74
 
75
file_system_lfn:
76
; in: eax->fileinfo block
77
; operation codes:
72 diamond 78
; 0 : read file
75 diamond 79
; 1 : read folder
83 diamond 80
; 2 : create/rewrite file
133 diamond 81
; 3 : write/append to file
82
; 4 : set end of file
86 diamond 83
; 5 : get file/directory attributes structure
84
; 6 : set file/directory attributes structure
91 diamond 85
; 7 : start application
171 diamond 86
; 8 : delete file
321 diamond 87
; 9 : create directory
71 diamond 88
 
75 diamond 89
        add     eax, std_application_base_address
71 diamond 90
; parse file name
75 diamond 91
        xchg    ebx, eax
92
        lea     esi, [ebx+20]
91 diamond 93
        mov     ebp, esi        ; for 'start app' function full path must be known
75 diamond 94
        lodsb
84 diamond 95
        test    al, al
96
        jnz     @f
97
        mov     esi, [esi]
98
        add     esi, std_application_base_address
91 diamond 99
        mov     ebp, esi
84 diamond 100
        lodsb
101
@@:
237 serge 102
        cmp dword [ebx], 7
103
        jne @F
104
        mov edx, [ebx+4]
105
        mov ebx, [ebx+8]
106
        test ebx, ebx
107
        jz .l1
108
        add ebx, new_app_base
109
.l1:
110
        call fs_execute  ; ebp, ebx, edx
111
        mov [esp+36], eax
112
        ret
113
@@:
75 diamond 114
        cmp     al, '/'
115
        jz      @f
71 diamond 116
.notfound:
75 diamond 117
        mov     dword [esp+36], 5       ; file not found
118
        ret
71 diamond 119
@@:
75 diamond 120
        cmp     byte [esi], 0
121
        jz      .rootdir
122
        mov     edi, rootdirs-8
123
        xor     ecx, ecx
124
        push    esi
71 diamond 125
.scan1:
75 diamond 126
        pop     esi
127
        add     edi, ecx
128
        scasd
129
        scasd
130
        mov     cl, byte [edi]
131
        jecxz   .notfound
132
        inc     edi
133
        push    esi
71 diamond 134
@@:
75 diamond 135
        lodsb
136
        or      al, 20h
137
        scasb
138
        loopz   @b
139
        jnz     .scan1
140
        lodsb
141
        cmp     al, '/'
142
        jz      .found1
143
        test    al, al
144
        jnz     .scan1
145
        pop     eax
71 diamond 146
; directory /xxx
147
.maindir:
75 diamond 148
        cmp     dword [ebx], 1
149
        jnz     .access_denied
150
        xor     eax, eax
151
        mov     ebp, [ebx+12]
152
        mov     edx, [ebx+16]
153
        add     edx, std_application_base_address
78 diamond 154
        push    dword [ebx+4]   ; first block
155
        mov     ebx, [ebx+8]    ; flags
75 diamond 156
        mov     esi, [edi+4]
78 diamond 157
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
75 diamond 158
        mov     edi, edx
159
        mov     ecx, 32/4
160
        rep     stosd
161
        mov     byte [edx], 1   ; version
162
.maindir_loop:
163
        call    esi
164
        jc      .maindir_done
165
        inc     dword [edx+8]
78 diamond 166
        dec     dword [esp]
75 diamond 167
        jns     .maindir_loop
168
        dec     ebp
169
        js      .maindir_loop
170
        inc     dword [edx+4]
171
        mov     dword [edi], 0x10       ; attributes: folder
172
        mov     dword [edi+4], 1        ; name type: UNICODE
173
        push    eax
174
        xor     eax, eax
175
        add     edi, 8
176
        mov     ecx, 40/4-2
177
        rep     stosd
178
        pop     eax
179
        push    eax edx
180
; convert number in eax to decimal UNICODE string
181
        push    edi
182
        push    -'0'
183
        mov     cl, 10
184
@@:
185
        xor     edx, edx
186
        div     ecx
187
        push    edx
188
        test    eax, eax
189
        jnz     @b
190
@@:
191
        pop     eax
192
        add     al, '0'
78 diamond 193
        stosb
194
        test    bl, 1           ; UNICODE name?
195
        jz      .ansi2
196
        mov     byte [edi], 0
197
        inc     edi
198
.ansi2:
199
        test    al, al
75 diamond 200
        jnz     @b
201
        mov     byte [edi-1], 0
202
        pop     edi
78 diamond 203
; UNICODE name length is 520 bytes, ANSI - 264
75 diamond 204
        add     edi, 520
78 diamond 205
        test    bl, 1
206
        jnz     @f
207
        sub     edi, 520-264
208
@@:
75 diamond 209
        pop     edx eax
210
        jmp     .maindir_loop
211
.maindir_done:
78 diamond 212
        pop     eax
213
        mov     ebx, [edx+4]
75 diamond 214
        xor     eax, eax
215
        dec     ebp
216
        js      @f
217
        mov     al, ERROR_END_OF_FILE
218
@@:
219
        mov     [esp+36], eax
220
        mov     [esp+24], ebx
221
        ret
71 diamond 222
; directory /
223
.rootdir:
75 diamond 224
        cmp     dword [ebx], 1  ; read folder?
225
        jz      .readroot
226
.access_denied:
227
        mov     dword [esp+36], 10      ; access denied
228
        ret
71 diamond 229
 
75 diamond 230
.readroot:
231
; virtual root folder - special handler
232
        mov     esi, virtual_root_query
233
        mov     ebp, [ebx+12]
234
        mov     edx, [ebx+16]
235
        add     edx, std_application_base_address
78 diamond 236
        push    dword [ebx+4]   ; first block
237
        mov     ebx, [ebx+8]    ; flags
75 diamond 238
        xor     eax, eax
78 diamond 239
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
75 diamond 240
        mov     edi, edx
241
        mov     ecx, 32/4
242
        rep     stosd
243
        mov     byte [edx], 1   ; version
244
.readroot_loop:
245
        cmp     dword [esi], eax
246
        jz      .readroot_done
247
        call    dword [esi]
248
        add     esi, 4
249
        test    eax, eax
250
        jnz     @f
251
.readroot_next:
252
        or      ecx, -1
253
        xchg    esi, edi
78 diamond 254
        repnz   scasb
75 diamond 255
        xchg    esi, edi
256
        jmp     .readroot_loop
257
@@:
258
        xor     eax, eax
259
        inc     dword [edx+8]
78 diamond 260
        dec     dword [esp]
75 diamond 261
        jns     .readroot_next
262
        dec     ebp
263
        js      .readroot_next
264
        inc     dword [edx+4]
265
        mov     dword [edi], 0x10       ; attributes: folder
266
        mov     dword [edi+4], 1        ; name type: UNICODE
267
        add     edi, 8
268
        mov     ecx, 40/4-2
269
        rep     stosd
270
        push    edi
271
@@:
78 diamond 272
        lodsb
273
        stosb
274
        test    bl, 1
275
        jz      .ansi
276
        mov     byte [edi], 0
277
        inc     edi
278
.ansi:
75 diamond 279
        test    eax, eax
280
        jnz     @b
281
        pop     edi
282
        add     edi, 520
78 diamond 283
        test    bl, 1
284
        jnz     .readroot_loop
285
        sub     edi, 520-264
75 diamond 286
        jmp     .readroot_loop
287
.readroot_done:
78 diamond 288
        pop     eax
289
        mov     ebx, [edx+4]
75 diamond 290
        xor     eax, eax
291
        dec     ebp
292
        js      @f
293
        mov     al, ERROR_END_OF_FILE
294
@@:
295
        mov     [esp+36], eax
296
        mov     [esp+24], ebx
297
        ret
298
 
71 diamond 299
.found1:
75 diamond 300
        pop     eax
301
        cmp     byte [esi], 0
302
        jz      .maindir
71 diamond 303
; read partition number
75 diamond 304
        xor     ecx, ecx
305
        xor     eax, eax
71 diamond 306
@@:
75 diamond 307
        lodsb
308
        cmp     al, '/'
309
        jz      .done1
310
        test    al, al
311
        jz      .done1
312
        sub     al, '0'
313
        cmp     al, 9
314
        ja      .notfound
315
        imul    ecx, 10
316
        add     ecx, eax
317
        jmp     @b
71 diamond 318
.done1:
75 diamond 319
        test    ecx, ecx
320
        jz      .notfound
321
        test    al, al
322
        jnz     @f
323
        dec     esi
71 diamond 324
@@:
75 diamond 325
; now [edi] contains handler address, ecx - partition number,
326
; esi points to ASCIIZ string - rest of name
327
        jmp     dword [edi]
71 diamond 328
 
329
; handlers for devices
75 diamond 330
; in: ecx = 0 => query virtual directory /xxx
71 diamond 331
; in: ecx = partition number
332
;     esi -> relative (for device) name
333
;     ebx -> fileinfo
334
; out: [esp+36]=image of eax, [esp+24]=image of ebx
335
 
336
fs_OnRamdisk:
75 diamond 337
        cmp     ecx, 1
338
        jnz     file_system_lfn.notfound
339
        mov     eax, [ebx]
83 diamond 340
        cmp     eax, fs_NumRamdiskServices
341
        jae     .not_impl
75 diamond 342
        mov     ecx, [ebx+12]
343
        mov     edx, [ebx+16]
344
        add     edx, std_application_base_address
345
        add     ebx, 4
346
        call    dword [fs_RamdiskServices + eax*4]
347
        mov     [esp+36], eax
348
        mov     [esp+24], ebx
349
        ret
71 diamond 350
.not_impl:
75 diamond 351
        mov     dword [esp+36], 2       ; not implemented
352
        ret
71 diamond 353
 
86 diamond 354
fs_NotImplemented:
355
        mov     eax, 2
356
        ret
357
 
71 diamond 358
fs_RamdiskServices:
75 diamond 359
        dd      fs_RamdiskRead
360
        dd      fs_RamdiskReadFolder
83 diamond 361
        dd      fs_RamdiskRewrite
131 diamond 362
        dd      fs_RamdiskWrite
133 diamond 363
        dd      fs_RamdiskSetFileEnd
86 diamond 364
        dd      fs_RamdiskGetFileInfo
365
        dd      fs_RamdiskSetFileInfo
321 diamond 366
        dd      0 ;fs_RamdiskExecute
171 diamond 367
        dd      fs_RamdiskDelete
321 diamond 368
        dd      fs_RamdiskCreateFolder
83 diamond 369
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
71 diamond 370
 
371
fs_OnFloppy:
75 diamond 372
        cmp     ecx, 2
373
        ja      file_system_lfn.notfound
374
        mov     eax, [ebx]
83 diamond 375
        cmp     eax, fs_NumFloppyServices
376
        jae     fs_OnRamdisk.not_impl
75 diamond 377
        call    reserve_flp
378
        mov     [flp_number], cl
379
        mov     ecx, [ebx+12]
380
        mov     edx, [ebx+16]
381
        add     edx, std_application_base_address
382
        add     ebx, 4
383
        call    dword [fs_FloppyServices + eax*4]
384
        and     [flp_status], 0
385
        mov     [esp+36], eax
386
        mov     [esp+24], ebx
387
        ret
71 diamond 388
 
389
fs_FloppyServices:
75 diamond 390
        dd      fs_FloppyRead
391
        dd      fs_FloppyReadFolder
83 diamond 392
        dd      fs_FloppyRewrite
131 diamond 393
        dd      fs_FloppyWrite
133 diamond 394
        dd      fs_FloppySetFileEnd
86 diamond 395
        dd      fs_FloppyGetFileInfo
396
        dd      fs_FloppySetFileInfo
321 diamond 397
        dd      0 ;fs_FloppyExecute
171 diamond 398
        dd      fs_FloppyDelete
321 diamond 399
        dd      fs_FloppyCreateFolder
83 diamond 400
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
71 diamond 401
 
402
fs_OnHd0:
75 diamond 403
        call    reserve_hd1
404
        mov     [hdbase], 0x1F0
405
        mov     [hdid], 0
406
        push    1
407
        jmp     fs_OnHd
71 diamond 408
fs_OnHd1:
75 diamond 409
        call    reserve_hd1
410
        mov     [hdbase], 0x1F0
411
        mov     [hdid], 0x10
412
        push    2
413
        jmp     fs_OnHd
71 diamond 414
fs_OnHd2:
75 diamond 415
        call    reserve_hd1
416
        mov     [hdbase], 0x170
417
        mov     [hdid], 0
418
        push    3
419
        jmp     fs_OnHd
71 diamond 420
fs_OnHd3:
75 diamond 421
        call    reserve_hd1
422
        mov     [hdbase], 0x170
423
        mov     [hdid], 0x10
424
        push    4
71 diamond 425
fs_OnHd:
95 mario79 426
        call    reserve_hd_channel
75 diamond 427
        pop     eax
428
        mov     [hdpos], eax
429
        cmp     ecx, 0x100
430
        jae     .nf
422 serge 431
        cmp     cl, [DRIVE_DATA+1+eax]
75 diamond 432
        jbe     @f
433
.nf:
95 mario79 434
        call    free_hd_channel
75 diamond 435
        and     [hd1_status], 0
436
        mov     dword [esp+36], 5       ; not found
437
        ret
71 diamond 438
@@:
75 diamond 439
        mov     [fat32part], ecx
440
        push    ebx esi
441
        call    choice_necessity_partition_1
442
        pop     esi ebx
443
        mov     ecx, [ebx+12]
444
        mov     edx, [ebx+16]
445
        add     edx, std_application_base_address
446
        mov     eax, [ebx]
83 diamond 447
        cmp     eax, fs_NumHdServices
448
        jae     .not_impl
75 diamond 449
        add     ebx, 4
450
        call    dword [fs_HdServices + eax*4]
95 mario79 451
        call    free_hd_channel
75 diamond 452
        and     [hd1_status], 0
453
        mov     [esp+36], eax
454
        mov     [esp+24], ebx
455
        ret
456
.not_impl:
95 mario79 457
        call    free_hd_channel
75 diamond 458
        and     [hd1_status], 0
459
        mov     dword [esp+36], 2       ; not implemented
460
        ret
71 diamond 461
 
462
fs_HdServices:
75 diamond 463
        dd      fs_HdRead
464
        dd      fs_HdReadFolder
83 diamond 465
        dd      fs_HdRewrite
131 diamond 466
        dd      fs_HdWrite
133 diamond 467
        dd      fs_HdSetFileEnd
86 diamond 468
        dd      fs_HdGetFileInfo
469
        dd      fs_HdSetFileInfo
256 diamond 470
        dd      0 ;fs_HdExecute
171 diamond 471
        dd      fs_HdDelete
321 diamond 472
        dd      fs_HdCreateFolder
83 diamond 473
fs_NumHdServices = ($ - fs_HdServices)/4
75 diamond 474
 
87 mario79 475
;*******************************************************
476
fs_OnCd0:
477
        call    reserve_cd
478
        mov  [ChannelNumber],1
479
        mov  [DiskNumber],0
480
        push    6
481
        jmp     fs_OnCd
482
fs_OnCd1:
483
        call    reserve_cd
484
        mov  [ChannelNumber],1
485
        mov  [DiskNumber],1
486
        push    4
487
        jmp     fs_OnCd
488
fs_OnCd2:
489
        call    reserve_cd
490
        mov  [ChannelNumber],2
491
        mov  [DiskNumber],0
492
        push    2
493
        jmp     fs_OnCd
494
fs_OnCd3:
495
        call    reserve_cd
496
        mov  [ChannelNumber],2
497
        mov  [DiskNumber],1
498
        push    0
499
fs_OnCd:
95 mario79 500
        call    reserve_cd_channel
87 mario79 501
        pop     eax
502
        mov     [hdpos], eax
503
        cmp     ecx, 0x100
504
        jae     .nf
133 diamond 505
        push    ecx ebx
87 mario79 506
        mov     cl,al
389 serge 507
        mov     bl,[DRIVE_DATA+1]
87 mario79 508
        shr     bl,cl
509
        test    bl,2
133 diamond 510
        pop     ebx ecx
87 mario79 511
 
512
        jnz     @f
513
.nf:
95 mario79 514
        call    free_cd_channel
87 mario79 515
        and    [cd_status], 0
516
        mov     dword [esp+36], 5       ; not found
517
        ret
518
@@:
519
        mov     ecx, [ebx+12]
520
        mov     edx, [ebx+16]
521
        add     edx, std_application_base_address
522
        mov     eax, [ebx]
90 mario79 523
        cmp     eax,fs_NumCdServices
524
        jae      .not_impl
87 mario79 525
        add     ebx, 4
526
        call    dword [fs_CdServices + eax*4]
95 mario79 527
        call    free_cd_channel
87 mario79 528
        and     [cd_status], 0
529
        mov     [esp+36], eax
530
        mov     [esp+24], ebx
531
        ret
532
.not_impl:
95 mario79 533
        call    free_cd_channel
89 diamond 534
        and     [cd_status], 0
87 mario79 535
        mov     dword [esp+36], 2       ; not implemented
536
        ret
537
 
538
fs_CdServices:
539
        dd      fs_CdRead
540
        dd      fs_CdReadFolder
90 mario79 541
        dd      fs_NotImplemented
542
        dd      fs_NotImplemented
543
        dd      fs_NotImplemented
544
        dd      fs_CdGetFileInfo
545
        dd      fs_NotImplemented
94 mario79 546
        dd      fs_CdExecute
90 mario79 547
fs_NumCdServices = ($ - fs_CdServices)/4
548
 
87 mario79 549
;*******************************************************
550
 
75 diamond 551
fs_HasRamdisk:
552
        mov     al, 1   ; we always have ramdisk
553
        ret
554
 
555
fs_HasFloppy:
381 serge 556
        cmp     byte [DRIVE_DATA], 0
75 diamond 557
        setnz   al
558
        ret
559
 
560
fs_HasHd0:
381 serge 561
        mov     al, [DRIVE_DATA+1]
75 diamond 562
        and     al, 11000000b
563
        cmp     al, 01000000b
564
        setz    al
565
        ret
566
fs_HasHd1:
381 serge 567
        mov     al, [DRIVE_DATA+1]
75 diamond 568
        and     al, 00110000b
569
        cmp     al, 00010000b
570
        setz    al
571
        ret
572
fs_HasHd2:
381 serge 573
        mov     al, [DRIVE_DATA+1]
75 diamond 574
        and     al, 00001100b
575
        cmp     al, 00000100b
576
        setz    al
577
        ret
578
fs_HasHd3:
381 serge 579
        mov     al, [DRIVE_DATA+1]
75 diamond 580
        and     al, 00000011b
581
        cmp     al, 00000001b
582
        setz    al
583
        ret
584
 
87 mario79 585
;*******************************************************
586
fs_HasCd0:
381 serge 587
        mov     al, [DRIVE_DATA+1]
87 mario79 588
        and     al, 11000000b
589
        cmp     al, 10000000b
590
        setz    al
591
        ret
592
fs_HasCd1:
381 serge 593
        mov     al, [DRIVE_DATA+1]
87 mario79 594
        and     al, 00110000b
595
        cmp     al, 00100000b
596
        setz    al
597
        ret
598
fs_HasCd2:
381 serge 599
        mov     al, [DRIVE_DATA+1]
87 mario79 600
        and     al, 00001100b
601
        cmp     al, 00001000b
602
        setz    al
603
        ret
604
fs_HasCd3:
381 serge 605
        mov     al, [DRIVE_DATA+1]
87 mario79 606
        and     al, 00000011b
607
        cmp     al, 00000010b
608
        setz    al
609
        ret
237 serge 610
;*******************************************************
87 mario79 611
 
75 diamond 612
; fs_NextXXX functions:
613
; in: eax = partition number, from which start to scan
614
; out: CF=1 => no more partitions
615
;      CF=0 => eax=next partition number
616
 
617
fs_NextRamdisk:
618
; we always have /rd/1
619
        test    eax, eax
620
        stc
621
        jnz     @f
622
        mov     al, 1
623
        clc
624
@@:
625
        ret
626
 
627
fs_NextFloppy:
381 serge 628
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
629
        test    byte [DRIVE_DATA], 0xF0
75 diamond 630
        jz      .no1
631
        test    eax, eax
632
        jnz     .no1
633
        inc     eax
634
        ret     ; CF cleared
635
.no1:
381 serge 636
        test    byte [DRIVE_DATA], 0x0F
75 diamond 637
        jz      .no2
638
        cmp     al, 2
639
        jae     .no2
640
        mov     al, 2
641
        clc
642
        ret
643
.no2:
644
        stc
645
        ret
646
 
647
; on hdx, we have partitions from 1 to [0x40002+x]
648
fs_NextHd0:
649
        push    0
650
        jmp     fs_NextHd
651
fs_NextHd1:
652
        push    1
653
        jmp     fs_NextHd
654
fs_NextHd2:
655
        push    2
656
        jmp     fs_NextHd
657
fs_NextHd3:
658
        push    3
659
fs_NextHd:
660
        pop     ecx
381 serge 661
        movzx   ecx, byte [DRIVE_DATA+2+ecx]
75 diamond 662
        cmp     eax, ecx
663
        jae     fs_NextFloppy.no2
664
        inc     eax
665
        clc
666
        ret
237 serge 667
 
87 mario79 668
;*******************************************************
669
fs_NextCd:
670
; we always have /cdX/1
671
        test    eax, eax
672
        stc
673
        jnz     @f
674
        mov     al, 1
675
        clc
676
@@:
677
        ret
678
;*******************************************************
679