Subversion Repositories Kolibri OS

Rev

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

Rev 520 Rev 521
Line 1... Line 1...
1
$Revision: 520 $
1
$Revision: 521 $
2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3
;;                                                              ;;
3
;;                                                              ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
4
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
5
;; Distributed under terms of the GNU General Public License    ;;
5
;; Distributed under terms of the GNU General Public License    ;;
6
;;                                                              ;;
6
;;                                                              ;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 8... Line 8...
8
 
8
 
9
image_of_eax EQU esp+44 ;36
9
image_of_eax EQU esp+36
Line 10... Line 10...
10
image_of_ebx EQU esp+32 ;24
10
image_of_ebx EQU esp+24
11
 
11
 
Line 12... Line 12...
12
; System function 70 - files with long names (LFN)
12
; System function 70 - files with long names (LFN)
Line 80... Line 80...
80
        db      'cd3',0
80
        db      'cd3',0
81
;**********************************************
81
;**********************************************
82
        dd      0
82
        dd      0
83
endg
83
endg
Line 84... Line -...
84
 
-
 
85
end_of_file_system_lfn:
-
 
86
		pop edx
-
 
87
                stdcall kernel_free, edx
-
 
88
		ret
-
 
89
 
-
 
90
 
84
 
91
file_system_lfn:
85
file_system_lfn:
92
; in: eax->fileinfo block
86
; in: eax->fileinfo block
93
; operation codes:
87
; operation codes:
94
; 0 : read file
88
; 0 : read file
Line 100... Line 94...
100
; 6 : set file/directory attributes structure
94
; 6 : set file/directory attributes structure
101
; 7 : start application
95
; 7 : start application
102
; 8 : delete file
96
; 8 : delete file
103
; 9 : create directory
97
; 9 : create directory
Line 104... Line -...
104
 
-
 
105
		; çàìåíà àäðåñà âîçâðàòà
-
 
106
                push    eax
-
 
107
		stdcall kernel_alloc, 200
-
 
108
                mov     edx,eax
-
 
109
                pop     eax
-
 
110
 
-
 
111
		push	edx
-
 
112
		push	end_of_file_system_lfn
-
 
113
                mov     ebx,edx
-
 
114
 
-
 
115
                mov     ecx, [eax]
-
 
116
                mov     [ebx],ecx
-
 
117
 
-
 
118
                add     ebx,4
-
 
119
                mov     ecx, [eax+4]
-
 
120
                mov     [ebx],ecx
-
 
121
 
-
 
122
                add     ebx,4
-
 
123
                mov     ecx, [eax+8]
-
 
124
                mov     [ebx],ecx
-
 
125
 
-
 
126
                add     ebx,4
-
 
127
                mov     ecx, [eax+12]
-
 
128
                mov     [ebx],ecx
-
 
129
 
-
 
130
                add     ebx,4
-
 
131
                mov     ecx, [eax+16]
-
 
132
                mov     [ebx],ecx
-
 
133
 
-
 
134
                add     ebx,4
-
 
135
		push	edx	  ; !!!!!!!!!!!!!!!!!!!
-
 
136
		; eax - yíà÷àëî ñòàðîãî ïàêåòà
-
 
137
		; edx - íà÷àëî íîâîãî ïàêåòà
-
 
138
		; ebx - êóäà ëîæèòü ñòðîêó
-
 
139
		add		eax,20
-
 
140
		mov		cl,	[eax]
-
 
141
		test	cl,cl
-
 
142
		jnz		@f
-
 
143
		mov		eax,[eax+1]
-
 
144
@@:
-
 
145
		stdcall full_file_name,eax,ebx
-
 
146
		pop		eax
-
 
147
 
-
 
148
 
-
 
149
 
-
 
150
   ;     add     eax, std_application_base_address
98
 
151
; parse file name
99
; parse file name
152
        xchg    ebx, eax
100
        xchg    ebx, eax
153
        lea     esi, [ebx+20]
-
 
154
        mov     ebp, esi        ; for 'start app' function full path must be known
101
        lea     esi, [ebx+20]
155
        lodsb
102
        lodsb
156
        test    al, al
103
        test    al, al
157
        jnz     @f
104
        jnz     @f
158
        mov     esi, [esi]
-
 
159
  ;      add     esi, std_application_base_address
-
 
160
        mov     ebp, esi
105
        mov     esi, [esi]
161
        lodsb
106
        lodsb
-
 
107
@@:
-
 
108
        cmp     al, '/'
-
 
109
        jz      .notcurdir
-
 
110
        dec     esi
-
 
111
        mov     ebp, esi
-
 
112
        test    al, al
-
 
113
        jnz     @f
-
 
114
        xor     ebp, ebp
-
 
115
@@:
-
 
116
        mov     esi, [current_slot]
-
 
