Subversion Repositories Kolibri OS

Rev

Rev 3908 | Rev 5201 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3908 Rev 4287
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2011. 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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 3908 $
8
$Revision: 4287 $
9
 
9
 
10
ERROR_SUCCESS        = 0
10
ERROR_SUCCESS        = 0
11
ERROR_DISK_BASE      = 1
11
ERROR_DISK_BASE      = 1
Line 28... Line 28...
28
; diamond, 2006
28
; diamond, 2006
Line 29... Line 29...
29
 
29
 
30
iglobal
30
iglobal
31
; in this table names must be in lowercase
31
; in this table names must be in lowercase
32
rootdirs:
-
 
33
        db      2,'rd'
-
 
34
        dd      fs_OnRamdisk
-
 
35
        dd      fs_NextRamdisk
-
 
36
        db      7,'ramdisk'
-
 
37
        dd      fs_OnRamdisk
-
 
38
        dd      fs_NextRamdisk
-
 
39
        db      2,'fd'
-
 
40
        dd      fs_OnFloppy
-
 
41
        dd      fs_NextFloppy
-
 
42
        db      10,'floppydisk'
-
 
43
        dd      fs_OnFloppy
-
 
44
        dd      fs_NextFloppy
32
rootdirs:
45
;**********************************************
33
;**********************************************
46
        db      3,'cd0'
34
        db      3,'cd0'
47
        dd      fs_OnCd0
35
        dd      fs_OnCd0
48
        dd      fs_NextCd
36
        dd      fs_NextCd
Line 58... Line 46...
58
;***********************************************
46
;***********************************************
59
        db      0
47
        db      0
Line 60... Line 48...
60
 
48
 
61
 
-
 
62
virtual_root_query:
-
 
63
        dd      fs_HasRamdisk
-
 
64
        db      'rd',0
-
 
65
        dd      fs_HasFloppy
49
 
66
        db      'fd',0
50
virtual_root_query:
67
;**********************************************
51
;**********************************************
68
        dd      fs_HasCd0
52
        dd      fs_HasCd0
69
        db      'cd0',0
53
        db      'cd0',0
Line 73... Line 57...
73
        db      'cd2',0
57
        db      'cd2',0
74
        dd      fs_HasCd3
58
        dd      fs_HasCd3
75
        db      'cd3',0
59
        db      'cd3',0
76
;**********************************************
60
;**********************************************
77
        dd      0
61
        dd      0
78
 
-
 
79
fs_additional_handlers:
-
 
80
        dd      dyndisk_handler, dyndisk_enum_root
-
 
81
; add new handlers here
-
 
82
        dd      0
-
 
83
 
-
 
84
endg
62
endg
Line 85... Line 63...
85
 
63
 
86
file_system_lfn_protected:
64
file_system_lfn_protected:
87
        pushad
65
        pushad
Line 255... Line 233...
255
        mov     dword [image_of_eax], 10      ; access denied
233
        mov     dword [image_of_eax], 10      ; access denied
256
        ret
234
        ret
Line 257... Line 235...
257
 
235
 
258
.readroot:
236
.readroot:
259
; virtual root folder - special handler
-
 
260
        mov     esi, virtual_root_query
237
; virtual root folder - special handler
261
        mov     ebp, [ebx+12]
238
        mov     ebp, [ebx+12]
262
        mov     edx, [ebx+16]
239
        mov     edx, [ebx+16]
263
    ;    add     edx, std_application_base_address
240
    ;    add     edx, std_application_base_address
264
        push    dword [ebx+4]   ; first block
241
        push    dword [ebx+4]   ; first block
Line 267... Line 244...
267
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
244
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
268
        mov     edi, edx
245
        mov     edi, edx
269
        mov     ecx, 32/4
246
        mov     ecx, 32/4
270
        rep stosd
247
        rep stosd
271
        mov     byte [edx], 1   ; version
248
        mov     byte [edx], 1   ; version
-
 
249
        sub     esp, 16
-
 
250
.readroot_ah_loop2:
-
 
251
        push    edi
-
 
252
        lea     edi, [esp+4]
-
 
