Subversion Repositories Kolibri OS

Rev

Rev 3725 | Rev 4287 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 3725 Rev 3908
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2
;;                                                              ;;
2
;;                                                              ;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
7
 
7
 
8
$Revision: 3725 $
8
$Revision: 3908 $
9
 
9
 
10
ERROR_SUCCESS        = 0
10
ERROR_SUCCESS        = 0
11
ERROR_DISK_BASE      = 1
11
ERROR_DISK_BASE      = 1
12
ERROR_UNSUPPORTED_FS = 2
12
ERROR_UNSUPPORTED_FS = 2
13
ERROR_UNKNOWN_FS     = 3
13
ERROR_UNKNOWN_FS     = 3
14
ERROR_PARTITION      = 4
14
ERROR_PARTITION      = 4
15
ERROR_FILE_NOT_FOUND = 5
15
ERROR_FILE_NOT_FOUND = 5
16
ERROR_END_OF_FILE    = 6
16
ERROR_END_OF_FILE    = 6
17
ERROR_MEMORY_POINTER = 7
17
ERROR_MEMORY_POINTER = 7
18
ERROR_DISK_FULL      = 8
18
ERROR_DISK_FULL      = 8
19
ERROR_FAT_TABLE      = 9 ;deprecated
19
ERROR_FAT_TABLE      = 9 ;deprecated
20
ERROR_FS_FAIL        = 9
20
ERROR_FS_FAIL        = 9
21
ERROR_ACCESS_DENIED  = 10
21
ERROR_ACCESS_DENIED  = 10
22
ERROR_DEVICE         = 11
22
ERROR_DEVICE         = 11
23
 
23
 
24
image_of_eax EQU esp+32
24
image_of_eax EQU esp+32
25
image_of_ebx EQU esp+20
25
image_of_ebx EQU esp+20
26
 
26
 
27
; System function 70 - files with long names (LFN)
27
; System function 70 - files with long names (LFN)
28
; diamond, 2006
28
; diamond, 2006
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:
32
rootdirs:
33
        db      2,'rd'
33
        db      2,'rd'
34
        dd      fs_OnRamdisk
34
        dd      fs_OnRamdisk
35
        dd      fs_NextRamdisk
35
        dd      fs_NextRamdisk
36
        db      7,'ramdisk'
36
        db      7,'ramdisk'
37
        dd      fs_OnRamdisk
37
        dd      fs_OnRamdisk
38
        dd      fs_NextRamdisk
38
        dd      fs_NextRamdisk
39
        db      2,'fd'
39
        db      2,'fd'
40
        dd      fs_OnFloppy
40
        dd      fs_OnFloppy
41
        dd      fs_NextFloppy
41
        dd      fs_NextFloppy
42
        db      10,'floppydisk'
42
        db      10,'floppydisk'
43
        dd      fs_OnFloppy
43
        dd      fs_OnFloppy
44
        dd      fs_NextFloppy
44
        dd      fs_NextFloppy
45
        db      3,'hd0'
-
 
46
        dd      fs_OnHd0
-
 
47
        dd      fs_NextHd0
-
 
48
        db      3,'hd1'
-
 
49
        dd      fs_OnHd1
-
 
50
        dd      fs_NextHd1
-
 
51
        db      3,'hd2'
-
 
52
        dd      fs_OnHd2
-
 
53
        dd      fs_NextHd2
-
 
54
        db      3,'hd3'
-
 
55
        dd      fs_OnHd3
-
 
56
        dd      fs_NextHd3
-
 
57
;**********************************************
45
;**********************************************
58
        db      3,'cd0'
46
        db      3,'cd0'
59
        dd      fs_OnCd0
47
        dd      fs_OnCd0
60
        dd      fs_NextCd
48
        dd      fs_NextCd
61
        db      3,'cd1'
49
        db      3,'cd1'
62
        dd      fs_OnCd1
50
        dd      fs_OnCd1
63
        dd      fs_NextCd
51
        dd      fs_NextCd
64
        db      3,'cd2'
52
        db      3,'cd2'
65
        dd      fs_OnCd2
53
        dd      fs_OnCd2
66
        dd      fs_NextCd
54
        dd      fs_NextCd
67
        db      3,'cd3'
55
        db      3,'cd3'
68
        dd      fs_OnCd3
56
        dd      fs_OnCd3
69
        dd      fs_NextCd
57
        dd      fs_NextCd
70
;***********************************************
58
;***********************************************
71
        db      0
59
        db      0
72
 
60
 
73
 
61
 
74
virtual_root_query:
62
virtual_root_query:
75
        dd      fs_HasRamdisk
63
        dd      fs_HasRamdisk
76
        db      'rd',0
64
        db      'rd',0
77
        dd      fs_HasFloppy
65
        dd      fs_HasFloppy
78
        db      'fd',0
66
        db      'fd',0
79
        dd      fs_HasHd0
-
 
80
        db      'hd0',0
-
 
81
        dd      fs_HasHd1
-
 
82
        db      'hd1',0
-
 
83
        dd      fs_HasHd2
-
 
84
        db      'hd2',0
-
 
85
        dd      fs_HasHd3
-
 
86
        db      'hd3',0
-
 
87
;**********************************************
67
;**********************************************
88
        dd      fs_HasCd0
68
        dd      fs_HasCd0
89
        db      'cd0',0
69
        db      'cd0',0
90
        dd      fs_HasCd1
70
        dd      fs_HasCd1
91
        db      'cd1',0
71
        db      'cd1',0
92
        dd      fs_HasCd2
72
        dd      fs_HasCd2
93
        db      'cd2',0
73
        db      'cd2',0
94
        dd      fs_HasCd3
74
        dd      fs_HasCd3
95
        db      'cd3',0
75
        db      'cd3',0
96
;**********************************************
76
;**********************************************
97
        dd      0
77
        dd      0
98
 
78
 
99
fs_additional_handlers:
79
fs_additional_handlers:
100
        dd      biosdisk_handler, biosdisk_enum_root
-
 
101
        dd      dyndisk_handler, dyndisk_enum_root
80
        dd      dyndisk_handler, dyndisk_enum_root
102
; add new handlers here
81
; add new handlers here
103
        dd      0
82
        dd      0
104
 
83
 
105
endg
84
endg
106
 
85
 
107
file_system_lfn_protected:
86
file_system_lfn_protected:
108
        pushad
87
        pushad
109
        call    protect_from_terminate
88
        call    protect_from_terminate
110
        call    file_system_lfn
89
        call    file_system_lfn
111
        call    unprotect_from_terminate
90
        call    unprotect_from_terminate
112
        popad
91
        popad
113
        mov     [image_of_eax], eax
92
        mov     [image_of_eax], eax
114
        mov     [image_of_ebx], ebx
93
        mov     [image_of_ebx], ebx
115
        ret
94
        ret
116
 
95
 
117
file_system_lfn:
96
file_system_lfn:
118
; in: ebx->fileinfo block
97
; in: ebx->fileinfo block
119
; operation codes:
98
; operation codes:
120
; 0 : read file
99
; 0 : read file
121
; 1 : read folder
100
; 1 : read folder
122
; 2 : create/rewrite file
101
; 2 : create/rewrite file
123
; 3 : write/append to file
102
; 3 : write/append to file
124
; 4 : set end of file
103
; 4 : set end of file
125
; 5 : get file/directory attributes structure
104
; 5 : get file/directory attributes structure
126
; 6 : set file/directory attributes structure
105
; 6 : set file/directory attributes structure
127
; 7 : start application
106
; 7 : start application
128
; 8 : delete file
107
; 8 : delete file
129
; 9 : create directory
108
; 9 : create directory
130
 
109
 
131
; parse file name
110
; parse file name
132
        lea     esi, [ebx+20]
111
        lea     esi, [ebx+20]
133
        lodsb
112
        lodsb
134
        test    al, al
113
        test    al, al
135
        jnz     @f
114
        jnz     @f
136
        mov     esi, [esi]
115
        mov     esi, [esi]
137
        lodsb
116
        lodsb
138
@@:
117
@@:
139
        cmp     al, '/'
118
        cmp     al, '/'
140
        jz      .notcurdir
119
        jz      .notcurdir
141
        dec     esi
120
        dec     esi
142
        mov     ebp, esi
121
        mov     ebp, esi
143
        test    al, al
122
        test    al, al
144
        jnz     @f
123
        jnz     @f
145
        xor     ebp, ebp
124
        xor     ebp, ebp
146
@@:
125
@@:
147
        mov     esi, [current_slot]
126
        mov     esi, [current_slot]
148
        mov     esi, [esi+APPDATA.cur_dir]
127
        mov     esi, [esi+APPDATA.cur_dir]
149
        jmp     .parse_normal
128
        jmp     .parse_normal
