Subversion Repositories Kolibri OS

Rev

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

Rev 6462 Rev 6464
Line 3... Line 3...
3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
3
;; Copyright (C) KolibriOS team 2004-2016. All rights reserved. ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
4
;;  Distributed under terms of the GNU General Public License.  ;;
5
;;                                                              ;;
5
;;                                                              ;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
6
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Line 7... Line 7...
7
 
7
 
Line 8... Line 8...
8
$Revision: 6462 $
8
$Revision: 6464 $
9
 
9
 
10
ERROR_SUCCESS        = 0
10
ERROR_SUCCESS        = 0
11
ERROR_DISK_BASE      = 1
11
ERROR_DISK_BASE      = 1
Line 23... Line 23...
23
ERROR_OUT_OF_MEMORY  = 12
23
ERROR_OUT_OF_MEMORY  = 12
Line 24... Line 24...
24
 
24
 
25
image_of_eax EQU esp+32
25
image_of_eax EQU esp+32
Line 26... Line -...
26
image_of_ebx EQU esp+20
-
 
27
 
-
 
28
; System function 70 - files with long names (LFN)
-
 
29
; diamond, 2006
-
 
30
 
-
 
31
iglobal
-
 
32
; in this table names must be in lowercase
-
 
33
rootdirs:
-
 
34
;**********************************************
-
 
35
        db      3,'cd0'
-
 
36
        dd      fs_OnCd0
-
 
37
        dd      fs_NextCd
-
 
38
        db      3,'cd1'
-
 
39
        dd      fs_OnCd1
-
 
40
        dd      fs_NextCd
-
 
41
        db      3,'cd2'
-
 
42
        dd      fs_OnCd2
-
 
43
        dd      fs_NextCd
-
 
44
        db      3,'cd3'
-
 
45
        dd      fs_OnCd3
-
 
46
        dd      fs_NextCd
-
 
47
        db      3,'cd4'
-
 
48
        dd      fs_OnCd4
-
 
49
        dd      fs_NextCd
-
 
50
        db      3,'cd5'
-
 
51
        dd      fs_OnCd5
-
 
52
        dd      fs_NextCd
-
 
53
        db      3,'cd6'
-
 
54
        dd      fs_OnCd6
-
 
55
        dd      fs_NextCd
-
 
56
        db      3,'cd7'
-
 
57
        dd      fs_OnCd7
-
 
58
        dd      fs_NextCd
-
 
59
        db      3,'cd8'
-
 
60
        dd      fs_OnCd8
-
 
61
        dd      fs_NextCd
-
 
62
        db      3,'cd9'
-
 
63
        dd      fs_OnCd9
-
 
64
        dd      fs_NextCd
-
 
65
        db      4,'cd10'
-
 
66
        dd      fs_OnCd10
-
 
67
        dd      fs_NextCd
-
 
68
        db      4,'cd11'
-
 
69
        dd      fs_OnCd11
-
 
70
        dd      fs_NextCd
-
 
71
;***********************************************
-
 
72
        db      0
-
 
73
 
-
 
74
 
-
 
75
virtual_root_query:
-
 
76
;**********************************************
-
 
77
        dd      fs_HasCd0
-
 
78
        db      'cd0',0
-
 
79
        dd      fs_HasCd1
-
 
80
        db      'cd1',0
-
 
81
        dd      fs_HasCd2
-
 
82
        db      'cd2',0
-
 
83
        dd      fs_HasCd3
-
 
84
        db      'cd3',0
-
 
85
        dd      fs_HasCd4
-
 
86
        db      'cd4',0
-
 
87
        dd      fs_HasCd5
-
 
88
        db      'cd5',0
-
 
89
        dd      fs_HasCd6
-
 
90
        db      'cd6',0
-
 
91
        dd      fs_HasCd7
-
 
92
        db      'cd7',0
-
 
93
        dd      fs_HasCd8
-
 
94
        db      'cd8',0
-
 
95
        dd      fs_HasCd9
-
 
96
        db      'cd9',0
-
 
97
        dd      fs_HasCd10
-
 
98
        db      'cd10',0
-
 
99
        dd      fs_HasCd11
-
 
100
        db      'cd11',0
26
image_of_ebx EQU esp+20
101
;**********************************************
-
 
Line 102... Line 27...
102
        dd      0
27
 
103
endg
28
; System function 70
104
 
29
 
105
file_system_lfn_protected:
30
file_system_lfn_protected:
Line 111... Line 36...
111
        mov     [image_of_eax], eax
36
        mov     [image_of_eax], eax
112
        mov     [image_of_ebx], ebx
37
        mov     [image_of_ebx], ebx
113
        ret
38
        ret
Line 114... Line 39...
114
 
39
 
115
file_system_lfn:
40
file_system_lfn:
116
; in: ebx->fileinfo block
41
; in: ebx -> parameter structure
117
; operation codes:
42
;   operation codes:
118
; 0 : read file
43
; 0 = read file
119
; 1 : read folder
44
; 1 = read folder
120
; 2 : create/rewrite file
45
; 2 = create/rewrite file
121
; 3 : write/append to file
46
; 3 = write/append to file
122
; 4 : set end of file
47
; 4 = set file end
123
; 5 : get file/directory attributes structure
48
; 5 = get file info
124
; 6 : set file/directory attributes structure
49
; 6 = set file info
125
; 7 : start application
50
; start application
126
; 8 : delete file
51
; 8 = delete file/folder
127
; 9 : create directory
-
 
128
 
-
 
129
; parse file name
52
; 9 = create folder
130
        lea     esi, [ebx+20]
53
        lea     esi, [ebx+20]
131
        lodsb
54
        lodsb
132
        test    al, al
55
        test    al, al
133
        jnz     @f
56
        jnz     @f
134
        mov     esi, [esi]
57
        mov     esi, [esi]
135
        lodsb
58
        lodsb
136
@@:
59
@@:
137
        lea     ebp, [esi-1]
60
        lea     ebp, [esi-1]
138
if 0
61
if 0
139
        cmp     [ebx], dword 0
62
        cmp     [ebx], dword 0
140
        jne     @F
63
        jne     .1
141
        DEBUGF 1,'read file %s\n',ebp
64
        DEBUGF 1,'read file %s\n',ebp
142
        jmp     .1
65
        jmp     @f
143
@@:
66
.1:
144
        cmp     [ebx], dword 5
67
        cmp     [ebx], dword 5
145
        jne     @F
68
        jne     @f
146
        DEBUGF 1,'get file attributes %s\n',ebp
69
        DEBUGF 1,'get file attributes %s\n',ebp
147
@@:
-
 
148
.1:
70
@@:
149
end if
-
 