117
        mov     esi, [esi+APPDATA.cur_dir]
-
 
118
        jmp     .parse_normal
-
 
119
.notcurdir:
-
 
120
        cmp     byte [esi], 0
-
 
121
        jz      .rootdir
-
 
122
        call    process_replace_file_name
162
@@:
123
.parse_normal:
163
        cmp dword [ebx], 7
124
        cmp dword [ebx], 7
164
        jne @F
125
        jne @F
165
        mov edx, [ebx+4]
126
        mov edx, [ebx+4]
166
        mov ebx, [ebx+8]
-
 
167
        test ebx, ebx
-
 
168
        jz .l1
-
 
169
    ;    add ebx, new_app_base
-
 
170
.l1:
127
        mov ebx, [ebx+8]
171
        call fs_execute  ; ebp, ebx, edx
128
        call fs_execute  ; esi+ebp, ebx, edx
172
        mov [image_of_eax], eax
129
        mov [image_of_eax], eax
173
        ret
130
        ret
174
@@:
-
 
175
        cmp     al, '/'
-
 
176
        jz      @f
-
 
177
.notfound:
-
 
178
        mov     dword [image_of_eax], 5       ; file not found
-
 
179
        ret
-
 
180
@@:
-
 
181
        cmp     byte [esi], 0
-
 
182
        jz      .rootdir
131
@@:
183
        mov     edi, rootdirs-8
132
        mov     edi, rootdirs-8
184
        xor     ecx, ecx
133
        xor     ecx, ecx
185
        push    esi
134
        push    esi
186
.scan1:
135
.scan1:
187
        pop     esi
136
        pop     esi
188
        add     edi, ecx
137
        add     edi, ecx
189
        scasd
138
        scasd
190
        scasd
139
        scasd
-
 
140
        mov     cl, byte [edi]
191
        mov     cl, byte [edi]
141
        test    cl, cl
192
        jecxz   .notfound
142
        jz      .notfound
193
        inc     edi
143
        inc     edi
194
        push    esi
144
        push    esi
195
@@:
145
@@:
196
        lodsb
146
        lodsb
Line 354... Line 304...
354
        mov     al, ERROR_END_OF_FILE
304
        mov     al, ERROR_END_OF_FILE
355
@@:
305
@@:
356
        mov     [image_of_eax], eax
306
        mov     [image_of_eax], eax
357
        mov     [image_of_ebx], ebx
307
        mov     [image_of_ebx], ebx
358
        ret
308
        ret
-
 
309
.notfound:
-
 
310
        mov     dword [image_of_eax], ERROR_FILE_NOT_FOUND
-
 
311
        and     dword [image_of_ebx], 0
-
 
312
        ret
Line 359... Line 313...
359
 
313
 
360
.found1:
314
.found1:
361
        pop     eax
315
        pop     eax
362
        cmp     byte [esi], 0
316
        cmp     byte [esi], 0
Line 371... Line 325...
371
        test    al, al
325
        test    al, al
372
        jz      .done1
326
        jz      .done1
373
        sub     al, '0'
327
        sub     al, '0'
374
        cmp     al, 9
328
        cmp     al, 9
375
        ja      .notfound
329
        ja      .notfound
376
        imul    ecx, 10
330
        lea     ecx, [ecx*5]
377
        add     ecx, eax
331
        lea     ecx, [ecx*2+eax]
378
        jmp     @b
332
        jmp     @b
379
.done1:
333
.done1:
380
        test    ecx, ecx
-
 
381
        jz      .notfound
334
        jecxz   .notfound
382
        test    al, al
335
        test    al, al
383
        jnz     @f
336
        jnz     @f
384
        dec     esi
337
        dec     esi
385
@@:
338
@@:
-
 
339
        cmp     byte [esi], 0
-
 
340
        jnz     @f
-
 
341
        test    ebp, ebp
-
 
342
        jz      @f
-
 
343
        mov     esi, ebp
-
 
344
        xor     ebp, ebp
-
 
345
@@:
386
; now [edi] contains handler address, ecx - partition number,
346
; now [edi] contains handler address, ecx - partition number,
387
; esi points to ASCIIZ string - rest of name
347
; esi points to ASCIIZ string - rest of name
388
        jmp     dword [edi]
348
        jmp     dword [edi]
Line 389... Line 349...
389
 
349
 
390
; handlers for devices
350
; handlers for devices
391
; in: ecx = 0 => query virtual directory /xxx
351
; in: ecx = 0 => query virtual directory /xxx
392
; in: ecx = partition number
352
; in: ecx = partition number
393
;     esi -> relative (for device) name
353
;     esi -> relative (for device) name
-
 
354
;     ebx -> fileinfo
394
;     ebx -> fileinfo
355
;     ebp = 0 or pointer to rest of name from folder addressed by esi
Line 395... Line 356...
395
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
356
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
396
 