150
.notcurdir:
129
.notcurdir:
151
        cmp     byte [esi], 0
130
        cmp     byte [esi], 0
152
        jz      .rootdir
131
        jz      .rootdir
153
        call    process_replace_file_name
132
        call    process_replace_file_name
154
.parse_normal:
133
.parse_normal:
155
        cmp     dword [ebx], 7
134
        cmp     dword [ebx], 7
156
        jne     @F
135
        jne     @F
157
        mov     edx, [ebx+4]
136
        mov     edx, [ebx+4]
158
        mov     ebx, [ebx+8]
137
        mov     ebx, [ebx+8]
159
        call    fs_execute; esi+ebp, ebx, edx
138
        call    fs_execute; esi+ebp, ebx, edx
160
        mov     [image_of_eax], eax
139
        mov     [image_of_eax], eax
161
        ret
140
        ret
162
@@:
141
@@:
163
        mov     edi, rootdirs-8
142
        mov     edi, rootdirs-8
164
        xor     ecx, ecx
143
        xor     ecx, ecx
165
        push    esi
144
        push    esi
166
.scan1:
145
.scan1:
167
        pop     esi
146
        pop     esi
168
        add     edi, ecx
147
        add     edi, ecx
169
        scasd
148
        scasd
170
        scasd
149
        scasd
171
        mov     cl, byte [edi]
150
        mov     cl, byte [edi]
172
        test    cl, cl
151
        test    cl, cl
173
        jz      .notfound_try
152
        jz      .notfound_try
174
        inc     edi
153
        inc     edi
175
        push    esi
154
        push    esi
176
@@:
155
@@:
177
        lodsb
156
        lodsb
178
        or      al, 20h
157
        or      al, 20h
179
        scasb
158
        scasb
180
        loopz   @b
159
        loopz   @b
181
        jnz     .scan1
160
        jnz     .scan1
182
        lodsb
161
        lodsb
183
        cmp     al, '/'
162
        cmp     al, '/'
184
        jz      .found1
163
        jz      .found1
185
        test    al, al
164
        test    al, al
186
        jnz     .scan1
165
        jnz     .scan1
187
        pop     eax
166
        pop     eax
188
; directory /xxx
167
; directory /xxx
189
.maindir:
168
.maindir:
190
        mov     esi, [edi+4]
169
        mov     esi, [edi+4]
191
.maindir_noesi:
170
.maindir_noesi:
192
        cmp     dword [ebx], 1
171
        cmp     dword [ebx], 1
193
        jnz     .access_denied
172
        jnz     .access_denied
194
        xor     eax, eax
173
        xor     eax, eax
195
        mov     ebp, [ebx+12]                   ;количество блоков для считывания
174
        mov     ebp, [ebx+12]                   ;количество блоков для считывания
196
        mov     edx, [ebx+16]                   ;куда записывать рузельтат
175
        mov     edx, [ebx+16]                   ;куда записывать рузельтат
197
    ;    add     edx, std_application_base_address
176
    ;    add     edx, std_application_base_address
198
        push    dword [ebx+4]   ; first block
177
        push    dword [ebx+4]   ; first block
199
        mov     ebx, [ebx+8]    ; flags
178
        mov     ebx, [ebx+8]    ; flags
200
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
179
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
201
        mov     edi, edx
180
        mov     edi, edx
202
        push    ecx
181
        push    ecx
203
        mov     ecx, 32/4
182
        mov     ecx, 32/4
204
        rep stosd
183
        rep stosd
205
        pop     ecx
184
        pop     ecx
206
        mov     byte [edx], 1   ; version
185
        mov     byte [edx], 1   ; version
207
.maindir_loop:
186
.maindir_loop:
208
        call    esi
187
        call    esi
209
        jc      .maindir_done
188
        jc      .maindir_done
210
        inc     dword [edx+8]
189
        inc     dword [edx+8]
211
        dec     dword [esp]
190
        dec     dword [esp]
212
        jns     .maindir_loop
191
        jns     .maindir_loop
213
        dec     ebp
192
        dec     ebp
214
        js      .maindir_loop
193
        js      .maindir_loop
215
        inc     dword [edx+4]
194
        inc     dword [edx+4]
216
        mov     dword [edi], 0x10       ; attributes: folder
195
        mov     dword [edi], 0x10       ; attributes: folder
217
        mov     dword [edi+4], 1        ; name type: UNICODE
196
        mov     dword [edi+4], 1        ; name type: UNICODE
218
        push    eax
197
        push    eax
219
        xor     eax, eax
198
        xor     eax, eax
220
        add     edi, 8
199
        add     edi, 8
221
        push    ecx
200
        push    ecx
222
        mov     ecx, 40/4-2
201
        mov     ecx, 40/4-2
223
        rep stosd
202
        rep stosd
224
        pop     ecx
203
        pop     ecx
225
        pop     eax
204
        pop     eax
226
        push    eax edx
205
        push    eax edx
227
; convert number in eax to decimal UNICODE string
206
; convert number in eax to decimal UNICODE string
228
        push    edi
207
        push    edi
229
        push    ecx
208
        push    ecx
230
        push    -'0'
209
        push    -'0'
231
        mov     ecx, 10
210
        mov     ecx, 10
232
@@:
211
@@:
233
        xor     edx, edx
212
        xor     edx, edx
234
        div     ecx
213
        div     ecx
235
        push    edx
214
        push    edx
236
        test    eax, eax
215
        test    eax, eax
237
        jnz     @b
216
        jnz     @b
238
@@:
217
@@:
239
        pop     eax
218
        pop     eax
240
        add     al, '0'
219
        add     al, '0'
241
        stosb
220
        stosb
242
        test    bl, 1           ; UNICODE name?
221
        test    bl, 1           ; UNICODE name?
243
        jz      .ansi2
222
        jz      .ansi2
244
        mov     byte [edi], 0
223
        mov     byte [edi], 0
245
        inc     edi
224
        inc     edi
246
.ansi2:
225
.ansi2:
247
        test    al, al
226
        test    al, al
248
        jnz     @b
227
        jnz     @b
249
        mov     byte [edi-1], 0
228
        mov     byte [edi-1], 0
250
        pop     ecx
229
        pop     ecx
251
        pop     edi
230
        pop     edi
252
; UNICODE name length is 520 bytes, ANSI - 264
231
; UNICODE name length is 520 bytes, ANSI - 264
253
        add     edi, 520
232
        add     edi, 520
254
        test    bl, 1
233
        test    bl, 1
255
        jnz     @f
234
        jnz     @f
256
        sub     edi, 520-264
235
        sub     edi, 520-264
257
@@:
236
@@:
258
        pop     edx eax
237
        pop     edx eax
259
        jmp     .maindir_loop
238
        jmp     .maindir_loop
260
.maindir_done:
239
.maindir_done:
261
        pop     eax
240
        pop     eax
262
        mov     ebx, [edx+4]
241
        mov     ebx, [edx+4]
263
        xor     eax, eax
242
        xor     eax, eax
264
        dec     ebp
243
        dec     ebp
265
        js      @f
244
        js      @f
266
        mov     al, ERROR_END_OF_FILE
245
        mov     al, ERROR_END_OF_FILE
267
@@:
246
@@:
268
        mov     [image_of_eax], eax
247
        mov     [image_of_eax], eax
269
        mov     [image_of_ebx], ebx
248
        mov     [image_of_ebx], ebx
270
        ret
249
        ret
271
; directory /
250
; directory /
272
.rootdir:
251
.rootdir:
273
        cmp     dword [ebx], 1  ; read folder?
252
        cmp     dword [ebx], 1  ; read folder?
274
        jz      .readroot
253
        jz      .readroot
275
.access_denied:
254
.access_denied:
276
        mov     dword [image_of_eax], 10      ; access denied
255
        mov     dword [image_of_eax], 10      ; access denied
277
        ret
256
        ret
278
 
257
 
279
.readroot:
258
.readroot:
280
; virtual root folder - special handler
259
; virtual root folder - special handler
281
        mov     esi, virtual_root_query
260
        mov     esi, virtual_root_query
282
        mov     ebp, [ebx+12]
261
        mov     ebp, [ebx+12]
283
        mov     edx, [ebx+16]
262
        mov     edx, [ebx+16]
284
    ;    add     edx, std_application_base_address
263
    ;    add     edx, std_application_base_address
285
        push    dword [ebx+4]   ; first block
264
        push    dword [ebx+4]   ; first block
286
        mov     ebx, [ebx+8]    ; flags
265
        mov     ebx, [ebx+8]    ; flags
287
        xor     eax, eax
266
        xor     eax, eax
288
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
267
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
289
        mov     edi, edx
268
        mov     edi, edx
290
        mov     ecx, 32/4
269
        mov     ecx, 32/4
291
        rep stosd
270
        rep stosd