150
 
71
end if
151
        cmp     dword [ebx], 7
72
        cmp     dword[ebx], 7   ; start application
152
        jne     @F
73
        jne     @f
153
        mov     edx, [ebx+4]
74
        mov     edx, [ebx+4]
154
        mov     ebx, [ebx+8]
75
        mov     ebx, [ebx+8]
155
        call    fs_execute; ebp, ebx, edx
76
        call    fs_execute      ; ebp, ebx, edx
156
        mov     [image_of_eax], eax
77
        mov     [image_of_eax], eax
-
 
78
        ret
157
        ret
79
 
158
@@:
80
@@:
159
        cmp     al, '/'
81
        cmp     al, '/'
160
        jz      .notcurdir
82
        jz      .notcurdir
161
        dec     esi
83
        dec     esi
Line 165... Line 87...
165
        xor     ebp, ebp
87
        xor     ebp, ebp
166
@@:
88
@@:
167
        mov     esi, [current_slot]
89
        mov     esi, [current_slot]
168
        mov     esi, [esi+APPDATA.cur_dir]
90
        mov     esi, [esi+APPDATA.cur_dir]
169
        jmp     .parse_normal
91
        jmp     .parse_normal
-
 
92
 
170
.notcurdir:
93
.notcurdir:
171
        cmp     byte [esi], 0
94
        cmp     byte [esi], 0
172
        jz      .rootdir
95
        jz      .rootdir
173
        call    process_replace_file_name
96
        call    process_replace_file_name
174
.parse_normal:
97
.parse_normal:
175
        mov     edi, rootdirs-8
98
        mov     ax, [esi]
176
        xor     ecx, ecx
99
        or      ax, 2020h
177
        push    esi
100
        cmp     ax, 'cd'
178
.scan1:
-
 
179
        pop     esi
101
        jz      .CD
180
        add     edi, ecx
102
        call    dyndisk_handler ; not returns if success
181
        scasd
-
 
182
        scasd
103
.notfound:
183
        mov     cl, byte [edi]
104
        mov     dword[image_of_eax], ERROR_FILE_NOT_FOUND
184
        test    cl, cl
105
        ret
-
 
106
 
185
        jz      .notfound_try
107
.CD:
186
        inc     edi
108
        add     esi, 2
187
        push    esi
109
        xor     eax, eax
188
@@:
-
 
189
        lodsb
110
        lodsb       ; disk number
190
        or      al, 20h
111
        sub     eax, '0'
191
        scasb
112
        cmp     eax, 10
192
        loopz   @b
113
        jnc     .notfound
193
        jnz     .scan1
114
        mov     edi, eax
194
        lodsb
115
        lodsb
-
 
116
        test    eax, eax
-
 
117
        jz      .maindir
195
        cmp     al, '/'
118
        cmp     al, '/'
196
        jz      .found1
119
        jnz     .notfound
-
 
120
        lodsb       ; partition number
197
        test    al, al
121
        test    eax, eax
-
 
122
        jz      .maindir
-
 
123
        cmp     al, '1'
-
 
124
        jnz     .notfound
-
 
125
        cmp     byte [esi], '/'
-
 
126
        jnz     @f
-
 
127
        inc     esi
-
 
128
@@:
-
 
129
        cmp     byte [esi], 0
198
        jnz     .scan1
130
        jnz     @f
-
 
131
        test    ebp, ebp
-
 
132
        jz      @f
-
 
133
        mov     esi, ebp
-
 
134
        xor     ebp, ebp
-
 
135
@@:
-
 
136
        call    reserve_cd
-
 
137
        mov     eax, edi
-
 
138
        bt      eax, 0
-
 
139
        setc    [DiskNumber]
-
 
140
        bt      eax, 1
-
 
141
        setc    [ChannelNumber]
-
 
142
        inc     [ChannelNumber]
199
        pop     eax
143
        inc     eax
-
 
144
        mov     [cdpos], eax
-
 
145
        call    reserve_cd_channel
-
 
146
        mov     eax, edi
200
; directory /xxx
147
        not     eax
-
 
148
        and     eax, 3
-
 
149
        shl     eax, 1
-
 
150
        inc     eax
-
 
151
        shr     edi, 2
-
 
152
        mov     dword[image_of_eax], ERROR_FILE_NOT_FOUND
-
 
153
        bt      [edi*5+DRIVE_DATA+1], ax
-
 
154
        jnc     @f
-
 
155
        mov     ecx, [ebx+12]
-
 
156
        mov     edx, [ebx+16]
-
 
157
        mov     eax, [ebx]
-
 
158
        mov     dword[image_of_eax], ERROR_UNSUPPORTED_FS
-
 
159
        cmp     eax, fs_NumCdServices
-
 
160
        jae     @f
-
 
161
        add     ebx, 4
-
 
162
        call    dword[fs_CdServices + eax*4]
-
 
163
        call    free_cd_channel
-
 
164
        and     [cd_status], 0
-
 
165
        mov     [image_of_eax], eax
-
 
166
        mov     [image_of_ebx], ebx
-
 
167
        ret
-
 
168
 
-
 
169
@@:
-
 
170
        call    free_cd_channel
-
 
171
        and     [cd_status], 0
-
 
172
        ret
-
 
173
 
201
.maindir:
174
.nextCD:
-
 
175
        test    eax, eax    ; partition number
-
 
176
        stc
-
 
177
        jnz     @f      ; no more partitions
202
        mov     esi, [edi+4]
178
        mov     al, 1   ; /cdX/1
-
 
179
        clc
-
 
180
@@:
-
 
181
        ret
-
 
182
 
203
.maindir_noesi:
183
.maindir:   ; list partitions
-
 
184
        mov     esi, .nextCD
-
 
185
.maindir_noesi:     ; backjump from dyndisk_handler
204
        cmp     dword [ebx], 1
186
        cmp     dword[ebx], 1
205
        jnz     .access_denied
187
        jnz     .access_denied  ; read folder?
206
        xor     eax, eax
188
        push    ecx
207
        mov     ebp, [ebx+12] ;the number of blocks to read
189
        mov     ebp, [ebx+12]   ; the number of blocks to read
208
        mov     edx, [ebx+16] ;where to write the result
190
        mov     edx, [ebx+16]   ; where to write the result
209
    ;    add     edx, std_application_base_address
-
 
210
        push    dword [ebx+4]   ; first block
191
        push    dword[ebx+4]    ; first block
211
        mov     ebx, [ebx+8]    ; flags
192
        mov     ebx, [ebx+8]    ; flags
212
; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
-
 
213
        mov     edi, edx
-
 
214
        push    ecx
-
 
