Subversion Repositories Kolibri OS

Rev

Rev 3626 | Rev 3908 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

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