253
        call    dyndisk_enum_root
-
 
254
        pop     edi
-
 
255
        test    eax, eax
-
 
256
        jz      .readroot_done_dynamic
-
 
257
        inc     dword [edx+8]
-
 
258
        dec     dword [esp+16]
-
 
259
        jns     .readroot_ah_loop2
-
 
260
        dec     ebp
-
 
261
        js      .readroot_ah_loop2
-
 
262
        push    eax
-
 
263
        xor     eax, eax
-
 
264
        inc     dword [edx+4]
-
 
265
        mov     dword [edi], 0x10       ; attributes: folder
-
 
266
        mov     dword [edi+4], ebx
-
 
267
        add     edi, 8
-
 
268
        mov     ecx, 40/4-2
-
 
269
        rep stosd
-
 
270
        push    esi edi
-
 
271
        lea     esi, [esp+12]
-
 
272
@@:
-
 
273
        lodsb
-
 
274
        stosb
-
 
275
        test    bl, 1
-
 
276
        jz      .ansi3
-
 
277
        mov     byte [edi], 0
-
 
278
        inc     edi
-
 
279
.ansi3:
-
 
280
        test    al, al
-
 
281
        jnz     @b
-
 
282
        pop     edi esi eax
-
 
283
        add     edi, 520
-
 
284
        test    bl, 1
-
 
285
        jnz     .readroot_ah_loop2
-
 
286
        sub     edi, 520-264
-
 
287
        jmp     .readroot_ah_loop2
-
 
288
.readroot_done_dynamic:
-
 
289
        add     esp, 16
-
 
290
        mov     esi, virtual_root_query
272
.readroot_loop:
291
.readroot_loop:
273
        cmp     dword [esi], eax
292
        cmp     dword [esi], eax
274
        jz      .readroot_done_static
293
        jz      .readroot_done
275
        call    dword [esi]
294
        call    dword [esi]
276
        add     esi, 4
295
        add     esi, 4
277
        test    eax, eax
296
        test    eax, eax
278
        jnz     @f
297
        jnz     @f
279
.readroot_next:
298
.readroot_next:
Line 310... Line 329...
310
        add     edi, 520
329
        add     edi, 520
311
        test    bl, 1
330
        test    bl, 1
312
        jnz     .readroot_loop
331
        jnz     .readroot_loop
313
        sub     edi, 520-264
332
        sub     edi, 520-264
314
        jmp     .readroot_loop
333
        jmp     .readroot_loop
315
.readroot_done_static:
-
 
316
        mov     esi, fs_additional_handlers-8
-
 
317
        sub     esp, 16
-
 
318
.readroot_ah_loop:
-
 
319
        add     esi, 8
-
 
320
        cmp     dword [esi], 0
-
 
321
        jz      .readroot_done
-
 
322
        xor     eax, eax
-
 
323
.readroot_ah_loop2:
-
 
324
        push    edi
-
 
325
        lea     edi, [esp+4]
-
 
326
        call    dword [esi+4]
-
 
327
        pop     edi
-
 
328
        test    eax, eax
-
 
329
        jz      .readroot_ah_loop
-
 
330
        inc     dword [edx+8]
-
 
331
        dec     dword [esp+16]
-
 
332
        jns     .readroot_ah_loop2
-
 
333
        dec     ebp
-
 
334
        js      .readroot_ah_loop2
-
 
335
        push    eax
-
 
336
        xor     eax, eax
-
 
337
        inc     dword [edx+4]
-
 
338
        mov     dword [edi], 0x10       ; attributes: folder
-
 
339
        mov     dword [edi+4], ebx
-
 
340
        add     edi, 8
-
 
341
        mov     ecx, 40/4-2
-
 
342
        rep stosd
-
 
343
        push    esi edi
-
 
344
        lea     esi, [esp+12]
-
 
345
@@:
-
 
346
        lodsb
-
 
347
        stosb
-
 
348
        test    bl, 1
-
 
349
        jz      .ansi3
-
 
350
        mov     byte [edi], 0
-
 
351
        inc     edi
-
 
352
.ansi3:
-
 
353
        test    al, al
-
 