215
        mov     ecx, 32/4
193
        mov     ecx, 32/4
-
 
194
        mov     edi, edx
-
 
195
        xor     eax, eax
216
        rep stosd
196
        rep stosd
217
        pop     ecx
-
 
218
        mov     byte [edx], 1   ; version
197
        mov     byte [edx], 1   ; version
219
.maindir_loop:
198
.maindir_loop:
220
        call    esi
199
        call    esi
221
        jc      .maindir_done
200
        jc      .maindir_done
222
        inc     dword [edx+8]
201
        inc     dword[edx+8]
223
        dec     dword [esp]
202
        dec     dword[esp]
224
        jns     .maindir_loop
203
        jns     .maindir_loop
225
        dec     ebp
204
        dec     ebp
226
        js      .maindir_loop
205
        js      .maindir_loop
227
        inc     dword [edx+4]
206
        inc     dword[edx+4]
228
        mov     dword [edi], 0x10       ; attributes: folder
207
        mov     dword[edi], 16      ; attributes: folder
229
        mov     dword [edi+4], 1        ; name type: UNICODE
208
        mov     dword[edi+4], ebx   ; name encoding
230
        push    eax
209
        push    eax
231
        xor     eax, eax
210
        mov     ecx, 32/4
232
        add     edi, 8
211
        add     edi, 8
233
        push    ecx
-
 
234
        mov     ecx, 40/4-2
212
        xor     eax, eax
235
        rep stosd
213
        rep stosd
236
        pop     ecx
-
 
237
        pop     eax
214
        pop     eax
238
        push    eax edx
215
        push    eax edx edi
239
; convert number in eax to decimal UNICODE string
216
; convert number in eax to decimal string
240
        push    edi
-
 
241
        push    ecx
-
 
242
        push    -'0'
217
        push    -'0'
243
        mov     ecx, 10
218
        mov     ecx, 10
244
@@:
219
@@:
245
        xor     edx, edx
220
        xor     edx, edx
246
        div     ecx
221
        div     ecx
247
        push    edx
222
        push    edx
248
        test    eax, eax
223
        test    eax, eax
249
        jnz     @b
224
        jnz     @b
-
 
225
        cmp     ebx, 1
-
 
226
        jz      .uni
250
@@:
227
@@:
251
        pop     eax
228
        pop     eax
252
        add     al, '0'
229
        add     eax, '0'
253
        stosb
230
        stosb
254
        test    bl, 1           ; UNICODE name?
-
 
255
        jz      .ansi2
-
 
256
        mov     byte [edi], 0
-
 
257
        inc     edi
-
 
258
.ansi2:
-
 
259
        test    al, al
231
        test    eax, eax
260
        jnz     @b
232
        jnz     @b
261
        mov     byte [edi-1], 0
233
        pop     edi edx eax
-
 
234
        add     edi, 264
-
 
235
        jmp     .maindir_loop
-
 
236
 
-
 
237
.uni:
262
        pop     ecx
238
        pop     eax
-
 
239
        add     eax, '0'
-
 
240
        stosw
-
 
241
        test    eax, eax
263
        pop     edi
242
        jnz     .uni
264
; UNICODE name length is 520 bytes, ANSI - 264
243
        pop     edi edx eax
265
        add     edi, 520
244
        add     edi, 520
266
        test    bl, 1
-
 
267
        jnz     @f
-
 
268
        sub     edi, 520-264
-
 
269
@@:
-
 
270
        pop     edx eax
-
 
271
        jmp     .maindir_loop
245
        jmp     .maindir_loop
-
 
246
 
272
.maindir_done:
247
.maindir_done:
273
        pop     eax
248
        pop     eax eax
274
        mov     ebx, [edx+4]
249
        mov     ebx, [edx+4]
275
        xor     eax, eax
250
        xor     eax, eax
276
        dec     ebp
251
        dec     ebp
277
        js      @f
252
        js      @f
278
        mov     al, ERROR_END_OF_FILE
253
        mov     al, ERROR_END_OF_FILE
279
@@:
254
@@:
280
        mov     [image_of_eax], eax
255
        mov     [image_of_eax], eax
281
        mov     [image_of_ebx], ebx
256
        mov     [image_of_ebx], ebx
282
        ret
257
        ret
283
; directory /
-
 
284
.rootdir:
258
 
285
        cmp     dword [ebx], 1  ; read folder?
-
 
286
        jz      .readroot
-
 
287
.access_denied:
259
.access_denied:
288
        mov     dword [image_of_eax], 10      ; access denied
260
        mov     dword[image_of_eax], ERROR_ACCESS_DENIED
289
        ret
261
        ret
Line 290... Line 262...
290
 
262
 
291
.readroot:
263
.rootdir:   ; / - virtual root folder
292
; virtual root folder - special handler
264
        cmp     dword[ebx], 1   ; read folder?
293
        mov     ebp, [ebx+12]
265
        jnz     .access_denied
294
        mov     edx, [ebx+16]
266
        mov     ebp, [ebx+12]   ; number of blocks
295
    ;    add     edx, std_application_base_address
267
        mov     edx, [ebx+16]   ; return area
296
        push    dword [ebx+4]   ; first block
268
        push    dword[ebx+4]    ; first block
297
        mov     ebx, [ebx+8]    ; flags
-
 
298
        xor     eax, eax
-
 
299
; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
-
 
300
        mov     edi, edx
269
        mov     ebx, [ebx+8]    ; flags
-
 
270
        mov     ecx, 32/4
-
 
271
        mov     edi, edx
301
        mov     ecx, 32/4
272
        xor     eax, eax
302
        rep stosd
273
        rep stosd
303
        mov     byte [edx], 1   ; version
274
        mov     byte [edx], 1   ; version
304
        sub     esp, 16
275
        sub     esp, 16
305
.readroot_ah_loop2:
276
.rootdir_loop:
306
        push    edi
277
        push    edi
307
        lea     edi, [esp+4]
278
        lea     edi, [esp+4]
308
        call    dyndisk_enum_root
279
        call    dyndisk_enum_root
309
        pop     edi
280
        pop     edi
310
        test    eax, eax
281
        test    eax, eax
311
        jz      .readroot_done_dynamic
282
        jz      .rootdirCD
312
        inc     dword [edx+8]
283
        inc     dword[edx+8]
313
        dec     dword [esp+16]
284
        dec     dword[esp+16]
314
        jns     .readroot_ah_loop2
285
        jns     .rootdir_loop
315
        dec     ebp
286
        dec     ebp
316
        js      .readroot_ah_loop2
-
 
317
        push    eax
-
 
318
        xor     eax, eax
287
        js      .rootdir_loop
