Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
431 serge 1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
1289 diamond 3
;; Copyright (C) KolibriOS team 2004-2009. All rights reserved. ;;
431 serge 4
;; Distributed under terms of the GNU General Public License    ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
593 mikedld 8
$Revision: 1379 $
9
 
10
 
521 diamond 11
image_of_eax EQU esp+36
12
image_of_ebx EQU esp+24
488 spraid 13
 
72 diamond 14
; System function 70 - files with long names (LFN)
71 diamond 15
; diamond, 2006
16
 
17
iglobal
18
; in this table names must be in lowercase
19
rootdirs:
585 mario79 20
	db	2,'rd'
21
	dd	fs_OnRamdisk
22
	dd	fs_NextRamdisk
23
	db	7,'ramdisk'
24
	dd	fs_OnRamdisk
25
	dd	fs_NextRamdisk
26
	db	2,'fd'
27
	dd	fs_OnFloppy
28
	dd	fs_NextFloppy
29
	db	10,'floppydisk'
30
	dd	fs_OnFloppy
31
	dd	fs_NextFloppy
32
	db	3,'hd0'
33
	dd	fs_OnHd0
34
	dd	fs_NextHd0
35
	db	3,'hd1'
36
	dd	fs_OnHd1
37
	dd	fs_NextHd1
38
	db	3,'hd2'
39
	dd	fs_OnHd2
40
	dd	fs_NextHd2
41
	db	3,'hd3'
42
	dd	fs_OnHd3
43
	dd	fs_NextHd3
87 mario79 44
;**********************************************
585 mario79 45
	db	3,'cd0'
46
	dd	fs_OnCd0
47
	dd	fs_NextCd
48
	db	3,'cd1'
49
	dd	fs_OnCd1
50
	dd	fs_NextCd
51
	db	3,'cd2'
52
	dd	fs_OnCd2
53
	dd	fs_NextCd
54
	db	3,'cd3'
55
	dd	fs_OnCd3
56
	dd	fs_NextCd
237 serge 57
;***********************************************
585 mario79 58
	db	0
75 diamond 59
 
87 mario79 60
 
75 diamond 61
virtual_root_query:
585 mario79 62
	dd	fs_HasRamdisk
63
	db	'rd',0
64
	dd	fs_HasFloppy
65
	db	'fd',0
66
	dd	fs_HasHd0
67
	db	'hd0',0
68
	dd	fs_HasHd1
69
	db	'hd1',0
70
	dd	fs_HasHd2
71
	db	'hd2',0
72
	dd	fs_HasHd3
73
	db	'hd3',0
87 mario79 74
;**********************************************
585 mario79 75
	dd	fs_HasCd0
76
	db	'cd0',0
77
	dd	fs_HasCd1
78
	db	'cd1',0
79
	dd	fs_HasCd2
80
	db	'cd2',0
81
	dd	fs_HasCd3
82
	db	'cd3',0
87 mario79 83
;**********************************************
585 mario79 84
	dd	0
709 diamond 85
 
86
fs_additional_handlers:
87
        dd      biosdisk_handler, biosdisk_enum_root
88
; add new handlers here
89
        dd      0
90
 
71 diamond 91
endg
92
 
93
file_system_lfn:
94
; in: eax->fileinfo block
95
; operation codes:
72 diamond 96
; 0 : read file
75 diamond 97
; 1 : read folder
83 diamond 98
; 2 : create/rewrite file
133 diamond 99
; 3 : write/append to file
100
; 4 : set end of file
86 diamond 101
; 5 : get file/directory attributes structure
102
; 6 : set file/directory attributes structure
91 diamond 103
; 7 : start application
171 diamond 104
; 8 : delete file
321 diamond 105
; 9 : create directory
71 diamond 106
 
1379 turbanoff 107
; parse file name
585 mario79 108
	xchg	ebx, eax
109
	lea	esi, [ebx+20]
110
	lodsb
111
	test	al, al
112
	jnz	@f
113
	mov	esi, [esi]
114
	lodsb