292
        mov     byte [edx], 1   ; version
271
        mov     byte [edx], 1   ; version
293
.readroot_loop:
272
.readroot_loop:
294
        cmp     dword [esi], eax
273
        cmp     dword [esi], eax
295
        jz      .readroot_done_static
274
        jz      .readroot_done_static
296
        call    dword [esi]
275
        call    dword [esi]
297
        add     esi, 4
276
        add     esi, 4
298
        test    eax, eax
277
        test    eax, eax
299
        jnz     @f
278
        jnz     @f
300
.readroot_next:
279
.readroot_next:
301
        or      ecx, -1
280
        or      ecx, -1
302
        xchg    esi, edi
281
        xchg    esi, edi
303
        repnz scasb
282
        repnz scasb
304
        xchg    esi, edi
283
        xchg    esi, edi
305
        jmp     .readroot_loop
284
        jmp     .readroot_loop
306
@@:
285
@@:
307
        xor     eax, eax
286
        xor     eax, eax
308
        inc     dword [edx+8]
287
        inc     dword [edx+8]
309
        dec     dword [esp]
288
        dec     dword [esp]
310
        jns     .readroot_next
289
        jns     .readroot_next
311
        dec     ebp
290
        dec     ebp
312
        js      .readroot_next
291
        js      .readroot_next
313
        inc     dword [edx+4]
292
        inc     dword [edx+4]
314
        mov     dword [edi], 0x10       ; attributes: folder
293
        mov     dword [edi], 0x10       ; attributes: folder
315
        mov     dword [edi+4], ebx      ; name type: UNICODE
294
        mov     dword [edi+4], ebx      ; name type: UNICODE
316
        add     edi, 8
295
        add     edi, 8
317
        mov     ecx, 40/4-2
296
        mov     ecx, 40/4-2
318
        rep stosd
297
        rep stosd
319
        push    edi
298
        push    edi
320
@@:
299
@@:
321
        lodsb
300
        lodsb
322
        stosb
301
        stosb
323
        test    bl, 1
302
        test    bl, 1
324
        jz      .ansi
303
        jz      .ansi
325
        mov     byte [edi], 0
304
        mov     byte [edi], 0
326
        inc     edi
305
        inc     edi
327
.ansi:
306
.ansi:
328
        test    eax, eax
307
        test    eax, eax
329
        jnz     @b
308
        jnz     @b
330
        pop     edi
309
        pop     edi
331
        add     edi, 520
310
        add     edi, 520
332
        test    bl, 1
311
        test    bl, 1
333
        jnz     .readroot_loop
312
        jnz     .readroot_loop
334
        sub     edi, 520-264
313
        sub     edi, 520-264
335
        jmp     .readroot_loop
314
        jmp     .readroot_loop
336
.readroot_done_static:
315
.readroot_done_static:
337
        mov     esi, fs_additional_handlers-8
316
        mov     esi, fs_additional_handlers-8
338
        sub     esp, 16
317
        sub     esp, 16
339
.readroot_ah_loop:
318
.readroot_ah_loop:
340
        add     esi, 8
319
        add     esi, 8
341
        cmp     dword [esi], 0
320
        cmp     dword [esi], 0
342
        jz      .readroot_done
321
        jz      .readroot_done
343
        xor     eax, eax
322
        xor     eax, eax
344
.readroot_ah_loop2:
323
.readroot_ah_loop2:
345
        push    edi
324
        push    edi
346
        lea     edi, [esp+4]
325
        lea     edi, [esp+4]
347
        call    dword [esi+4]
326
        call    dword [esi+4]
348
        pop     edi
327
        pop     edi
349
        test    eax, eax
328
        test    eax, eax
350
        jz      .readroot_ah_loop
329
        jz      .readroot_ah_loop
351
        inc     dword [edx+8]
330
        inc     dword [edx+8]
352
        dec     dword [esp+16]
331
        dec     dword [esp+16]
353
        jns     .readroot_ah_loop2
332
        jns     .readroot_ah_loop2
354
        dec     ebp
333
        dec     ebp
355
        js      .readroot_ah_loop2
334
        js      .readroot_ah_loop2
356
        push    eax
335
        push    eax
357
        xor     eax, eax
336
        xor     eax, eax
358
        inc     dword [edx+4]
337
        inc     dword [edx+4]
359
        mov     dword [edi], 0x10       ; attributes: folder
338
        mov     dword [edi], 0x10       ; attributes: folder
360
        mov     dword [edi+4], ebx
339
        mov     dword [edi+4], ebx
361
        add     edi, 8
340
        add     edi, 8
362
        mov     ecx, 40/4-2
341
        mov     ecx, 40/4-2
363
        rep stosd
342
        rep stosd
364
        push    esi edi
343
        push    esi edi
365
        lea     esi, [esp+12]
344
        lea     esi, [esp+12]
366
@@:
345
@@:
367
        lodsb
346
        lodsb
368
        stosb
347
        stosb
369
        test    bl, 1
348
        test    bl, 1
370
        jz      .ansi3
349
        jz      .ansi3
371
        mov     byte [edi], 0
350
        mov     byte [edi], 0
372
        inc     edi
351
        inc     edi
373
.ansi3:
352
.ansi3:
374
        test    al, al
353
        test    al, al
375
        jnz     @b
354
        jnz     @b
376
        pop     edi esi eax
355
        pop     edi esi eax
377
        add     edi, 520
356
        add     edi, 520
378
        test    bl, 1
357
        test    bl, 1
379
        jnz     .readroot_ah_loop2
358
        jnz     .readroot_ah_loop2
380
        sub     edi, 520-264
359
        sub     edi, 520-264
381
        jmp     .readroot_ah_loop2
360
        jmp     .readroot_ah_loop2
382
.readroot_done:
361
.readroot_done:
383
        add     esp, 16
362
        add     esp, 16
384
        pop     eax
363
        pop     eax
385
        mov     ebx, [edx+4]
364
        mov     ebx, [edx+4]
386
        xor     eax, eax
365
        xor     eax, eax
387
        dec     ebp
366
        dec     ebp
388
        js      @f
367
        js      @f
389
        mov     al, ERROR_END_OF_FILE
368
        mov     al, ERROR_END_OF_FILE
390
@@:
369
@@:
391
        mov     [image_of_eax], eax
370
        mov     [image_of_eax], eax
392
        mov     [image_of_ebx], ebx
371
        mov     [image_of_ebx], ebx
393
        ret
372
        ret
394
.notfound_try:
373
.notfound_try:
395
        mov     edi, fs_additional_handlers
374
        mov     edi, fs_additional_handlers
396
@@:
375
@@:
397
        cmp     dword [edi], 0
376
        cmp     dword [edi], 0
398
        jz      .notfound
377
        jz      .notfound
399
        call    dword [edi]
378
        call    dword [edi]
400
        scasd
379
        scasd
401
        scasd
380
        scasd
402
        jmp     @b
381
        jmp     @b
403
.notfound:
382
.notfound:
404
        mov     dword [image_of_eax], ERROR_FILE_NOT_FOUND
383
        mov     dword [image_of_eax], ERROR_FILE_NOT_FOUND
405
        and     dword [image_of_ebx], 0
384
        and     dword [image_of_ebx], 0
406
        ret
385
        ret
407
 
386
 
408
.notfounda:
387
.notfounda:
409
        cmp     edi, esp
388
        cmp     edi, esp
410
        jnz     .notfound
389
        jnz     .notfound
411
        call    dword [edi+4]
390
        call    dword [edi+4]
412
        add     esp, 16
391
        add     esp, 16
413
        jmp     .notfound
392
        jmp     .notfound
414
 
393
 
415
.found1:
394
.found1:
416
        pop     eax
395
        pop     eax
417
        cmp     byte [esi], 0
396
        cmp     byte [esi], 0
418
        jz      .maindir
397
        jz      .maindir
419
.found2:
398
.found2:
420
; read partition number
399
; read partition number
421
        xor     ecx, ecx
400
        xor     ecx, ecx
422
        xor     eax, eax
401
        xor     eax, eax
423
@@:
402
@@:
424
        lodsb
403
        lodsb
425
        cmp     al, '/'
404
        cmp     al, '/'
426
        jz      .done1
405
        jz      .done1
427
        test    al, al
406
        test    al, al
428
        jz      .done1
407
        jz      .done1
429
        sub     al, '0'
408
        sub     al, '0'
430
        cmp     al, 9
409
        cmp     al, 9
431
        ja      .notfounda
410
        ja      .notfounda
432
        lea     ecx, [ecx*5]
411
        lea     ecx, [ecx*5]
433
        lea     ecx, [ecx*2+eax]
412
        lea     ecx, [ecx*2+eax]
434
        jmp     @b
413
        jmp     @b
435
.done1:
414
.done1:
436
        jecxz   .notfounda