319
        inc     dword [edx+4]
288
        inc     dword[edx+4]
320
        mov     dword [edi], 0x10       ; attributes: folder
289
        mov     dword[edi], 16      ; attributes: folder
-
 
290
        mov     dword[edi+4], ebx   ; name encoding
-
 
291
        push    eax
321
        mov     dword [edi+4], ebx
292
        mov     ecx, 32/4
322
        add     edi, 8
293
        add     edi, 8
323
        mov     ecx, 40/4-2
294
        xor     eax, eax
324
        rep stosd
295
        rep stosd
325
        push    esi edi
296
        push    esi edi
-
 
297
        lea     esi, [esp+12]
-
 
298
        cmp     ebx, 1
326
        lea     esi, [esp+12]
299
        jz      .uni2
327
@@:
300
@@:
328
        lodsb
301
        lodsb
329
        stosb
-
 
330
        test    bl, 1
-
 
331
        jz      .ansi3
-
 
332
        mov     byte [edi], 0
-
 
333
        inc     edi
-
 
334
.ansi3:
302
        stosb
335
        test    al, al
303
        test    eax, eax
336
        jnz     @b
304
        jnz     @b
-
 
305
        pop     edi esi eax
-
 
306
        add     edi, 264
-
 
307
        jmp     .rootdir_loop
-
 
308
 
-
 
309
.uni2:
-
 
310
        lodsb
-
 
311
        stosw
-
 
312
        test    eax, eax
-
 
313
        jnz     .uni2
337
        pop     edi esi eax
314
        pop     edi esi eax
338
        add     edi, 520
-
 
339
        test    bl, 1
-
 
340
        jnz     .readroot_ah_loop2
-
 
341
        sub     edi, 520-264
315
        add     edi, 520
-
 
316
        jmp     .rootdir_loop
342
        jmp     .readroot_ah_loop2
317
 
343
.readroot_done_dynamic:
318
.rootdirCD:
344
        add     esp, 16
319
        add     esp, 16
345
        mov     esi, virtual_root_query
320
        or      esi, -1
346
.readroot_loop:
321
.rootdirCD_loop:
347
        cmp     dword [esi], eax
322
        inc     esi
348
        jz      .readroot_done
323
        cmp     esi, 10
349
        call    dword [esi]
324
        jnc     .rootdir_done
350
        add     esi, 4
325
        mov     eax, esi
351
        test    eax, eax
326
        not     eax
352
        jnz     @f
-
 
353
.readroot_next:
327
        and     eax, 3
354
        or      ecx, -1
328
        shl     eax, 1
355
        xchg    esi, edi
329
        inc     eax
356
        repnz scasb
330
        mov     ecx, esi
357
        xchg    esi, edi
331
        shr     ecx, 2
358
        jmp     .readroot_loop
-
 
359
@@:
332
        bt      [ecx*5+DRIVE_DATA+1], ax
360
        xor     eax, eax
333
        jnc     .rootdirCD_loop
361
        inc     dword [edx+8]
334
        inc     dword[edx+8]
362
        dec     dword [esp]
335
        dec     dword[esp]
363
        jns     .readroot_next
336
        jns     .rootdirCD_loop
364
        dec     ebp
337
        dec     ebp
365
        js      .readroot_next
338
        js      .rootdirCD_loop
366
        inc     dword [edx+4]
339
        inc     dword[edx+4]
367
        mov     dword [edi], 0x10       ; attributes: folder
340
        mov     dword[edi], 16      ; attributes: folder
-
 
341
        mov     dword[edi+4], ebx   ; name encoding
368
        mov     dword [edi+4], ebx      ; name type: UNICODE
342
        mov     ecx, 32/4
369
        add     edi, 8
343
        add     edi, 8
370
        mov     ecx, 40/4-2
344
        xor     eax, eax
-
 
345
        rep stosd
-
 
346
        mov     eax, esi
-
 
347
        add     eax, '0'
371
        rep stosd
348
        cmp     ebx, 1
-
 
349
        jz      @f
-
 
350
        mov     word [edi], 'cd'
-
 
351
        mov     [edi+2], ax
-
 
352
        add     edi, 264
-
 
353
        jmp     .rootdirCD_loop
372
        push    edi
354
 
373
@@:
-
 
374
        lodsb
-
 
375
        stosb
-
 
376
        test    bl, 1
-
 
377
        jz      .ansi
355
@@:
378
        mov     byte [edi], 0
-
 
379
        inc     edi
-
 
380
.ansi:
356
        mov     dword[edi], 640063h
381
        test    eax, eax
-
 
382
        jnz     @b
-
 
383
        pop     edi
357
        mov     [edi+4], eax
384
        add     edi, 520
-
 
385
        test    bl, 1
-
 
386
        jnz     .readroot_loop
-
 
387
        sub     edi, 520-264
358
        add     edi, 520
-
 
359
        jmp     .rootdirCD_loop
388
        jmp     .readroot_loop
360
 
389
.readroot_done:
361
.rootdir_done:
390
        pop     eax
362
        pop     eax
391
        mov     ebx, [edx+4]
363
        mov     ebx, [edx+4]
392
        xor     eax, eax
364
        xor     eax, eax
393
        dec     ebp
365
        dec     ebp
394
        js      @f
366
        js      @f
395
        mov     al, ERROR_END_OF_FILE
367
        mov     al, ERROR_END_OF_FILE
396
@@:
368
@@:
397
        mov     [image_of_eax], eax
369
        mov     [image_of_eax], eax
398
        mov     [image_of_ebx], ebx
370
        mov     [image_of_ebx], ebx
399
        ret
-
 
400
.notfound_try:
-
 
401
        call    dyndisk_handler
-
 
402
.notfound:
-
 
403
        mov     dword [image_of_eax], ERROR_FILE_NOT_FOUND
-
 
404
        and     dword [image_of_ebx], 0
-
 
405
        ret
-
 
406
 
-
 
407
.notfounda:
-
 
408
        cmp     edi, esp
-
 
409
        jnz     .notfound
-
 
410
        call    dword [edi+4]
-
 
411
        add     esp, 16
-
 
412
        jmp     .notfound
-
 
413
 
-
 
414
.found1:
-
 
415
        pop     eax
-
 
416
        cmp     byte [esi], 0
-
 
417
        jz      .maindir
-
 
418
.found2:
-
 
419
; read partition number
-
 
420
        xor     ecx, ecx
-
 
421
        xor     eax, eax
-
 
422
@@:
-
 
423
        lodsb
-
 
424
        cmp     al, '/'
-
 
425
        jz      .done1
-
 
426
        test    al, al
-
 
427
        jz      .done1
-
 
428
        sub     al, '0'