357
 
397
fs_OnRamdisk:
358
fs_OnRamdisk:
Line 422... Line 383...
422
        dd      fs_RamdiskRewrite
383
        dd      fs_RamdiskRewrite
423
        dd      fs_RamdiskWrite
384
        dd      fs_RamdiskWrite
424
        dd      fs_RamdiskSetFileEnd
385
        dd      fs_RamdiskSetFileEnd
425
        dd      fs_RamdiskGetFileInfo
386
        dd      fs_RamdiskGetFileInfo
426
        dd      fs_RamdiskSetFileInfo
387
        dd      fs_RamdiskSetFileInfo
427
        dd      0 ;fs_RamdiskExecute
388
        dd      0
428
        dd      fs_RamdiskDelete
389
        dd      fs_RamdiskDelete
429
        dd      fs_RamdiskCreateFolder
390
        dd      fs_RamdiskCreateFolder
430
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
391
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
Line 431... Line 392...
431
 
392
 
Line 453... Line 414...
453
        dd      fs_FloppyRewrite
414
        dd      fs_FloppyRewrite
454
        dd      fs_FloppyWrite
415
        dd      fs_FloppyWrite
455
        dd      fs_FloppySetFileEnd
416
        dd      fs_FloppySetFileEnd
456
        dd      fs_FloppyGetFileInfo
417
        dd      fs_FloppyGetFileInfo
457
        dd      fs_FloppySetFileInfo
418
        dd      fs_FloppySetFileInfo
458
        dd      0 ;fs_FloppyExecute
419
        dd      0
459
        dd      fs_FloppyDelete
420
        dd      fs_FloppyDelete
460
        dd      fs_FloppyCreateFolder
421
        dd      fs_FloppyCreateFolder
461
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
422
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
Line 462... Line 423...
462
 
423
 
Line 526... Line 487...
526
        dd      fs_HdRewrite
487
        dd      fs_HdRewrite
527
        dd      fs_HdWrite
488
        dd      fs_HdWrite
528
        dd      fs_HdSetFileEnd
489
        dd      fs_HdSetFileEnd
529
        dd      fs_HdGetFileInfo
490
        dd      fs_HdGetFileInfo
530
        dd      fs_HdSetFileInfo
491
        dd      fs_HdSetFileInfo
531
        dd      0 ;fs_HdExecute
492
        dd      0
532
        dd      fs_HdDelete
493
        dd      fs_HdDelete
533
        dd      fs_HdCreateFolder
494
        dd      fs_HdCreateFolder
534
fs_NumHdServices = ($ - fs_HdServices)/4
495
fs_NumHdServices = ($ - fs_HdServices)/4
Line 535... Line 496...
535
 
496
 
Line 602... Line 563...
602
        dd      fs_NotImplemented
563
        dd      fs_NotImplemented
603
        dd      fs_NotImplemented
564
        dd      fs_NotImplemented
604
        dd      fs_NotImplemented
565
        dd      fs_NotImplemented
605
        dd      fs_CdGetFileInfo
566
        dd      fs_CdGetFileInfo
606
        dd      fs_NotImplemented
567
        dd      fs_NotImplemented
607
        dd      fs_CdExecute
568
        dd      0
608
fs_NumCdServices = ($ - fs_CdServices)/4
569
fs_NumCdServices = ($ - fs_CdServices)/4
Line 609... Line 570...
609
 
570
 
Line 610... Line 571...
610
;*******************************************************
571
;*******************************************************
Line 736... Line 697...
736
        clc
697
        clc
737
@@:
698
@@:
738
        ret
699
        ret
739
;*******************************************************
700
;*******************************************************
Line -... Line 701...
-
 
701
 
-
 
702
process_replace_file_name:
-
 
703
        mov     ebp, [full_file_name_table]
-
 
704
        mov     edi, [full_file_name_table.size]
-
 
705
        dec     edi
-
 
706
        shl     edi, 7
-
 
707
        add     edi, ebp
-
 
708
.loop:
-
 
709
        cmp     edi, ebp
-
 
710
        jb      .notfound
-
 
711
        push    esi edi
-
 
712
@@:
-
 
713
        cmp     byte [edi], 0
-
 
714
        jz      .dest_done
-
 
715
        lodsb
-
 
716
        test    al, al
-
 
717
        jz      .cont
-
 
718
        or      al, 20h
-
 
719
        scasb
-
 
720
        jz      @b
-
 
721
        jmp     .cont
-
 
722
.dest_done:
-
 
723
        cmp     byte [esi], 0
-
 
724
        jz      .found
-
 
725
        cmp     byte [esi], '/'
-
 
726
        jnz     .cont
-
 
727
        inc     esi
-
 
728
        jmp     .found
-
 
729
.cont:
-
 