415
        jecxz   .notfounda
437
        test    al, al
416
        test    al, al
438
        jnz     @f
417
        jnz     @f
439
        dec     esi
418
        dec     esi
440
@@:
419
@@:
441
        cmp     byte [esi], 0
420
        cmp     byte [esi], 0
442
        jnz     @f
421
        jnz     @f
443
        test    ebp, ebp
422
        test    ebp, ebp
444
        jz      @f
423
        jz      @f
445
        mov     esi, ebp
424
        mov     esi, ebp
446
        xor     ebp, ebp
425
        xor     ebp, ebp
447
@@:
426
@@:
448
; now [edi] contains handler address, ecx - partition number,
427
; now [edi] contains handler address, ecx - partition number,
449
; esi points to ASCIIZ string - rest of name
428
; esi points to ASCIIZ string - rest of name
450
        jmp     dword [edi]
429
        jmp     dword [edi]
451
 
430
 
452
; handlers for devices
431
; handlers for devices
453
; in: ecx = 0 => query virtual directory /xxx
432
; in: ecx = 0 => query virtual directory /xxx
454
; in: ecx = partition number
433
; in: ecx = partition number
455
;     esi -> relative (for device) name
434
;     esi -> relative (for device) name
456
;     ebx -> fileinfo
435
;     ebx -> fileinfo
457
;     ebp = 0 or pointer to rest of name from folder addressed by esi
436
;     ebp = 0 or pointer to rest of name from folder addressed by esi
458
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
437
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
459
 
438
 
460
fs_OnRamdisk:
439
fs_OnRamdisk:
461
        cmp     ecx, 1
440
        cmp     ecx, 1
462
        jnz     file_system_lfn.notfound
441
        jnz     file_system_lfn.notfound
463
        mov     eax, [ebx]
442
        mov     eax, [ebx]
464
        cmp     eax, fs_NumRamdiskServices
443
        cmp     eax, fs_NumRamdiskServices
465
        jae     .not_impl
444
        jae     .not_impl
466
        mov     ecx, [ebx+12]
445
        mov     ecx, [ebx+12]
467
        mov     edx, [ebx+16]
446
        mov     edx, [ebx+16]
468
   ;     add     edx, std_application_base_address
447
   ;     add     edx, std_application_base_address
469
        add     ebx, 4
448
        add     ebx, 4
470
        call    dword [fs_RamdiskServices + eax*4]
449
        call    dword [fs_RamdiskServices + eax*4]
471
        mov     [image_of_eax], eax
450
        mov     [image_of_eax], eax
472
        mov     [image_of_ebx], ebx
451
        mov     [image_of_ebx], ebx
473
        ret
452
        ret
474
.not_impl:
453
.not_impl:
475
        mov     dword [image_of_eax], 2       ; not implemented
454
        mov     dword [image_of_eax], 2       ; not implemented
476
        ret
455
        ret
477
 
456
 
478
fs_NotImplemented:
457
fs_NotImplemented:
479
        mov     eax, 2
458
        mov     eax, 2
480
        ret
459
        ret
481
 
460
 
482
fs_RamdiskServices:
461
fs_RamdiskServices:
483
        dd      fs_RamdiskRead
462
        dd      fs_RamdiskRead
484
        dd      fs_RamdiskReadFolder
463
        dd      fs_RamdiskReadFolder
485
        dd      fs_RamdiskRewrite
464
        dd      fs_RamdiskRewrite
486
        dd      fs_RamdiskWrite
465
        dd      fs_RamdiskWrite
487
        dd      fs_RamdiskSetFileEnd
466
        dd      fs_RamdiskSetFileEnd
488
        dd      fs_RamdiskGetFileInfo
467
        dd      fs_RamdiskGetFileInfo
489
        dd      fs_RamdiskSetFileInfo
468
        dd      fs_RamdiskSetFileInfo
490
        dd      0
469
        dd      0
491
        dd      fs_RamdiskDelete
470
        dd      fs_RamdiskDelete
492
        dd      fs_RamdiskCreateFolder
471
        dd      fs_RamdiskCreateFolder
493
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
472
fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
494
 
473
 
495
fs_OnFloppy:
474
fs_OnFloppy:
496
        cmp     ecx, 2
475
        cmp     ecx, 2
497
        ja      file_system_lfn.notfound
476
        ja      file_system_lfn.notfound
498
        mov     eax, [ebx]
477
        mov     eax, [ebx]
499
        cmp     eax, fs_NumFloppyServices
478
        cmp     eax, fs_NumFloppyServices
500
        jae     fs_OnRamdisk.not_impl
479
        jae     fs_OnRamdisk.not_impl
501
        call    reserve_flp
480
        call    reserve_flp
502
        mov     [flp_number], cl
481
        mov     [flp_number], cl
503
        mov     ecx, [ebx+12]
482
        mov     ecx, [ebx+12]
504
        mov     edx, [ebx+16]
483
        mov     edx, [ebx+16]
505
   ;     add     edx, std_application_base_address
484
   ;     add     edx, std_application_base_address
506
        add     ebx, 4
485
        add     ebx, 4
507
        call    dword [fs_FloppyServices + eax*4]
486
        call    dword [fs_FloppyServices + eax*4]
508
        and     [flp_status], 0
487
        and     [flp_status], 0
509
        mov     [image_of_eax], eax
488
        mov     [image_of_eax], eax
510
        mov     [image_of_ebx], ebx
489
        mov     [image_of_ebx], ebx
511
        ret
490
        ret
512
 
491
 
513
fs_FloppyServices:
492
fs_FloppyServices:
514
        dd      fs_FloppyRead
493
        dd      fs_FloppyRead
515
        dd      fs_FloppyReadFolder
494
        dd      fs_FloppyReadFolder
516
        dd      fs_FloppyRewrite
495
        dd      fs_FloppyRewrite
517
        dd      fs_FloppyWrite
496
        dd      fs_FloppyWrite
518
        dd      fs_FloppySetFileEnd
497
        dd      fs_FloppySetFileEnd
519
        dd      fs_FloppyGetFileInfo
498
        dd      fs_FloppyGetFileInfo
520
        dd      fs_FloppySetFileInfo
499
        dd      fs_FloppySetFileInfo
521
        dd      0
500
        dd      0
522
        dd      fs_FloppyDelete
501
        dd      fs_FloppyDelete
523
        dd      fs_FloppyCreateFolder
502
        dd      fs_FloppyCreateFolder
524
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
503
fs_NumFloppyServices = ($ - fs_FloppyServices)/4
525
 
-
 
526
fs_OnHd0:
-
 
527
        call    reserve_hd1
-
 
528
        mov     eax, [hd_address_table]
-
 
529
        mov     [hdbase], eax   ;0x1F0
-
 
530
        mov     [hdid], 0
-
 
531
        push    1
-
 
532
        jmp     fs_OnHd
-
 
533
fs_OnHd1:
-
 
534
        call    reserve_hd1
-
 
535
        mov     eax, [hd_address_table]
-
 
536
        mov     [hdbase], eax   ;0x1F0
-
 
537
        mov     [hdid], 0x10
-
 
538
        push    2
-
 
539
        jmp     fs_OnHd
-
 
540
fs_OnHd2:
-
 
541
        call    reserve_hd1
-
 
542
        mov     eax, [hd_address_table+16]
-
 
543
        mov     [hdbase], eax   ;0x170
-
 
544
        mov     [hdid], 0
-
 
545
        push    3
-
 
546
        jmp     fs_OnHd
-
 
547
fs_OnHd3:
-
 
548
        call    reserve_hd1
-
 
549
        mov     eax, [hd_address_table+16]
-
 
550
        mov     [hdbase], eax   ;0x170
-
 
551
        mov     [hdid], 0x10
-
 
552
        push    4
-
 
553
fs_OnHd:
-
 
554
        call    reserve_hd_channel
-
 
555
        pop     eax
-
 
556
        mov     [hdpos], eax
-
 
557
        cmp     ecx, 0x100
-
 
558
        jae     fs_OnHdAndBd.nf
-
 
559
        cmp     cl, [DRIVE_DATA+1+eax]
-
 
560
fs_OnHdAndBd:
-
 
561
        jbe     @f
-
 
562
.nf:
-
 
563
        call    free_hd_channel
-
 
564
        and     [hd1_status], 0
-
 
565
        mov     dword [image_of_eax], 5       ; not found
-
 
566
        ret
-
 
567
@@:
-
 
568
        mov     [known_part], ecx ;     mov     [fat32part], ecx
-
 
569
        push    ebx esi
-
 
570
        call    choice_necessity_partition_1
-
 
571
        pop     esi ebx
-
 
572
        mov     ecx, [ebx+12]
-
 
573
        mov     edx, [ebx+16]
-
 