-
 
429
        cmp     al, 9
-
 
430
        ja      .notfounda
-
 
431
        lea     ecx, [ecx*5]
-
 
432
        lea     ecx, [ecx*2+eax]
-
 
433
        jmp     @b
-
 
434
.done1:
-
 
435
        jecxz   .notfounda
-
 
436
        test    al, al
-
 
437
        jnz     @f
-
 
438
        dec     esi
-
 
439
@@:
-
 
440
        cmp     byte [esi], 0
-
 
441
        jnz     @f
-
 
442
        test    ebp, ebp
-
 
443
        jz      @f
-
 
444
        mov     esi, ebp
-
 
445
        xor     ebp, ebp
-
 
446
@@:
-
 
447
; now [edi] contains handler address, ecx - partition number,
-
 
448
; esi points to ASCIIZ string - rest of name
-
 
449
        jmp     dword [edi]
-
 
450
 
-
 
451
; handlers for devices
-
 
452
; in: ecx = 0 => query virtual directory /xxx
-
 
453
; in: ecx = partition number
-
 
454
;     esi -> relative (for device) name
-
 
455
;     ebx -> fileinfo
-
 
456
;     ebp = 0 or pointer to rest of name from folder addressed by esi
-
 
Line 457... Line 371...
457
; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx
371
        ret
458
 
372
 
459
fs_NotImplemented:
373
fs_NotImplemented:
460
        mov     eax, 2
-
 
461
        ret
-
 
462
;-----------------------------------------------------------------------------
-
 
463
fs_OnCd0:
-
 
464
        call    reserve_cd
-
 
465
        mov     [ChannelNumber], 1
-
 
466
        mov     [DiskNumber], 0
-
 
467
        push    6
-
 
468
        push    1
-
 
469
        jmp     fs_OnCd
-
 
470
;-----------------------------------------------------------------------------
-
 
471
fs_OnCd1:
-
 
472
        call    reserve_cd
-
 
473
        mov     [ChannelNumber], 1
-
 
474
        mov     [DiskNumber], 1
-
 
475
        push    4
-
 
476
        push    2
-
 
477
        jmp     fs_OnCd
-
 
478
;-----------------------------------------------------------------------------
-
 
479
fs_OnCd2:
-
 
480
        call    reserve_cd
-
 
481
        mov     [ChannelNumber], 2
-
 
482
        mov     [DiskNumber], 0
-
 
483
        push    2
-
 
484
        push    3
-
 
485
        jmp     fs_OnCd
-
 
486
;-----------------------------------------------------------------------------
-
 
487
fs_OnCd3:
-
 
488
        call    reserve_cd
-
 
489
        mov     [ChannelNumber], 2
-
 
490
        mov     [DiskNumber], 1
-
 
491
        push    0
-
 
492
        push    4
-
 
493
        jmp     fs_OnCd
-
 
494
;-----------------------------------------------------------------------------
-
 
495
fs_OnCd4:
-
 
496
        call    reserve_cd
-
 
497
        mov     [ChannelNumber], 1
-
 
498
        mov     [DiskNumber], 0
-
 
499
        push    6
-
 
500
        push    5
-
 
501
        jmp     fs_OnCd
-
 
502
;-----------------------------------------------------------------------------
-
 
503
fs_OnCd5:
-
 
504
        call    reserve_cd
-
 
505
        mov     [ChannelNumber], 1
-
 
506
        mov     [DiskNumber], 1
-
 
507
        push    4
-
 
508
        push    6
-
 
509
        jmp     fs_OnCd
-
 
510
;-----------------------------------------------------------------------------
-
 
511
fs_OnCd6:
-
 
512
        call    reserve_cd
-
 
513
        mov     [ChannelNumber], 2
-
 
514
        mov     [DiskNumber], 0
-
 
515
        push    2
-
 
516
        push    7
-
 
517
        jmp     fs_OnCd
-
 
518
;-----------------------------------------------------------------------------
-
 
519
fs_OnCd7:
-
 
520
        call    reserve_cd
-
 
521
        mov     [ChannelNumber], 2
-
 
522
        mov     [DiskNumber], 1
-
 
523
        push    0
-
 
524
        push    8
-
 
525
        jmp     fs_OnCd
-
 
526
;-----------------------------------------------------------------------------
-
 
527
fs_OnCd8:
-
 
528
        call    reserve_cd
-
 
529
        mov     [ChannelNumber], 1
-
 
530
        mov     [DiskNumber], 0
-
 
531
        push    6
-
 
532
        push    9
-
 
533
        jmp     fs_OnCd
-
 
534
;-----------------------------------------------------------------------------
-
 
535
fs_OnCd9:
-
 
536
        call    reserve_cd
-
 
537
        mov     [ChannelNumber], 1
-
 
538
        mov     [DiskNumber], 1
-
 
539
        push    4
-
 
540
        push    10
-
 
541
        jmp     fs_OnCd
-
 
542
;-----------------------------------------------------------------------------
-
 
543
fs_OnCd10:
-
 
544
        call    reserve_cd
-
 
545
        mov     [ChannelNumber], 2
-
 
546
        mov     [DiskNumber], 0
-
 
547
        push    2
-
 
548
        push    11
-
 
549
        jmp     fs_OnCd
-
 
550
;-----------------------------------------------------------------------------
-
 
551
fs_OnCd11:
-
 
552
        call    reserve_cd
-
 
553
        mov     [ChannelNumber], 2
-
 
554
        mov     [DiskNumber], 1
-
 
555
        push    0
-
 
556
        push    12
-
 
557
;-----------------------------------------------------------------------------
-
 
558
fs_OnCd:
-
 
559
        pop     eax
-
 
560
        mov     [cdpos], eax
-
 
561
        call    reserve_cd_channel
-
 
562
        pop     eax
-
 
563
        cmp     ecx, 0x100
-
 
564
        jae     .nf
-
 
565
        push    ecx ebx
-
 
566
        mov     cl, al
-
 
567
 
-
 
568
        push    eax
-
 
569
        mov     eax, [cdpos]
-
 
570
        dec     eax
-
 
571
        shr     eax, 2
-
 
572
        lea     eax, [eax*5]
-
 
573
        mov     bl, [eax+DRIVE_DATA+1]
-
 
574
        pop     eax
-
 
575
 
-
 
576
        shr     bl, cl
-
 
Line 577... Line -...
577
        test    bl, 2
-
 
578
        pop     ebx ecx
-
 
579
 
-
 
580
        jnz     @f
-
 
581
.nf:
-
 
582
        call    free_cd_channel
-
 
583
        and     [cd_status], 0
-
 
584
        mov     dword [image_of_eax], 5       ; not found