354
        jnz     @b
-
 
355
        pop     edi esi eax
-
 
356
        add     edi, 520
-
 
357
        test    bl, 1
-
 
358
        jnz     .readroot_ah_loop2
-
 
359
        sub     edi, 520-264
-
 
360
        jmp     .readroot_ah_loop2
-
 
361
.readroot_done:
334
.readroot_done:
362
        add     esp, 16
-
 
363
        pop     eax
335
        pop     eax
364
        mov     ebx, [edx+4]
336
        mov     ebx, [edx+4]
365
        xor     eax, eax
337
        xor     eax, eax
366
        dec     ebp
338
        dec     ebp
367
        js      @f
339
        js      @f
Line 369... Line 341...
369
@@:
341
@@:
370
        mov     [image_of_eax], eax
342
        mov     [image_of_eax], eax
371
        mov     [image_of_ebx], ebx
343
        mov     [image_of_ebx], ebx
372
        ret
344
        ret
373
.notfound_try:
345
.notfound_try:
374
        mov     edi, fs_additional_handlers
-
 
375
@@:
-
 
376
        cmp     dword [edi], 0
-
 
377
        jz      .notfound
-
 
378
        call    dword [edi]
346
        call    dyndisk_handler
379
        scasd
-
 
380
        scasd
-
 
381
        jmp     @b
-
 
382
.notfound:
347
.notfound:
383
        mov     dword [image_of_eax], ERROR_FILE_NOT_FOUND
348
        mov     dword [image_of_eax], ERROR_FILE_NOT_FOUND
384
        and     dword [image_of_ebx], 0
349
        and     dword [image_of_ebx], 0
385
        ret
350
        ret
Line 434... Line 399...
434
;     esi -> relative (for device) name
399
;     esi -> relative (for device) name
435
;     ebx -> fileinfo
400
;     ebx -> fileinfo
436
;     ebp = 0 or pointer to rest of name from folder addressed by esi
401
;     ebp = 0 or pointer to rest of name from folder addressed by esi
437
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
402
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
Line 438... Line -...
438
 
-
 
439
fs_OnRamdisk:
-
 
440
        cmp     ecx, 1
-
 
441
        jnz     file_system_lfn.notfound
-
 
442
        mov     eax, [ebx]
-
 
443
        cmp     eax, fs_NumRamdiskServices
-
 
444
        jae     .not_impl
-
 
445
        mov     ecx, [ebx+12]
-
 
446
        mov     edx, [ebx+16]
-
 
447
   ;     add     edx, std_application_base_address
-
 
448
        add     ebx, 4
-
 
449
        call    dword [fs_RamdiskServices + eax*4]
-
 
450
        mov     [image_of_eax], eax
-
 
451
        mov     [image_of_ebx], ebx
-
 
452
        ret
-
 
453
.not_impl:
-
 
454
        mov     dword [image_of_eax], 2       ; not implemented
-
 
455
        ret
-
 
456
 
403
 
457
fs_NotImplemented:
404
fs_NotImplemented:
458
        mov     eax, 2
405
        mov     eax, 2
Line 459... Line -...
459
        ret
-
 
460
 
-
 
461
fs_RamdiskServices:
-
 
462
        dd      fs_RamdiskRead
-
 
463
        dd      fs_RamdiskReadFolder
-
 
464
        dd      fs_RamdiskRewrite
-
 
465
        dd      fs_RamdiskWrite
-
 
466
        dd      fs_RamdiskSetFileEnd
-
 
467
        dd      fs_RamdiskGetFileInfo
-
 
468
        dd      fs_RamdiskSetFileInfo
-
 
469
        dd      0
-
 
470
        dd      fs_RamdiskDelete
-
 
471
        dd      fs_RamdiskCreateFolder
-
 
472
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
-
 
473
 
-
 
474
fs_OnFloppy:
-
 
475
        cmp     ecx, 2
-
 
476
        ja      file_system_lfn.notfound
-
 
477
        mov     eax, [ebx]
-
 
478
        cmp     eax, fs_NumFloppyServices
-
 
479
        jae     fs_OnRamdisk.not_impl
-
 