574
    ;    add     edx, std_application_base_address
-
 
575
        mov     eax, [ebx]
-
 
576
        cmp     eax, fs_NumHdServices
-
 
577
        jae     .not_impl
-
 
578
        add     ebx, 4
-
 
579
        call    dword [fs_HdServices + eax*4]
-
 
580
        call    free_hd_channel
-
 
581
        and     [hd1_status], 0
-
 
582
        mov     [image_of_eax], eax
-
 
583
        mov     [image_of_ebx], ebx
-
 
584
        ret
-
 
585
.not_impl:
-
 
586
        call    free_hd_channel
-
 
587
        and     [hd1_status], 0
-
 
588
        mov     dword [image_of_eax], 2       ; not implemented
-
 
589
        ret
-
 
590
 
-
 
591
fs_HdServices:
-
 
592
        dd      fs_HdRead
-
 
593
        dd      fs_HdReadFolder
-
 
594
        dd      fs_HdRewrite
-
 
595
        dd      fs_HdWrite
-
 
596
        dd      fs_HdSetFileEnd
-
 
597
        dd      fs_HdGetFileInfo
-
 
598
        dd      fs_HdSetFileInfo
-
 
599
        dd      0
-
 
600
        dd      fs_HdDelete
-
 
601
        dd      fs_HdCreateFolder
-
 
602
fs_NumHdServices = ($ - fs_HdServices)/4
-
 
603
 
504
 
604
;*******************************************************
505
;*******************************************************
605
fs_OnCd0:
506
fs_OnCd0:
606
        call    reserve_cd
507
        call    reserve_cd
607
        mov     [ChannelNumber], 1
508
        mov     [ChannelNumber], 1
608
        mov     [DiskNumber], 0
509
        mov     [DiskNumber], 0
609
        push    6
510
        push    6
610
        push    1
511
        push    1
611
        jmp     fs_OnCd
512
        jmp     fs_OnCd
612
fs_OnCd1:
513
fs_OnCd1:
613
        call    reserve_cd
514
        call    reserve_cd
614
        mov     [ChannelNumber], 1
515
        mov     [ChannelNumber], 1
615
        mov     [DiskNumber], 1
516
        mov     [DiskNumber], 1
616
        push    4
517
        push    4
617
        push    2
518
        push    2
618
        jmp     fs_OnCd
519
        jmp     fs_OnCd
619
fs_OnCd2:
520
fs_OnCd2:
620
        call    reserve_cd
521
        call    reserve_cd
621
        mov     [ChannelNumber], 2
522
        mov     [ChannelNumber], 2
622
        mov     [DiskNumber], 0
523
        mov     [DiskNumber], 0
623
        push    2
524
        push    2
624
        push    3
525
        push    3
625
        jmp     fs_OnCd
526
        jmp     fs_OnCd
626
fs_OnCd3:
527
fs_OnCd3:
627
        call    reserve_cd
528
        call    reserve_cd
628
        mov     [ChannelNumber], 2
529
        mov     [ChannelNumber], 2
629
        mov     [DiskNumber], 1
530
        mov     [DiskNumber], 1
630
        push    0
531
        push    0
631
        push    4
532
        push    4
632
fs_OnCd:
533
fs_OnCd:
633
        call    reserve_cd_channel
534
        call    reserve_cd_channel
634
        pop     eax
535
        pop     eax
635
        mov     [cdpos], eax
536
        mov     [cdpos], eax
636
        pop     eax
537
        pop     eax
637
        cmp     ecx, 0x100
538
        cmp     ecx, 0x100
638
        jae     .nf
539
        jae     .nf
639
        push    ecx ebx
540
        push    ecx ebx
640
        mov     cl, al
541
        mov     cl, al
641
        mov     bl, [DRIVE_DATA+1]
542
        mov     bl, [DRIVE_DATA+1]
642
        shr     bl, cl
543
        shr     bl, cl
643
        test    bl, 2
544
        test    bl, 2
644
        pop     ebx ecx
545
        pop     ebx ecx
645
 
546
 
646
        jnz     @f
547
        jnz     @f
647
.nf:
548
.nf:
648
        call    free_cd_channel
549
        call    free_cd_channel
649
        and     [cd_status], 0
550
        and     [cd_status], 0
650
        mov     dword [image_of_eax], 5       ; not found
551
        mov     dword [image_of_eax], 5       ; not found
651
        ret
552
        ret
652
@@:
553
@@:
653
        mov     ecx, [ebx+12]
554
        mov     ecx, [ebx+12]
654
        mov     edx, [ebx+16]
555
        mov     edx, [ebx+16]
655
    ;    add     edx, std_application_base_address
556
    ;    add     edx, std_application_base_address
656
        mov     eax, [ebx]
557
        mov     eax, [ebx]
657
        cmp     eax, fs_NumCdServices
558
        cmp     eax, fs_NumCdServices
658
        jae     .not_impl
559
        jae     .not_impl
659
        add     ebx, 4
560
        add     ebx, 4
660
        call    dword [fs_CdServices + eax*4]
561
        call    dword [fs_CdServices + eax*4]
661
        call    free_cd_channel
562
        call    free_cd_channel
662
        and     [cd_status], 0
563
        and     [cd_status], 0
663
        mov     [image_of_eax], eax
564
        mov     [image_of_eax], eax
664
        mov     [image_of_ebx], ebx
565
        mov     [image_of_ebx], ebx
665
        ret
566
        ret
666
.not_impl:
567
.not_impl:
667
        call    free_cd_channel
568
        call    free_cd_channel
668
        and     [cd_status], 0
569
        and     [cd_status], 0
669
        mov     dword [image_of_eax], 2       ; not implemented
570
        mov     dword [image_of_eax], 2       ; not implemented
670
        ret
571
        ret
671
 
572
 
672
fs_CdServices:
573
fs_CdServices:
673
        dd      fs_CdRead
574
        dd      fs_CdRead
674
        dd      fs_CdReadFolder
575
        dd      fs_CdReadFolder
675
        dd      fs_NotImplemented
576
        dd      fs_NotImplemented
676
        dd      fs_NotImplemented
577
        dd      fs_NotImplemented
677
        dd      fs_NotImplemented
578
        dd      fs_NotImplemented
678
        dd      fs_CdGetFileInfo
579
        dd      fs_CdGetFileInfo
679
        dd      fs_NotImplemented
580
        dd      fs_NotImplemented
680
        dd      0
581
        dd      0
681
        dd      fs_NotImplemented
582
        dd      fs_NotImplemented
682
        dd      fs_NotImplemented
583
        dd      fs_NotImplemented
683
fs_NumCdServices = ($ - fs_CdServices)/4
584
fs_NumCdServices = ($ - fs_CdServices)/4
684
 
585
 
685
;*******************************************************
586
;*******************************************************
686
 
587
 
687
fs_HasRamdisk:
588
fs_HasRamdisk:
688
        mov     al, 1   ; we always have ramdisk
589
        mov     al, 1   ; we always have ramdisk
689
        ret
590
        ret
690
fs_HasFloppy:
591
fs_HasFloppy:
691
        cmp     byte [DRIVE_DATA], 0
592
        cmp     byte [DRIVE_DATA], 0
692
        setnz   al
593
        setnz   al
693
        ret
594
        ret
694
fs_HasHd0:
-
 
695
        test    byte [DRIVE_DATA+1], 01000000b
-
 
696
        setnz   al
-
 
697
        ret
-
 
698
fs_HasHd1:
-
 
699
        test    byte [DRIVE_DATA+1], 00010000b
-
 
700
        setnz   al
-
 
701
        ret
-
 
702
fs_HasHd2:
-
 
703
        test    byte [DRIVE_DATA+1], 00000100b
-
 
704
        setnz   al
-
 
705
        ret
-
 
706
fs_HasHd3:
-
 
707
        test    byte [DRIVE_DATA+1], 00000001b
-
 
708
        setnz   al
-
 
709
        ret
-
 
710
 
595
 
711
;*******************************************************
596
;*******************************************************
712
fs_HasCd0:
597
fs_HasCd0:
713
        test    byte [DRIVE_DATA+1], 10000000b
598
        test    byte [DRIVE_DATA+1], 10000000b
714
        setnz   al
599
        setnz   al
715
        ret
600
        ret
716
fs_HasCd1:
601
fs_HasCd1:
717
        test    byte [DRIVE_DATA+1], 00100000b
602
        test    byte [DRIVE_DATA+1], 00100000b
718
        setnz   al
603
        setnz   al
719
        ret
604
        ret
720
fs_HasCd2:
605
fs_HasCd2:
721
        test    byte [DRIVE_DATA+1], 00001000b
606
        test    byte [DRIVE_DATA+1], 00001000b
722
        setnz   al
607
        setnz   al
723
        ret
608
        ret