-
 
585
        ret
-
 
586
@@:
-
 
587
        mov     ecx, [ebx+12]
-
 
588
        mov     edx, [ebx+16]
-
 
589
    ;    add     edx, std_application_base_address
-
 
590
        mov     eax, [ebx]
-
 
591
        cmp     eax, fs_NumCdServices
-
 
592
        jae     .not_impl
-
 
593
        add     ebx, 4
-
 
594
        call    dword [fs_CdServices + eax*4]
-
 
595
        call    free_cd_channel
-
 
596
        and     [cd_status], 0
-
 
597
        mov     [image_of_eax], eax
-
 
598
        mov     [image_of_ebx], ebx
-
 
599
        ret
-
 
600
.not_impl:
-
 
601
        call    free_cd_channel
-
 
602
        and     [cd_status], 0
374
        mov     eax, 2
603
        mov     dword [image_of_eax], 2       ; not implemented
375
        ret
604
        ret
376
 
605
;-----------------------------------------------------------------------------
377
;-----------------------------------------------------------------------------
606
fs_CdServices:
378
fs_CdServices:
Line 614... Line 386...
614
        dd      0
386
        dd      0
615
        dd      fs_NotImplemented
387
        dd      fs_NotImplemented
616
        dd      fs_NotImplemented
388
        dd      fs_NotImplemented
617
fs_NumCdServices = ($ - fs_CdServices)/4
389
fs_NumCdServices = ($ - fs_CdServices)/4
618
;-----------------------------------------------------------------------------
390
;-----------------------------------------------------------------------------
619
fs_HasCd0:
-
 
620
        test    byte [DRIVE_DATA+1], 10000000b
-
 
621
        setnz   al
-
 
622
        ret
-
 
623
;--------------------------------------
-
 
624
fs_HasCd1:
-
 
625
        test    byte [DRIVE_DATA+1], 00100000b
-
 
626
        setnz   al
-
 
627
        ret
-
 
628
;--------------------------------------
-
 
629
fs_HasCd2:
-
 
630
        test    byte [DRIVE_DATA+1], 00001000b
-
 
631
        setnz   al
-
 
632
        ret
-
 
633
;--------------------------------------
-
 
634
fs_HasCd3:
-
 
635
        test    byte [DRIVE_DATA+1], 00000010b
-
 
636
        setnz   al
-
 
637
        ret
-
 
638
;--------------------------------------
-
 
639
fs_HasCd4:
-
 
640
        test    byte [DRIVE_DATA+6], 10000000b
-
 
641
        setnz   al
-
 
642
        ret
-
 
643
;--------------------------------------
-
 
644
fs_HasCd5:
-
 
645
        test    byte [DRIVE_DATA+6], 00100000b
-
 
646
        setnz   al
-
 
647
        ret
-
 
648
;--------------------------------------
-
 
649
fs_HasCd6:
-
 
650
        test    byte [DRIVE_DATA+6], 00001000b
-
 
651
        setnz   al
-
 
652
        ret
-
 
653
;--------------------------------------
-
 
654
fs_HasCd7:
-
 
655
        test    byte [DRIVE_DATA+6], 00000010b
-
 
656
        setnz   al
-
 
657
        ret
-
 
658
;--------------------------------------
-
 
659
fs_HasCd8:
-
 
660
        test    byte [DRIVE_DATA+11], 10000000b
-
 
661
        setnz   al
-
 
662
        ret
-
 
663
;--------------------------------------
-
 
664
fs_HasCd9:
-
 
665
        test    byte [DRIVE_DATA+11], 00100000b
-
 
666
        setnz   al
-
 
667
        ret
-
 
668
;--------------------------------------
-
 
669
fs_HasCd10:
-
 
670
        test    byte [DRIVE_DATA+11], 00001000b
-
 
671
        setnz   al
-
 
672
        ret
-
 
673
;--------------------------------------
-
 
674
fs_HasCd11:
-
 
675
        test    byte [DRIVE_DATA+11], 00000010b
-
 
676
        setnz   al
-
 
677
        ret
-
 
678
;-----------------------------------------------------------------------------
-
 
679
;
-
 
680
; fs_NextXXX functions:
-
 
681
; in: eax = partition number, from which start to scan
-
 
682
; out: CF=1 => no more partitions
-
 
683
;      CF=0 => eax=next partition number
-
 
684
;
-
 
685
;-----------------------------------------------------------------------------
-
 
686
fs_NextCd:
-
 
687
; we always have /cdX/1
-
 
688
        test    eax, eax
-
 
689
        stc
-
 
690
        jnz     @f
-
 
691
        mov     al, 1
-
 
692
        clc
-
 
693
@@:
-
 
694
        ret
-
 
695
;-----------------------------------------------------------------------------
-
 
696
process_replace_file_name:
391
process_replace_file_name:
697
; in
-
 
698
; esi - path with filename(f.70)
392
; in: [esi] = virtual path
699
;
-
 
700
; out
-
 
701
; ebp - full filename
393
; out: [esi]+[ebp] = physical path
702
        pushfd
394
        pushfd
703
        cli
395
        cli
704
        mov     ebp, [full_file_name_table]
396
        mov     ebp, [full_file_name_table]
705
        xor     edi, edi
397
        xor     edi, edi
706
.loop:
398
.loop:
707
        cmp     edi, [full_file_name_table.size]
399
        cmp     edi, [full_file_name_table.size]
708
        jae     .notfound
400
        jae     .notfound
709
        push    esi edi
401
        push    esi edi
710
        shl     edi, 7 ; edi*128
402
        shl     edi, 7
711
        add     edi, ebp
403
        add     edi, ebp
712
@@:
404
@@:
713
        cmp     byte [edi], 0 ; end of dir_name
405
        cmp     byte [edi], 0
714
        jz      .dest_done
406
        jz      .dest_done
715
        lodsb
407
        lodsb
716
        test    al, al
408
        test    al, al
717
        jz      .cont
409
        jz      .cont
718
        or      al, 20h ; 32 - space char
410
        or      al, 20h
719
        scasb
411
        scasb
720
        jz      @b
412
        jz      @b
-
 
413
.cont:
-
 
414
        pop     edi esi
-
 
415
        inc     edi
721
        jmp     .cont
416
        jmp     .loop
-
 
417
 
722
.dest_done:
418
.dest_done:
723
        cmp     byte [esi], 0
419
        cmp     byte [esi], 0
724
        jz      .found
420
        jz      .found
725
        cmp     byte [esi], '/'
421
        cmp     byte [esi], '/'
726
        jnz     .cont
422
        jnz     .cont
727
        inc     esi
423
        inc     esi