84 diamond 115
@@:
585 mario79 116
	cmp	al, '/'
117
	jz	.notcurdir
118
	dec	esi
119
	mov	ebp, esi
120
	test	al, al
121
	jnz	@f
122
	xor	ebp, ebp
521 diamond 123
@@:
585 mario79 124
	mov	esi, [current_slot]
125
	mov	esi, [esi+APPDATA.cur_dir]
126
	jmp	.parse_normal
521 diamond 127
.notcurdir:
585 mario79 128
	cmp	byte [esi], 0
129
	jz	.rootdir
130
	call	process_replace_file_name
521 diamond 131
.parse_normal:
585 mario79 132
	cmp dword [ebx], 7
133
	jne @F
134
	mov edx, [ebx+4]
135
	mov ebx, [ebx+8]
136
	call fs_execute  ; esi+ebp, ebx, edx
137
	mov [image_of_eax], eax
138
	ret
237 serge 139
@@:
585 mario79 140
	mov	edi, rootdirs-8
141
	xor	ecx, ecx
142
	push	esi
71 diamond 143
.scan1:
585 mario79 144
	pop	esi
145
	add	edi, ecx
146
	scasd
147
	scasd
148
	mov	cl, byte [edi]
149
	test	cl, cl
709 diamond 150
	jz	.notfound_try
585 mario79 151
	inc	edi
152
	push	esi
71 diamond 153
@@:
585 mario79 154
	lodsb
155
	or	al, 20h
156
	scasb
157
	loopz	@b
158
	jnz	.scan1
159
	lodsb
160
	cmp	al, '/'
161
	jz	.found1
162
	test	al, al
163
	jnz	.scan1
164
	pop	eax
71 diamond 165
; directory /xxx
166
.maindir:
709 diamond 167
	mov	esi, [edi+4]
168
.maindir_noesi:
585 mario79 169
	cmp	dword [ebx], 1
170
	jnz	.access_denied
171
	xor	eax, eax
1378 turbanoff 172
	mov	ebp, [ebx+12]			;количество блоков для считывания
173
	mov	edx, [ebx+16]			;куда записывать рузельтат
465 serge 174
    ;    add     edx, std_application_base_address
585 mario79 175
	push	dword [ebx+4]	; first block
176
	mov	ebx, [ebx+8]	; flags
78 diamond 177
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
585 mario79 178
	mov	edi, edx
709 diamond 179
	push    ecx
585 mario79 180
	mov	ecx, 32/4
181
	rep	stosd
709 diamond 182
	pop     ecx
585 mario79 183
	mov	byte [edx], 1	; version
75 diamond 184
.maindir_loop:
1379 turbanoff 185
	call	esi
585 mario79 186
	jc	.maindir_done
187
	inc	dword [edx+8]
188
	dec	dword [esp]
189
	jns	.maindir_loop
190
	dec	ebp
191
	js	.maindir_loop
192
	inc	dword [edx+4]
193
	mov	dword [edi], 0x10	; attributes: folder
194
	mov	dword [edi+4], 1	; name type: UNICODE
195
	push	eax
196
	xor	eax, eax
197
	add	edi, 8
709 diamond 198
	push    ecx
585 mario79 199
	mov	ecx, 40/4-2
200
	rep	stosd
709 diamond 201
	pop     ecx
585 mario79 202
	pop	eax
203
	push	eax edx
75 diamond 204
; convert number in eax to decimal UNICODE string
585 mario79 205
	push	edi
709 diamond 206
	push    ecx
585 mario79 207
	push	-'0'
709 diamond 208
	mov	ecx, 10
75 diamond 209
@@:
585 mario79 210
	xor	edx, edx
211
	div	ecx
212
	push	edx
213
	test	eax, eax
214
	jnz	@b
75 diamond 215
@@:
585 mario79 216
	pop	eax
217
	add	al, '0'
218
	stosb
219
	test	bl, 1		; UNICODE name?
220
	jz	.ansi2
221
	mov	byte [edi], 0