724
fs_HasCd3:
609
fs_HasCd3:
725
        test    byte [DRIVE_DATA+1], 00000010b
610
        test    byte [DRIVE_DATA+1], 00000010b
726
        setnz   al
611
        setnz   al
727
        ret
612
        ret
728
;*******************************************************
613
;*******************************************************
729
 
614
 
730
; fs_NextXXX functions:
615
; fs_NextXXX functions:
731
; in: eax = partition number, from which start to scan
616
; in: eax = partition number, from which start to scan
732
; out: CF=1 => no more partitions
617
; out: CF=1 => no more partitions
733
;      CF=0 => eax=next partition number
618
;      CF=0 => eax=next partition number
734
 
619
 
735
fs_NextRamdisk:
620
fs_NextRamdisk:
736
; we always have /rd/1
621
; we always have /rd/1
737
        test    eax, eax
622
        test    eax, eax
738
        stc
623
        stc
739
        jnz     @f
624
        jnz     @f
740
        mov     al, 1
625
        mov     al, 1
741
        clc
626
        clc
742
@@:
627
@@:
743
        ret
628
        ret
744
 
629
 
745
fs_NextFloppy:
630
fs_NextFloppy:
746
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
631
; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0)
747
        test    byte [DRIVE_DATA], 0xF0
632
        test    byte [DRIVE_DATA], 0xF0
748
        jz      .no1
633
        jz      .no1
749
        test    eax, eax
634
        test    eax, eax
750
        jnz     .no1
635
        jnz     .no1
751
        inc     eax
636
        inc     eax
752
        ret     ; CF cleared
637
        ret     ; CF cleared
753
.no1:
638
.no1:
754
        test    byte [DRIVE_DATA], 0x0F
639
        test    byte [DRIVE_DATA], 0x0F
755
        jz      .no2
640
        jz      .no2
756
        cmp     al, 2
641
        cmp     al, 2
757
        jae     .no2
642
        jae     .no2
758
        mov     al, 2
643
        mov     al, 2
759
        clc
644
        clc
760
        ret
645
        ret
761
.no2:
646
.no2:
762
        stc
647
        stc
763
        ret
648
        ret
764
 
-
 
765
; on hdx, we have partitions from 1 to [0x40002+x]
-
 
766
fs_NextHd0:
-
 
767
        push    0
-
 
768
        jmp     fs_NextHd
-
 
769
fs_NextHd1:
-
 
770
        push    1
-
 
771
        jmp     fs_NextHd
-
 
772
fs_NextHd2:
-
 
773
        push    2
-
 
774
        jmp     fs_NextHd
-
 
775
fs_NextHd3:
-
 
776
        push    3
-
 
777
fs_NextHd:
-
 
778
        pop     ecx
-
 
779
        movzx   ecx, byte [DRIVE_DATA+2+ecx]
-
 
780
        cmp     eax, ecx
-
 
781
        jae     fs_NextFloppy.no2
-
 
782
        inc     eax
-
 
783
        clc
-
 
784
        ret
-
 
785
 
649
 
786
;*******************************************************
650
;*******************************************************
787
fs_NextCd:
651
fs_NextCd:
788
; we always have /cdX/1
652
; we always have /cdX/1
789
        test    eax, eax
653
        test    eax, eax
790
        stc
654
        stc
791
        jnz     @f
655
        jnz     @f
792
        mov     al, 1
656
        mov     al, 1
793
        clc
657
        clc
794
@@:
658
@@:
795
        ret
659
        ret
796
;*******************************************************
660
;*******************************************************
797
 
-
 
798
; Additional FS handlers.
-
 
799
; This handler gets the control each time when fn 70 is called
-
 
800
; with unknown item of root subdirectory.
-
 
801
; in: esi -> name
-
 
802
;     ebp = 0 or rest of name relative to esi
-
 
803
; out: if the handler processes path, he must not return in file_system_lfn,
-
 
804
;      but instead pop return address and return directly to the caller
-
 
805
;      otherwise simply return
-
 
806
 
-
 
807
; here we test for /bd/... - BIOS disks
-
 
808
biosdisk_handler:
-
 
809
        cmp     [NumBiosDisks], 0
-
 
810
        jz      .ret
-
 
811
        mov     al, [esi]
-
 
812
        or      al, 20h
-
 
813
        cmp     al, 'b'
-
 
814
        jnz     .ret
-
 
815
        mov     al, [esi+1]
-
 
816
        or      al, 20h
-
 
817
        cmp     al, 'd'
-
 
818
        jnz     .ret
-
 
819
        push    esi
-
 
820
        inc     esi
-
 
821
        inc     esi
-
 
822
        cmp     byte [esi], '0'
-
 
823
        jb      .ret2
-
 
824
        cmp     byte [esi], '9'
-
 
825
        ja      .ret2
-
 
826
        xor     edx, edx
-
 
827
@@:
-
 
828
        lodsb
-
 
829
        test    al, al
-
 
830
        jz      .ok
-
 
831
        cmp     al, '/'
-
 
832
        jz      .ok
-
 
833
        sub     al, '0'
-
 
834
        cmp     al, 9
-
 
835
        ja      .ret2
-
 
836
        lea     edx, [edx*5]
-
 
837
        lea     edx, [edx*2+eax]
-
 
838
        jmp     @b
-
 
839
.ret2:
-
 
840
        pop     esi
-
 
841
.ret:
-
 
842
        ret
-
 
843
.ok:
-
 
844
        cmp     al, '/'
-
 
845
        jz      @f
-
 
846
        dec     esi
-
 
847
@@:
-
 
848
        add     dl, 80h
-
 
849
        xor     ecx, ecx
-
 
850
@@:
-
 
851
        cmp     dl, [BiosDisksData+ecx*4]
-
 
852
        jz      .ok2
-
 
853
        inc     ecx
-
 
854
        cmp     ecx, [NumBiosDisks]
-
 
855
        jb      @b
-
 
856
        jmp     .ret2
-
 
857
.ok2:
-
 
858
        add     esp, 8
-
 
859
        test    al, al
-
 
860
        jnz     @f
-
 
861
        mov     esi, fs_BdNext
-
 
862
        jmp     file_system_lfn.maindir_noesi
-
 
863
@@:
-
 
864
        push    ecx
-
 
865
        push    ecx
-
 
866
        push    biosdisk_cleanup
-
 
867
        push    fs_OnBd
-
 
868
        mov     edi, esp
-
 
869
        jmp     file_system_lfn.found2
-
 
870
 
-
 
871
fs_BdNext:
-
 
872
        cmp     eax, [BiosDiskPartitions+ecx*4]
-
 
873
        inc     eax
-
 
874
        cmc
-
 
875
biosdisk_cleanup:
-
 
876
        ret
-
 
877
 
-
 
878
fs_OnBd:
-
 
879
        pop     edx edx edx edx
-
 
880
; edx = disk number, ecx = partition number
-
 
881
; esi+ebp = name
-
 
882
        call    reserve_hd1
-
 
883
        add     edx, 0x80
-
 
884
        mov     [hdpos], edx
-
 
885
        cmp     ecx, [BiosDiskPartitions+(edx-0x80)*4]
-
 
886
        jmp     fs_OnHdAndBd
-
 
887
 
-
 
888
; This handler is called when virtual root is enumerated
-
 
889
; and must return all items which can be handled by this.
-
 
890
; It is called several times, first time with eax=0
-
 
891
; in: eax = 0 for first call, previously returned value for subsequent calls
-
 
892
; out: eax = 0 => no more items
-
 
893
;      eax != 0 => buffer pointed to by edi contains name of item
-
 
894
 
-
 
895
; here we enumerate existing BIOS disks /bd
-
 
896
biosdisk_enum_root:
-
 
897
        cmp     eax, [NumBiosDisks]
-
 
898
        jae     .end
-
 
899
        push    eax
-
 
900
        movzx   eax, byte [BiosDisksData+eax*4]
-
 
901
        sub     al, 80h
-
 
902
        push    eax
-
 
903
        mov     al, 'b'
-
 
904
        stosb
-
 
905
        mov     al, 'd'
-
 
906
        stosb
-
 
907
        pop     eax
-
 
908
        cmp     al, 10
-
 
909
        jae     .big
-
 
910
        add     al, '0'
-
 
911
        stosb
-
 
912
        mov     byte [edi], 0
-
 
913
        pop     eax
-
 
914
        inc     eax
-
 
915
        ret
-
 
916
.end:
-
 
917
        xor     eax, eax
-
 
918
        ret
-
 
919
.big:
-
 
920
        push    ecx edx
-
 
921
        push    -'0'
-
 
922
        mov     ecx, 10
-
 
923
@@:
-
 
924
        xor     edx, edx
-
 
925
        div     ecx
-
 
926
        push    edx