728
        jmp     .found
-
 
729
.cont:
-
 
730
        pop     edi esi
-
 
731
        inc     edi
-
 
732
        jmp     .loop
-
 
733
.found:
424
.found:
734
        pop     edi eax
425
        pop     edi eax
735
        shl     edi, 7 ; edi*128
426
        shl     edi, 7
736
        add     edi, ebp
427
        add     edi, ebp
737
        mov     ebp, esi
428
        mov     ebp, esi
738
        cmp     byte [esi], 0
429
        cmp     byte [esi], 0
739
        lea     esi, [edi+64]
430
        lea     esi, [edi+64]
740
        jnz     .ret
431
        jnz     .ret
741
.notfound:
432
.notfound:
742
        xor     ebp, ebp
433
        xor     ebp, ebp
743
.ret:
434
.ret:
744
        popfd
435
        popfd
745
        ret
436
        ret
-
 
437
 
746
;-----------------------------------------------------------------------------
438
;-----------------------------------------------------------------------------
747
uglobal
439
uglobal
748
lock_flag_for_f30_3 rb 1
440
lock_flag_for_f30_3 rb 1
749
endg
441
endg
Line 750... Line 442...
750
 
442
 
751
sys_current_directory:
-
 
752
;       mov     esi, [current_slot]
-
 
753
;       mov     esi, [esi+APPDATA.cur_dir]
-
 
754
;       mov     edx, esi
-
 
755
 
-
 
756
;get length string of appdata.cur_dir
443
sys_current_directory:  ; sysfunction 30
757
        mov     eax, [current_slot]
444
        mov     eax, [current_slot]
758
        mov     edi, [eax+APPDATA.cur_dir]
-
 
759
 
445
        mov     edi, [eax+APPDATA.cur_dir]
760
        dec     ebx
446
        dec     ebx
761
        jz      .set
447
        jz      .set
762
        dec     ebx
448
        dec     ebx
763
        jz      .get
449
        jz      .get
764
        dec     ebx
450
        dec     ebx
765
        jz      .mount_additional_directory
451
        jz      .mount_additional_directory
Line 766... Line 452...
766
        ret
452
        ret
767
 
453
 
768
.mount_additional_directory:
-
 
769
; sysfunction 30.2: [for app] eax=30,ebx=3,ecx->dir name+dir path (128)
-
 
770
; for our code: nothing
-
 
771
 
454
.mount_additional_directory:
772
; check lock of the function
455
; in: ecx -> dir name+dir path (128)
773
        cmp     [lock_flag_for_f30_3], 1
-
 
774
        je      @f
456
        cmp     [lock_flag_for_f30_3], 1    ; check lock
775
 
457
        je      @f
776
        mov     esi, ecx
-
 
777
        mov     edi, sysdir_name1
458
        mov     esi, ecx
778
; copying fake directory name
459
        mov     edi, sysdir_name1
779
        mov     ecx, 63
460
        mov     ecx, 63
780
        pushfd
461
        pushfd
781
        cli
-
 
782
        cld
462
        cli
783
        rep movsb
463
        cld
784
; terminator of name, in case if we get the inlet trash
464
        rep movsb   ; copying fake directory name
785
        inc     esi
-
 
786
        xor     eax, eax
465
        inc     esi
787
        stosb
466
        xor     eax, eax
788
; copying real directory path for mounting
-
 
789
        mov     ecx, 63
467
        stosb       ; terminator of name, in case if we get the inlet trash
790
        rep movsb
468
        mov     ecx, 63
791
; terminator of name, in case if we get the inlet trash
469
        rep movsb   ; copying real directory path for mounting
792
        xor     eax, eax
470
        xor     eax, eax
793
        stosb
471
        stosb
794
; increase the pointer of inputs for procedure "process_replace_file_name"
-
 
795
        mov     [full_file_name_table.size], 2
-
 
796
; block the ability to call f.30.3 because for one session is necessary
472
; increase the pointer of inputs for procedure "process_replace_file_name"
797
; for us only once
473
        mov     [full_file_name_table.size], 2
798
        mov     [lock_flag_for_f30_3], 1
474
        mov     [lock_flag_for_f30_3], 1    ; lock
799
        popfd
475
        popfd
Line 800... Line -...
800
@@:
-
 
801
        ret
-
 
802
 
-
 
803
.get:
476
@@:
804
; sysfunction 30.2: [for app] eax=30,ebx=2,ecx->buffer,edx=len
-
 
805
; for our code: ebx->buffer,ecx=len
-
 
Line -... Line 477...
-
 
477
        ret
-
 
478
 
806
max_cur_dir     equ     0x1000
479
max_cur_dir equ 0x1000  ; length
807
 
480
 
808
        mov     ebx, edi
-
 
809
 
481
.get:       ; in: ecx -> buffer, edx = length
810
        push    ecx
482
        mov     ebx, edi    ; buffer
811
        push    edi
-
 
812
 
483
        push    ecx
813
        xor     eax, eax
484
        push    edi
814
        mov     ecx, max_cur_dir
-
 
815
 
485
        xor     eax, eax
816
        repne scasb             ;find zerro at and string
486
        mov     ecx, max_cur_dir
817
        jnz     .error          ; no zero in cur_dir: internal error, should not happen
487
        repne scasb
818
 
-
 
819
        sub     edi, ebx        ;lenght for copy
488
        jnz     .error
820
        inc     edi
489
        sub     edi, ebx
821
        mov     [esp+32+8], edi ;return in eax
490
        inc     edi
822
 
491
        mov     [esp+32+8], edi ; return in eax
823
        cmp     edx, edi
-
 
824
        jbe     @f
492
        cmp     edx, edi
825
        mov     edx, edi
-
 
826
@@:
493
        jbe     @f
827
;source string
494
        mov     edx, edi
828
        pop     esi
495
@@:
829
;destination string
-
 
830
        pop     edi
496
        pop     esi
831
        cmp     edx, 1
497
        pop     edi
832
        jbe     .ret
498
        cmp     edx, 1
833
 
499
        jbe     .ret
834
        mov     al, '/'         ;start string with '/'
500
        mov     al, '/'
835
        stosb
501
        stosb
Line 836... Line 502...
836
        mov     ecx, edx
502
        mov     ecx, edx
837
        rep movsb               ;copy string
503
        rep movsb
838
.ret:
504
.ret:
839
        ret
505
        ret
-
 
506
 
840
 
507
.error:
841
.error:
-
 
842
        add     esp, 8
508
        add     esp, 8
843
        or      dword [esp+32], -1      ;error not found zerro at string ->[eax+APPDATA.cur_dir]
509
        or      dword[esp+32], -1