480
        call    reserve_flp
-
 
481
        mov     [flp_number], cl
-
 
482
        mov     ecx, [ebx+12]
-
 
483
        mov     edx, [ebx+16]
-
 
484
   ;     add     edx, std_application_base_address
-
 
485
        add     ebx, 4
-
 
486
        call    dword [fs_FloppyServices + eax*4]
-
 
487
        and     [flp_status], 0
-
 
488
        mov     [image_of_eax], eax
-
 
489
        mov     [image_of_ebx], ebx
-
 
490
        ret
-
 
491
 
-
 
492
fs_FloppyServices:
-
 
493
        dd      fs_FloppyRead
-
 
494
        dd      fs_FloppyReadFolder
-
 
495
        dd      fs_FloppyRewrite
-
 
496
        dd      fs_FloppyWrite
-
 
497
        dd      fs_FloppySetFileEnd
-
 
498
        dd      fs_FloppyGetFileInfo
-
 
499
        dd      fs_FloppySetFileInfo
-
 
500
        dd      0
-
 
501
        dd      fs_FloppyDelete
-
 
502
        dd      fs_FloppyCreateFolder
-
 
503
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
406
        ret
504
 
407
 
505
;*******************************************************
408
;*******************************************************
506
fs_OnCd0:
409
fs_OnCd0:
507
        call    reserve_cd
410
        call    reserve_cd
Line 582... Line 485...
582
        dd      fs_NotImplemented
485
        dd      fs_NotImplemented
583
        dd      fs_NotImplemented
486
        dd      fs_NotImplemented
584
fs_NumCdServices = ($ - fs_CdServices)/4
487
fs_NumCdServices = ($ - fs_CdServices)/4
Line 585... Line 488...
585
 
488
 
586
;*******************************************************
-
 
587
 
-
 
588
fs_HasRamdisk:
-
 
589
        mov     al, 1   ; we always have ramdisk
-
 
590
        ret
-
 
591
fs_HasFloppy:
-
 
592
        cmp     byte [DRIVE_DATA], 0
-
 
593
        setnz   al
-
 
594
        ret
-
 
595
 
-
 
596
;*******************************************************
489
;*******************************************************
597
fs_HasCd0:
490
fs_HasCd0:
598
        test    byte [DRIVE_DATA+1], 10000000b
491
        test    byte [DRIVE_DATA+1], 10000000b
599
        setnz   al
492
        setnz   al
600
        ret
493
        ret
Line 615... Line 508...
615
; fs_NextXXX functions:
508
; fs_NextXXX functions:
616
; in: eax = partition number, from which start to scan
509
; in: eax = partition number, from which start to scan
617
; out: CF=1 => no more partitions
510
; out: CF=1 => no more partitions
618
;      CF=0 => eax=next partition number
511
;      CF=0 => eax=next partition number
Line 619... Line -...
619
 
-
 
620
fs_NextRamdisk:
-
 
621
; we always have /rd/1
-
 
622
        test    eax, eax
-
 
623
        stc
-
 
624
        jnz     @f
-
 
625
        mov     al, 1
-
 
626
        clc
-
 
627
@@:
-
 
628
        ret
-
 
629
 
-
 
630
fs_NextFloppy:
-
 
631
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
-
 
632
        test    byte [DRIVE_DATA], 0xF0
-
 
633
        jz      .no1
-
 
634
        test    eax, eax
-
 
635
        jnz     .no1
-
 
636
        inc     eax
-
 
637
        ret     ; CF cleared
-
 
638
.no1:
-
 
639
        test    byte [DRIVE_DATA], 0x0F
-
 
640
        jz      .no2
-
 
641
        cmp     al, 2
-
 
642
        jae     .no2
-
 
643
        mov     al, 2
-
 
644
        clc
-
 
645
        ret
-
 
646
.no2:
-
 
647
        stc
-
 
648
        ret
-
 
649
 
512
 
650
;*******************************************************
513
;*******************************************************
651
fs_NextCd:
514
fs_NextCd:
652
; we always have /cdX/1
515
; we always have /cdX/1
653
        test    eax, eax
516
        test    eax, eax