-
 
927
        test    eax, eax
-
 
928
        jnz     @b
-
 
929
        xchg    eax, edx
-
 
930
@@:
-
 
931
        pop     eax
-
 
932
        add     al, '0'
-
 
933
        stosb
-
 
934
        jnz     @b
-
 
935
        pop     edx ecx
-
 
936
        pop     eax
-
 
937
        inc     eax
-
 
938
        ret
661
 
939
;-----------------------------------------------------------------------------
662
;-----------------------------------------------------------------------------
940
process_replace_file_name:
663
process_replace_file_name:
941
; in
664
; in
942
; esi - path with filename(f.70)
665
; esi - path with filename(f.70)
943
;
666
;
944
; out
667
; out
945
; ebp - full filename
668
; ebp - full filename
946
        pushfd
669
        pushfd
947
        cli
670
        cli
948
        mov     ebp, [full_file_name_table]
671
        mov     ebp, [full_file_name_table]
949
        xor     edi, edi
672
        xor     edi, edi
950
.loop:
673
.loop:
951
        cmp     edi, [full_file_name_table.size]
674
        cmp     edi, [full_file_name_table.size]
952
        jae     .notfound
675
        jae     .notfound
953
        push    esi edi
676
        push    esi edi
954
        shl     edi, 7 ; edi*128
677
        shl     edi, 7 ; edi*128
955
        add     edi, ebp
678
        add     edi, ebp
956
@@:
679
@@:
957
        cmp     byte [edi], 0 ; end of dir_name
680
        cmp     byte [edi], 0 ; end of dir_name
958
        jz      .dest_done
681
        jz      .dest_done
959
        lodsb
682
        lodsb
960
        test    al, al
683
        test    al, al
961
        jz      .cont
684
        jz      .cont
962
        or      al, 20h ; 32 - space char
685
        or      al, 20h ; 32 - space char
963
        scasb
686
        scasb
964
        jz      @b
687
        jz      @b
965
        jmp     .cont
688
        jmp     .cont
966
.dest_done:
689
.dest_done:
967
        cmp     byte [esi], 0
690
        cmp     byte [esi], 0
968
        jz      .found
691
        jz      .found
969
        cmp     byte [esi], '/'
692
        cmp     byte [esi], '/'
970
        jnz     .cont
693
        jnz     .cont
971
        inc     esi
694
        inc     esi
972
        jmp     .found
695
        jmp     .found
973
.cont:
696
.cont:
974
        pop     edi esi
697
        pop     edi esi
975
        inc     edi
698
        inc     edi
976
        jmp     .loop
699
        jmp     .loop
977
.found:
700
.found:
978
        pop     edi eax
701
        pop     edi eax
979
        shl     edi, 7 ; edi*128
702
        shl     edi, 7 ; edi*128
980
        add     edi, ebp
703
        add     edi, ebp
981
        mov     ebp, esi
704
        mov     ebp, esi
982
        cmp     byte [esi], 0
705
        cmp     byte [esi], 0
983
        lea     esi, [edi+64]
706
        lea     esi, [edi+64]
984
        jnz     .ret
707
        jnz     .ret
985
.notfound:
708
.notfound:
986
        xor     ebp, ebp
709
        xor     ebp, ebp
987
.ret:
710
.ret:
988
        popfd
711
        popfd
989
        ret
712
        ret
990
;-----------------------------------------------------------------------------
713
;-----------------------------------------------------------------------------
991
uglobal
714
uglobal
992
lock_flag_for_f30_3 rb 1
715
lock_flag_for_f30_3 rb 1
993
endg
716
endg
994
 
717
        
995
sys_current_directory:
718
sys_current_directory:
996
;       mov     esi, [current_slot]
719
;       mov     esi, [current_slot]
997
;       mov     esi, [esi+APPDATA.cur_dir]
720
;       mov     esi, [esi+APPDATA.cur_dir]
998
;       mov     edx, esi
721
;       mov     edx, esi
999
 
722
 
1000
;get length string of appdata.cur_dir
723
;get length string of appdata.cur_dir
1001
        mov     eax, [current_slot]
724
        mov     eax, [current_slot]
1002
        mov     edi, [eax+APPDATA.cur_dir]
725
        mov     edi, [eax+APPDATA.cur_dir]
1003
 
726
 
1004
        dec     ebx
727
        dec     ebx
1005
        jz      .set
728
        jz      .set
1006
        dec     ebx
729
        dec     ebx
1007
        jz      .get
730
        jz      .get
1008
        dec     ebx
731
        dec     ebx
1009
        jz      .mount_additional_directory
732
        jz      .mount_additional_directory
1010
        ret
733
        ret
1011
 
734
 
1012
.mount_additional_directory:
735
.mount_additional_directory:
1013
; sysfunction 30.2: [for app] eax=30,ebx=3,ecx->dir name+dir path (128)
736
; sysfunction 30.2: [for app] eax=30,ebx=3,ecx->dir name+dir path (128)
1014
; for our code: nothing
737
; for our code: nothing
1015
 
738
 
1016
; check lock of the function
739
; check lock of the function
1017
        cmp     [lock_flag_for_f30_3], 1
740
        cmp     [lock_flag_for_f30_3], 1
1018
        je      @f
741
        je      @f
1019
        
742
        
1020
        mov     esi, ecx
743
        mov     esi, ecx
1021
        mov     edi, sysdir_name1
744
        mov     edi, sysdir_name1
1022
; copying fake directory name
745
; copying fake directory name
1023
        mov     ecx, 63
746
        mov     ecx, 63
1024
        pushfd
747
        pushfd
1025
        cli
748
        cli
1026
        cld
749
        cld
1027
        rep movsb
750
        rep movsb
1028
; terminator of name, in case if we get the inlet trash
751
; terminator of name, in case if we get the inlet trash
1029
        inc     esi
752
        inc     esi
1030
        xor     eax, eax
753
        xor     eax, eax
1031
        stosb
754
        stosb
1032
; copying real directory path for mounting
755
; copying real directory path for mounting
1033
        mov     ecx, 63
756
        mov     ecx, 63
1034
        rep movsb
757
        rep movsb
1035
; terminator of name, in case if we get the inlet trash
758
; terminator of name, in case if we get the inlet trash
1036
        xor     eax, eax
759
        xor     eax, eax
1037
        stosb
760
        stosb
1038
; increase the pointer of inputs for procedure "process_replace_file_name"        
761
; increase the pointer of inputs for procedure "process_replace_file_name"        
1039
        mov     [full_file_name_table.size], 2
762
        mov     [full_file_name_table.size], 2
1040
; block the ability to call f.30.3 because for one session is necessary
763
; block the ability to call f.30.3 because for one session is necessary
1041
; for us only once
764
; for us only once
1042
        mov     [lock_flag_for_f30_3], 1
765
        mov     [lock_flag_for_f30_3], 1
1043
        popfd
766
        popfd
1044
@@:
767
@@:
1045
        ret
768
        ret
1046
        
769
        
1047
.get:
770
.get:
1048
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
771
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
1049
; for our code: ebx->buffer,ecx=len
772
; for our code: ebx->buffer,ecx=len
1050
max_cur_dir     equ     0x1000
773
max_cur_dir     equ     0x1000
1051
 
774
 
1052
        mov     ebx, edi
775
        mov     ebx, edi
1053
 
776
 
1054
        push    ecx
777
        push    ecx
1055
        push    edi
778
        push    edi
1056
 
779
 
1057
        xor     eax, eax
780
        xor     eax, eax
1058
        mov     ecx, max_cur_dir
781
        mov     ecx, max_cur_dir
1059
 
782
 
1060
        repne scasb             ;find zerro at and string
783
        repne scasb             ;find zerro at and string
1061
        jnz     .error          ; no zero in cur_dir: internal error, should not happen
784
        jnz     .error          ; no zero in cur_dir: internal error, should not happen
1062
 
785
 
1063
        sub     edi, ebx        ;lenght for copy
786
        sub     edi, ebx        ;lenght for copy
1064
        inc     edi
787
        inc     edi
1065
        mov     [esp+32+8], edi ;return in eax
788
        mov     [esp+32+8], edi ;return in eax
1066
 
789
 
1067
        cmp     edx, edi
790
        cmp     edx, edi
1068
        jbe     @f
791
        jbe     @f
1069
        mov     edx, edi
792
        mov     edx, edi
1070
@@:
793
@@:
1071
;source string
794
;source string
1072
        pop     esi
795
        pop     esi
1073
;destination string
796
;destination string
1074
        pop     edi
797
        pop     edi
1075
        cmp     edx, 1
798
        cmp     edx, 1
1076
        jbe     .ret
799
        jbe     .ret
1077
 
800
 
1078
        mov     al, '/'         ;start string with '/'
801
        mov     al, '/'         ;start string with '/'