844
        ret
510
        ret
845
.set:
511
 
846
; sysfunction 30.1: [for app] eax=30,ebx=1,ecx->string
512
.set:
847
; for our code: ebx->string to set
-
 
848
; use generic resolver with APPDATA.cur_dir as destination
-
 
849
        push    max_cur_dir     ;0x1000
-
 
850
        push    edi     ;destination
-
 
851
        mov     ebx, ecx
-
 
852
        call    get_full_file_name
513
        pop     eax
-
 
514
        push    max_cur_dir
-
 
515
        push    edi
853
        ret
516
        push    eax
854
 
517
        mov     ebx, ecx
855
; in: ebx = file name, [esp+4] = destination, [esp+8] = sizeof destination
518
get_full_file_name:
856
; destroys all registers except ebp,esp
519
; in: ebx -> file name, [esp+4] -> destination, [esp+8] = max length
857
get_full_file_name:
520
; destroys all registers
Line 864... Line 527...
864
        cmp     byte [esi-1], 0
527
        cmp     byte [esi-1], 0
865
        jnz     @b
528
        jnz     @b
866
        dec     esi
529
        dec     esi
867
        cmp     byte [ebx], '/'
530
        cmp     byte [ebx], '/'
868
        jz      .set_absolute
531
        jz      .set_absolute
869
; string gives relative path
-
 
870
        mov     edi, [esp+8]    ; destination
532
        mov     edi, [esp+8]
871
.relative:
533
.relative:
872
        cmp     byte [ebx], 0
534
        cmp     byte [ebx], 0
873
        jz      .set_ok
535
        jz      .set_ok
874
        cmp     word [ebx], '.'
536
        cmp     word [ebx], '.'
875
        jz      .set_ok
537
        jz      .set_ok
876
        cmp     word [ebx], './'
538
        cmp     word [ebx], './'
877
        jnz     @f
539
        jnz     @f
878
        add     ebx, 2
540
        add     ebx, 2
879
        jmp     .relative
541
        jmp     .relative
-
 
542
 
880
@@:
543
@@:
881
        cmp     word [ebx], '..'
544
        cmp     word [ebx], '..'
882
        jnz     .doset_relative
545
        jnz     .doset_relative
883
        cmp     byte [ebx+2], 0
546
        cmp     byte [ebx+2], 0
884
        jz      @f
547
        jz      @f
Line 888... Line 551...
888
        dec     esi
551
        dec     esi
889
        cmp     byte [esi], '/'
552
        cmp     byte [esi], '/'
890
        jnz     @b
553
        jnz     @b
891
        add     ebx, 3
554
        add     ebx, 3
892
        jmp     .relative
555
        jmp     .relative
-
 
556
 
893
.set_ok:
557
.set_ok:
894
        cmp     edx, edi        ; is destination equal to APPDATA.cur_dir?
558
        cmp     edx, edi        ; is destination equal to APPDATA.cur_dir?
895
        jz      .set_ok.cur_dir
559
        jz      .set_ok.cur_dir
896
        sub     esi, edx
560
        sub     esi, edx
897
        cmp     esi, [esp+12]
561
        cmp     esi, [esp+12]
898
        jb      .set_ok.copy
562
        jb      .set_ok.copy
899
.fail:
563
.fail:
900
        mov     byte [edi], 0
564
        mov     byte [edi], 0
901
        xor     eax, eax        ; fail
565
        xor     eax, eax
902
        pop     ebp
566
        pop     ebp
903
        ret     8
567
        ret     8
-
 
568
 
904
.set_ok.copy:
569
.set_ok.copy:
905
        mov     ecx, esi
570
        mov     ecx, esi
906
        mov     esi, edx
571
        mov     esi, edx
907
        rep movsb
572
        rep movsb
908
        mov     byte [edi], 0
573
        mov     byte [edi], 0
909
.ret.ok:
574
.ret.ok:
910
        mov     al, 1   ; ok
575
        mov     al, 1
911
        pop     ebp
576
        pop     ebp
912
        ret     8
577
        ret     8
-
 
578
 
913
.set_ok.cur_dir:
579
.set_ok.cur_dir:
914
        mov     byte [esi], 0
580
        mov     byte [esi], 0
915
        jmp     .ret.ok
581
        jmp     .ret.ok
-
 
582
 
916
.doset_relative:
583
.doset_relative:
917
        cmp     edx, edi
584
        cmp     edx, edi
918
        jz      .doset_relative.cur_dir
585
        jz      .doset_relative.cur_dir
919
        sub     esi, edx
586
        sub     esi, edx
920
        cmp     esi, [esp+12]
587
        cmp     esi, [esp+12]
Line 922... Line 589...
922
        mov     ecx, esi
589
        mov     ecx, esi
923
        mov     esi, edx
590
        mov     esi, edx
924
        mov     edx, edi
591
        mov     edx, edi
925
        rep movsb
592
        rep movsb
926
        jmp     .doset_relative.copy
593
        jmp     .doset_relative.copy
-
 
594
 
927
.doset_relative.cur_dir:
595
.doset_relative.cur_dir:
928
        mov     edi, esi
596
        mov     edi, esi
929
.doset_relative.copy:
597
.doset_relative.copy:
930
        add     edx, [esp+12]
598
        add     edx, [esp+12]
931
        mov     byte [edi], '/'
599
        mov     byte [edi], '/'
Line 941... Line 609...
941
        cmp     edi, edx
609
        cmp     edi, edx
942
        jb      @b
610
        jb      @b
943
.overflow:
611
.overflow:
944
        dec     edi
612
        dec     edi
945
        jmp     .fail
613
        jmp     .fail
-
 
614
 
946
.set_absolute:
615
.set_absolute:
947
        lea     esi, [ebx+1]
616
        lea     esi, [ebx+1]
948
        call    process_replace_file_name
617
        call    process_replace_file_name
949
        mov     edi, [esp+8]
618
        mov     edi, [esp+8]
950
        mov     edx, [esp+12]
619
        mov     edx, [esp+12]
Line 956... Line 625...
956
        jz      .set_part2
625
        jz      .set_part2
957
.set_copy_cont:
626
.set_copy_cont:
958
        cmp     edi, edx
627
        cmp     edi, edx
959
        jb      .set_copy
628
        jb      .set_copy
960
        jmp     .overflow
629
        jmp     .overflow
-
 
630
 
961
.set_part2:
631
.set_part2:
962
        mov     esi, ebp
632
        mov     esi, ebp
963
        xor     ebp, ebp
633
        xor     ebp, ebp
964
        test    esi, esi
634
        test    esi, esi
965
        jz      .ret.ok
635
        jz      .ret.ok