730
        pop     edi esi
-
 
731
        sub     edi, 128
-
 
732
        jmp     .loop
-
 
733
.found:
-
 
734
        pop     edi eax
-
 
735
        mov     ebp, esi
-
 
736
        cmp     byte [esi], 0
-
 
737
        lea     esi, [edi+64]
-
 
738
        jnz     .ret
-
 
739
.notfound:
-
 
740
        xor     ebp, ebp
-
 
741
.ret:
-
 
742
        ret
-
 
743
 
-
 
744
sys_current_directory:
-
 
745
        mov     esi, [current_slot]
-
 
746
        mov     esi, [esi+APPDATA.cur_dir]
-
 
747
        mov     edx, esi
-
 
748
        dec     eax
-
 
749
        jz      .set
-
 
750
        dec     eax
-
 
751
        jz      .get
-
 
752
        ret
-
 
753
.get:
-
 
754
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
-
 
755
; for our code: ebx->buffer,ecx=len
-
 
756
@@:
-
 
757
        lodsb
-
 
758
        test    al, al
-
 
759
        jnz     @b
-
 
760
        sub     esi, edx
-
 
761
        inc     esi
-
 
762
        mov     [esp+36], esi
-
 
763
        cmp     ecx, esi
-
 
764
        jbe     @f
-
 
765
        mov     ecx, esi
-
 
766
@@:
-
 
767
        cmp     ecx, 1
-
 
768
        jbe     .ret
-
 
769
        mov     esi, edx
-
 
770
        mov     edi, ebx
-
 
771
        mov     al, '/'
-
 
772
        stosb
-
 
773
        dec     ecx
-
 
774
        dec     ecx
-
 
775
        rep     movsb
-
 
776
        mov     byte [edi], 0
-
 
777
.ret:
-
 
778
        ret
-
 
779
.set:
-
 
780
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
-
 
781
; for our code: ebx->string to set
-
 
782
@@:
-
 
783
        inc     esi
-
 
784
        cmp     byte [esi-1], 0
-
 
785
        jnz     @b
-
 
786
        dec     esi
-
 
787
        cmp     byte [ebx], '/'
-
 
788
        jz      .set_absolute
-
 
789
; string gives relative path
-
 
790
.relative:
-
 
791
        cmp     byte [ebx], 0
-
 
792
        jz      .set_ok
-
 
793
        cmp     word [ebx], '.'
-
 
794
        jz      .set_ok
-
 
795
        cmp     word [ebx], './'
-
 
796
        jnz     @f
-
 
797
        add     ebx, 2
-
 
798
        jmp     .relative
-
 
799
@@:
-
 
800
        cmp     word [ebx], '..'
-
 
801
        jnz     .doset_relative
-
 
802
        cmp     byte [ebx+2], 0
-
 
803
        jz      @f
-
 
804
        cmp     byte [ebx+2], '/'
-
 
805
        jnz     .doset_relative
-
 
806
@@:
-
 
807
        dec     esi
-
 
808
        cmp     byte [esi], '/'
-
 
809
        jnz     @b
-
 
810
        mov     byte [esi], 0
-
 
811
        add     ebx, 3
-
 
812
        jmp     .relative
-
 
813
.doset_relative:
-
 
814
        add     edx, 0x1000
-
 
815
        mov     byte [esi], '/'
-
 
816
        inc     esi
-
 
817
        cmp     esi, edx
-
 
818
        jae     .overflow_esi
-
 
819
@@:
-
 
820
        mov     al, [ebx]
-
 
821
        inc     ebx
-
 
822
        mov     [esi], al
-
 
823
        inc     esi
-
 
824
        test    al, al
-
 
825
        jz      .set_ok
-
 
826
        cmp     esi, edx
-
 
827
        jb      @b
-
 
828
.overflow_esi:
-
 
829
        mov     byte [esi-1], 0         ; force null-terminated string
-
 
830
.set_ok:
-
 
831
        ret
-
 
832
.set_absolute:
-
 
833
        lea     esi, [ebx+1]
-
 
834
        call    process_replace_file_name
-
 
835
        mov     edi, edx
-
 
836
        add     edx, 0x1000
-
 
837
.set_copy:
-
 
838
        lodsb
-
 
839
        stosb
-
 
840
        test    al, al
-
 
841
        jz      .set_part2
-
 
842
.set_copy_cont:
-
 
843
        cmp     edi, edx
-
 
844
        jb      .set_copy
-
 
845
.overflow_edi:
-
 
846
        mov     byte [edi-1], 0
-
 
847
        ret
-
 
848
.set_part2:
-
 
849
        mov     esi, ebp
-
 
850
        xor     ebp, ebp
-
 
851
        test    esi, esi
-
 
852
        jz      .set_ok
-
 
853
        mov     byte [edi-1], '/'