1079
        stosb
802
        stosb
1080
        mov     ecx, edx
803
        mov     ecx, edx
1081
        rep movsb               ;copy string
804
        rep movsb               ;copy string
1082
.ret:
805
.ret:
1083
        ret
806
        ret
1084
 
807
 
1085
.error:
808
.error:
1086
        add     esp, 8
809
        add     esp, 8
1087
        or      dword [esp+32], -1      ;error not found zerro at string ->[eax+APPDATA.cur_dir]
810
        or      dword [esp+32], -1      ;error not found zerro at string ->[eax+APPDATA.cur_dir]
1088
        ret
811
        ret
1089
.set:
812
.set:
1090
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
813
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
1091
; for our code: ebx->string to set
814
; for our code: ebx->string to set
1092
; use generic resolver with APPDATA.cur_dir as destination
815
; use generic resolver with APPDATA.cur_dir as destination
1093
        push    max_cur_dir     ;0x1000
816
        push    max_cur_dir     ;0x1000
1094
        push    edi     ;destination
817
        push    edi     ;destination
1095
        mov     ebx, ecx
818
        mov     ebx, ecx
1096
        call    get_full_file_name
819
        call    get_full_file_name
1097
        ret
820
        ret
1098
 
821
 
1099
; in: ebx = file name, [esp+4] = destination, [esp+8] = sizeof destination
822
; in: ebx = file name, [esp+4] = destination, [esp+8] = sizeof destination
1100
; destroys all registers except ebp,esp
823
; destroys all registers except ebp,esp
1101
get_full_file_name:
824
get_full_file_name:
1102
        push    ebp
825
        push    ebp
1103
        mov     esi, [current_slot]
826
        mov     esi, [current_slot]
1104
        mov     esi, [esi+APPDATA.cur_dir]
827
        mov     esi, [esi+APPDATA.cur_dir]
1105
        mov     edx, esi
828
        mov     edx, esi
1106
@@:
829
@@:
1107
        inc     esi
830
        inc     esi
1108
        cmp     byte [esi-1], 0
831
        cmp     byte [esi-1], 0
1109
        jnz     @b
832
        jnz     @b
1110
        dec     esi
833
        dec     esi
1111
        cmp     byte [ebx], '/'
834
        cmp     byte [ebx], '/'
1112
        jz      .set_absolute
835
        jz      .set_absolute
1113
; string gives relative path
836
; string gives relative path
1114
        mov     edi, [esp+8]    ; destination
837
        mov     edi, [esp+8]    ; destination
1115
.relative:
838
.relative:
1116
        cmp     byte [ebx], 0
839
        cmp     byte [ebx], 0
1117
        jz      .set_ok
840
        jz      .set_ok
1118
        cmp     word [ebx], '.'
841
        cmp     word [ebx], '.'
1119
        jz      .set_ok
842
        jz      .set_ok
1120
        cmp     word [ebx], './'
843
        cmp     word [ebx], './'
1121
        jnz     @f
844
        jnz     @f
1122
        add     ebx, 2
845
        add     ebx, 2
1123
        jmp     .relative
846
        jmp     .relative
1124
@@:
847
@@:
1125
        cmp     word [ebx], '..'
848
        cmp     word [ebx], '..'
1126
        jnz     .doset_relative
849
        jnz     .doset_relative
1127
        cmp     byte [ebx+2], 0
850
        cmp     byte [ebx+2], 0
1128
        jz      @f
851
        jz      @f
1129
        cmp     byte [ebx+2], '/'
852
        cmp     byte [ebx+2], '/'
1130
        jnz     .doset_relative
853
        jnz     .doset_relative
1131
@@:
854
@@:
1132
        dec     esi
855
        dec     esi
1133
        cmp     byte [esi], '/'
856
        cmp     byte [esi], '/'
1134
        jnz     @b
857
        jnz     @b
1135
        add     ebx, 3
858
        add     ebx, 3
1136
        jmp     .relative
859
        jmp     .relative
1137
.set_ok:
860
.set_ok:
1138
        cmp     edx, edi        ; is destination equal to APPDATA.cur_dir?
861
        cmp     edx, edi        ; is destination equal to APPDATA.cur_dir?
1139
        jz      .set_ok.cur_dir
862
        jz      .set_ok.cur_dir
1140
        sub     esi, edx
863
        sub     esi, edx
1141
        cmp     esi, [esp+12]
864
        cmp     esi, [esp+12]
1142
        jb      .set_ok.copy
865
        jb      .set_ok.copy
1143
.fail:
866
.fail:
1144
        mov     byte [edi], 0
867
        mov     byte [edi], 0
1145
        xor     eax, eax        ; fail
868
        xor     eax, eax        ; fail
1146
        pop     ebp
869
        pop     ebp
1147
        ret     8
870
        ret     8
1148
.set_ok.copy:
871
.set_ok.copy:
1149
        mov     ecx, esi
872
        mov     ecx, esi
1150
        mov     esi, edx
873
        mov     esi, edx
1151
        rep movsb
874
        rep movsb
1152
        mov     byte [edi], 0
875
        mov     byte [edi], 0
1153
.ret.ok:
876
.ret.ok:
1154
        mov     al, 1   ; ok
877
        mov     al, 1   ; ok
1155
        pop     ebp
878
        pop     ebp
1156
        ret     8
879
        ret     8
1157
.set_ok.cur_dir:
880
.set_ok.cur_dir:
1158
        mov     byte [esi], 0
881
        mov     byte [esi], 0
1159
        jmp     .ret.ok
882
        jmp     .ret.ok
1160
.doset_relative:
883
.doset_relative:
1161
        cmp     edx, edi
884
        cmp     edx, edi
1162
        jz      .doset_relative.cur_dir
885
        jz      .doset_relative.cur_dir
1163
        sub     esi, edx
886
        sub     esi, edx
1164
        cmp     esi, [esp+12]
887
        cmp     esi, [esp+12]
1165
        jae     .fail
888
        jae     .fail
1166
        mov     ecx, esi
889
        mov     ecx, esi
1167
        mov     esi, edx
890
        mov     esi, edx
1168
        mov     edx, edi
891
        mov     edx, edi
1169
        rep movsb
892
        rep movsb
1170
        jmp     .doset_relative.copy
893
        jmp     .doset_relative.copy
1171
.doset_relative.cur_dir:
894
.doset_relative.cur_dir:
1172
        mov     edi, esi
895
        mov     edi, esi
1173
.doset_relative.copy:
896
.doset_relative.copy:
1174
        add     edx, [esp+12]
897
        add     edx, [esp+12]
1175
        mov     byte [edi], '/'
898
        mov     byte [edi], '/'
1176
        inc     edi
899
        inc     edi
1177
        cmp     edi, edx
900
        cmp     edi, edx
1178
        jae     .overflow
901
        jae     .overflow
1179
@@:
902
@@:
1180
        mov     al, [ebx]
903
        mov     al, [ebx]
1181
        inc     ebx
904
        inc     ebx
1182
        stosb
905
        stosb
1183
        test    al, al
906
        test    al, al
1184
        jz      .ret.ok
907
        jz      .ret.ok
1185
        cmp     edi, edx
908
        cmp     edi, edx
1186
        jb      @b
909
        jb      @b
1187
.overflow:
910
.overflow:
1188
        dec     edi
911
        dec     edi
1189
        jmp     .fail
912
        jmp     .fail
1190
.set_absolute:
913
.set_absolute:
1191
        lea     esi, [ebx+1]
914
        lea     esi, [ebx+1]
1192
        call    process_replace_file_name
915
        call    process_replace_file_name
1193
        mov     edi, [esp+8]
916
        mov     edi, [esp+8]
1194
        mov     edx, [esp+12]
917
        mov     edx, [esp+12]
1195
        add     edx, edi
918
        add     edx, edi
1196
.set_copy:
919
.set_copy:
1197
        lodsb
920
        lodsb
1198
        stosb
921
        stosb
1199
        test    al, al
922
        test    al, al
1200
        jz      .set_part2
923
        jz      .set_part2
1201
.set_copy_cont:
924
.set_copy_cont:
1202
        cmp     edi, edx
925
        cmp     edi, edx
1203
        jb      .set_copy
926
        jb      .set_copy
1204
        jmp     .overflow
927
        jmp     .overflow
1205
.set_part2:
928
.set_part2:
1206
        mov     esi, ebp
929
        mov     esi, ebp
1207
        xor     ebp, ebp
930
        xor     ebp, ebp
1208
        test    esi, esi
931
        test    esi, esi
1209
        jz      .ret.ok
932
        jz      .ret.ok
1210
        mov     byte [edi-1], '/'
933
        mov     byte [edi-1], '/'
1211
        jmp     .set_copy_cont
934
        jmp     .set_copy_cont