Rev 5201 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
5565 | serge | 3 | ;; Copyright (C) KolibriOS team 2004-2015. All rights reserved. ;; |
431 | serge | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
94 | mario79 | 7 | |
1531 | diamond | 8 | $Revision: 5565 $ |
593 | mikedld | 9 | |
5201 | serge | 10 | ;----------------------------------------------------------------------------- |
87 | mario79 | 11 | uglobal |
12 | cd_current_pointer_of_input dd 0 |
||
13 | cd_current_pointer_of_input_2 dd 0 |
||
2434 | Serge | 14 | cd_mem_location dd 0 |
15 | cd_counter_block dd 0 |
||
87 | mario79 | 16 | endg |
5201 | serge | 17 | ;----------------------------------------------------------------------------- |
87 | mario79 | 18 | reserve_cd: |
2434 | Serge | 19 | cli |
20 | cmp [cd_status], 0 |
||
21 | je reserve_ok2 |
||
87 | mario79 | 22 | |
2434 | Serge | 23 | sti |
24 | call change_task |
||
25 | jmp reserve_cd |
||
5201 | serge | 26 | ;----------------------------------------------------------------------------- |
27 | reserve_ok2: |
||
2434 | Serge | 28 | push eax |
29 | mov eax, [CURRENT_TASK] |
||
30 | shl eax, 5 |
||
31 | mov eax, [eax+CURRENT_TASK+TASKDATA.pid] |
||
32 | mov [cd_status], eax |
||
33 | pop eax |
||
34 | sti |
||
35 | ret |
||
5201 | serge | 36 | ;----------------------------------------------------------------------------- |
37 | reserve_cd_channel: |
||
38 | pushad |
||
39 | mov eax, [cdpos] |
||
40 | dec eax |
||
41 | shr eax, 2 |
||
95 | mario79 | 42 | |
5201 | serge | 43 | test eax, eax |
44 | jnz .1 |
||
45 | |||
2434 | Serge | 46 | cmp [ChannelNumber], 1 |
5201 | serge | 47 | jne @f |
48 | |||
3908 | Serge | 49 | mov ecx, ide_channel1_mutex |
5201 | serge | 50 | jmp .mutex_lock |
51 | ;-------------------------------------- |
||
52 | @@: |
||
53 | mov ecx, ide_channel2_mutex |
||
54 | jmp .mutex_lock |
||
55 | ;-------------------------------------- |
||
56 | .1: |
||
57 | dec eax |
||
58 | jnz .2 |
||
59 | |||
60 | cmp [ChannelNumber], 1 |
||
61 | jne @f |
||
62 | |||
63 | mov ecx, ide_channel3_mutex |
||
64 | jmp .mutex_lock |
||
65 | ;-------------------------------------- |
||
66 | @@: |
||
67 | mov ecx, ide_channel4_mutex |
||
68 | jmp .mutex_lock |
||
69 | ;-------------------------------------- |
||
70 | .2: |
||
71 | cmp [ChannelNumber], 1 |
||
72 | jne @f |
||
73 | |||
74 | mov ecx, ide_channel5_mutex |
||
75 | jmp .mutex_lock |
||
76 | ;-------------------------------------- |
||
77 | @@: |
||
78 | mov ecx, ide_channel6_mutex |
||
79 | .mutex_lock: |
||
3908 | Serge | 80 | call mutex_lock |
81 | popad |
||
2434 | Serge | 82 | ret |
5201 | serge | 83 | ;----------------------------------------------------------------------------- |
84 | free_cd_channel: |
||
3908 | Serge | 85 | pushad |
5201 | serge | 86 | mov eax, [cdpos] |
87 | dec eax |
||
88 | shr eax, 2 |
||
95 | mario79 | 89 | |
5201 | serge | 90 | test eax, eax |
91 | jnz .1 |
||
92 | |||
2434 | Serge | 93 | cmp [ChannelNumber], 1 |
5201 | serge | 94 | jne @f |
95 | |||
3908 | Serge | 96 | mov ecx, ide_channel1_mutex |
5201 | serge | 97 | jmp .mutex_unlock |
98 | ;-------------------------------------- |
||
99 | @@: |
||
3908 | Serge | 100 | mov ecx, ide_channel2_mutex |
5201 | serge | 101 | jmp .mutex_unlock |
102 | ;-------------------------------------- |
||
103 | .1: |
||
104 | dec eax |
||
105 | jnz .2 |
||
106 | |||
107 | cmp [ChannelNumber], 1 |
||
108 | jne @f |
||
109 | |||
110 | mov ecx, ide_channel3_mutex |
||
111 | jmp .mutex_unlock |
||
112 | ;-------------------------------------- |
||
113 | @@: |
||
114 | mov ecx, ide_channel4_mutex |
||
115 | jmp .mutex_unlock |
||
116 | ;-------------------------------------- |
||
117 | .2: |
||
118 | cmp [ChannelNumber], 1 |
||
119 | jne @f |
||
120 | |||
121 | mov ecx, ide_channel5_mutex |
||
122 | jmp .mutex_unlock |
||
123 | ;-------------------------------------- |
||
124 | @@: |
||
125 | mov ecx, ide_channel6_mutex |
||
126 | .mutex_unlock: |
||
3908 | Serge | 127 | call mutex_unlock |
128 | popad |
||
2434 | Serge | 129 | ret |
5201 | serge | 130 | ;----------------------------------------------------------------------------- |
379 | serge | 131 | uglobal |
87 | mario79 | 132 | cd_status dd 0 |
364 | diamond | 133 | endg |
5201 | serge | 134 | ;----------------------------------------------------------------------------- |
87 | mario79 | 135 | ; |
136 | ; fs_CdRead - LFN variant for reading CD disk |
||
137 | ; |
||
138 | ; esi points to filename /dir1/dir2/.../dirn/file,0 |
||
139 | ; ebx pointer to 64-bit number = first wanted byte, 0+ |
||
140 | ; may be ebx=0 - start from first byte |
||
141 | ; ecx number of bytes to read, 0+ |
||
142 | ; edx mem location to return data |
||
143 | ; |
||
144 | ; ret ebx = bytes read or 0xffffffff file not found |
||
145 | ; eax = 0 ok read or other = errormsg |
||
146 | ; |
||
5201 | serge | 147 | ;----------------------------------------------------------------------------- |
87 | mario79 | 148 | fs_CdRead: |
2434 | Serge | 149 | push edi |
150 | cmp byte [esi], 0 |
||
151 | jnz @f |
||
5201 | serge | 152 | ;-------------------------------------- |
87 | mario79 | 153 | .noaccess: |
2434 | Serge | 154 | pop edi |
5201 | serge | 155 | ;-------------------------------------- |
87 | mario79 | 156 | .noaccess_2: |
2434 | Serge | 157 | or ebx, -1 |
158 | mov eax, ERROR_ACCESS_DENIED |
||
159 | ret |
||
5201 | serge | 160 | ;-------------------------------------- |
87 | mario79 | 161 | .noaccess_3: |
2434 | Serge | 162 | pop eax edx ecx edi |
163 | jmp .noaccess_2 |
||
5201 | serge | 164 | ;-------------------------------------- |
87 | mario79 | 165 | @@: |
2434 | Serge | 166 | call cd_find_lfn |
167 | jnc .found |
||
5201 | serge | 168 | |
2434 | Serge | 169 | pop edi |
170 | cmp [DevErrorCode], 0 |
||
171 | jne .noaccess_2 |
||
5201 | serge | 172 | |
2434 | Serge | 173 | or ebx, -1 |
174 | mov eax, ERROR_FILE_NOT_FOUND |
||
175 | ret |
||
5201 | serge | 176 | ;-------------------------------------- |
87 | mario79 | 177 | .found: |
2434 | Serge | 178 | mov edi, [cd_current_pointer_of_input] |
179 | test byte [edi+25], 10b; do not allow read directories |
||
180 | jnz .noaccess |
||
5201 | serge | 181 | |
2434 | Serge | 182 | test ebx, ebx |
183 | jz .l1 |
||
5201 | serge | 184 | |
2434 | Serge | 185 | cmp dword [ebx+4], 0 |
186 | jz @f |
||
5201 | serge | 187 | |
2434 | Serge | 188 | xor ebx, ebx |
5201 | serge | 189 | ;-------------------------------------- |
87 | mario79 | 190 | .reteof: |
2434 | Serge | 191 | mov eax, 6; end of file |
192 | pop edi |
||
193 | ret |
||
5201 | serge | 194 | ;-------------------------------------- |
87 | mario79 | 195 | @@: |
2434 | Serge | 196 | mov ebx, [ebx] |
5201 | serge | 197 | ;-------------------------------------- |
87 | mario79 | 198 | .l1: |
2434 | Serge | 199 | push ecx edx |
200 | push 0 |
||
5201 | serge | 201 | mov eax, [edi+10] ; real size of the file section |
2434 | Serge | 202 | sub eax, ebx |
203 | jb .eof |
||
5201 | serge | 204 | |
2434 | Serge | 205 | cmp eax, ecx |
206 | jae @f |
||
5201 | serge | 207 | |
2434 | Serge | 208 | mov ecx, eax |
209 | mov byte [esp], 6 |
||
5201 | serge | 210 | ;-------------------------------------- |
87 | mario79 | 211 | @@: |
2434 | Serge | 212 | mov eax, [edi+2] |
213 | mov [CDSectorAddress], eax |
||
5201 | serge | 214 | ;-------------------------------------- |
87 | mario79 | 215 | ; now eax=cluster, ebx=position, ecx=count, edx=buffer for data |
216 | .new_sector: |
||
2434 | Serge | 217 | test ecx, ecx |
218 | jz .done |
||
5201 | serge | 219 | |
2434 | Serge | 220 | sub ebx, 2048 |
221 | jae .next |
||
5201 | serge | 222 | |
2434 | Serge | 223 | add ebx, 2048 |
224 | jnz .incomplete_sector |
||
5201 | serge | 225 | |
2434 | Serge | 226 | cmp ecx, 2048 |
227 | jb .incomplete_sector |
||
87 | mario79 | 228 | ; we may read and memmove complete sector |
2434 | Serge | 229 | mov [CDDataBuf_pointer], edx |
5201 | serge | 230 | call ReadCDWRetr ; read sector of file |
2434 | Serge | 231 | cmp [DevErrorCode], 0 |
232 | jne .noaccess_3 |
||
5201 | serge | 233 | |
2434 | Serge | 234 | add edx, 2048 |
235 | sub ecx, 2048 |
||
5201 | serge | 236 | ;-------------------------------------- |
154 | diamond | 237 | .next: |
2434 | Serge | 238 | inc dword [CDSectorAddress] |
239 | jmp .new_sector |
||
5201 | serge | 240 | ;-------------------------------------- |
87 | mario79 | 241 | .incomplete_sector: |
242 | ; we must read and memmove incomplete sector |
||
2434 | Serge | 243 | mov [CDDataBuf_pointer], CDDataBuf |
5201 | serge | 244 | call ReadCDWRetr ; read sector of file |
2434 | Serge | 245 | cmp [DevErrorCode], 0 |
246 | jne .noaccess_3 |
||
5201 | serge | 247 | |
2434 | Serge | 248 | push ecx |
249 | add ecx, ebx |
||
250 | cmp ecx, 2048 |
||
251 | jbe @f |
||
5201 | serge | 252 | |
2434 | Serge | 253 | mov ecx, 2048 |
5201 | serge | 254 | ;-------------------------------------- |
87 | mario79 | 255 | @@: |
2434 | Serge | 256 | sub ecx, ebx |
257 | push edi esi ecx |
||
258 | mov edi, edx |
||
259 | lea esi, [CDDataBuf + ebx] |
||
260 | cld |
||
261 | rep movsb |
||
262 | pop ecx esi edi |
||
263 | add edx, ecx |
||
264 | sub [esp], ecx |
||
265 | pop ecx |
||
266 | xor ebx, ebx |
||
267 | jmp .next |
||
5201 | serge | 268 | ;-------------------------------------- |
87 | mario79 | 269 | .done: |
2434 | Serge | 270 | mov ebx, edx |
271 | pop eax edx ecx edi |
||
272 | sub ebx, edx |
||
273 | ret |
||
5201 | serge | 274 | ;-------------------------------------- |
87 | mario79 | 275 | .eof: |
2434 | Serge | 276 | mov ebx, edx |
277 | pop eax edx ecx |
||
278 | sub ebx, edx |
||
279 | jmp .reteof |
||
5201 | serge | 280 | ;----------------------------------------------------------------------------- |
87 | mario79 | 281 | ; |
282 | ; fs_CdReadFolder - LFN variant for reading CD disk folder |
||
283 | ; |
||
284 | ; esi points to filename /dir1/dir2/.../dirn/file,0 |
||
285 | ; ebx pointer to structure 32-bit number = first wanted block, 0+ |
||
286 | ; & flags (bitfields) |
||
287 | ; flags: bit 0: 0=ANSI names, 1=UNICODE names |
||
288 | ; ecx number of blocks to read, 0+ |
||
289 | ; edx mem location to return data |
||
290 | ; |
||
291 | ; ret ebx = blocks read or 0xffffffff folder not found |
||
292 | ; eax = 0 ok read or other = errormsg |
||
293 | ; |
||
5201 | serge | 294 | ;----------------------------------------------------------------------------- |
87 | mario79 | 295 | fs_CdReadFolder: |
2434 | Serge | 296 | push edi |
297 | call cd_find_lfn |
||
298 | jnc .found |
||
5201 | serge | 299 | |
2434 | Serge | 300 | pop edi |
301 | cmp [DevErrorCode], 0 |
||
302 | jne .noaccess_1 |
||
5201 | serge | 303 | |
2434 | Serge | 304 | or ebx, -1 |
305 | mov eax, ERROR_FILE_NOT_FOUND |
||
306 | ret |
||
5201 | serge | 307 | ;-------------------------------------- |
87 | mario79 | 308 | .found: |
2434 | Serge | 309 | mov edi, [cd_current_pointer_of_input] |
310 | test byte [edi+25], 10b ; do not allow read directories |
||
311 | jnz .found_dir |
||
5201 | serge | 312 | |
2434 | Serge | 313 | pop edi |
5201 | serge | 314 | ;-------------------------------------- |
87 | mario79 | 315 | .noaccess_1: |
2434 | Serge | 316 | or ebx, -1 |
317 | mov eax, ERROR_ACCESS_DENIED |
||
318 | ret |
||
5201 | serge | 319 | ;-------------------------------------- |
87 | mario79 | 320 | .found_dir: |
2434 | Serge | 321 | mov eax, [edi+2] ; eax=cluster |
322 | mov [CDSectorAddress], eax |
||
5201 | serge | 323 | mov eax, [edi+10] ; directory size |
324 | ;-------------------------------------- |
||
87 | mario79 | 325 | .doit: |
326 | ; init header |
||
2434 | Serge | 327 | push eax ecx |
328 | mov edi, edx |
||
329 | mov ecx, 32/4 |
||
330 | xor eax, eax |
||
331 | rep stosd |
||
332 | pop ecx eax |
||
333 | mov byte [edx], 1 ; version |
||
334 | mov [cd_mem_location], edx |
||
335 | add [cd_mem_location], 32 |
||
87 | mario79 | 336 | ;.mainloop: |
2434 | Serge | 337 | mov [cd_counter_block], dword 0 |
338 | dec dword [CDSectorAddress] |
||
339 | push ecx |
||
5201 | serge | 340 | ;-------------------------------------- |
87 | mario79 | 341 | .read_to_buffer: |
2434 | Serge | 342 | inc dword [CDSectorAddress] |
343 | mov [CDDataBuf_pointer], CDDataBuf |
||
5201 | serge | 344 | call ReadCDWRetr ; read sector of directory |
2434 | Serge | 345 | cmp [DevErrorCode], 0 |
346 | jne .noaccess_1 |
||
5201 | serge | 347 | |
2434 | Serge | 348 | call .get_names_from_buffer |
349 | sub eax, 2048 |
||
5201 | serge | 350 | ; directory is over? |
2434 | Serge | 351 | ja .read_to_buffer |
5201 | serge | 352 | |
2434 | Serge | 353 | mov edi, [cd_counter_block] |
354 | mov [edx+8], edi |
||
355 | mov edi, [ebx] |
||
356 | sub [edx+4], edi |
||
357 | xor eax, eax |
||
358 | dec ecx |
||
359 | js @f |
||
5201 | serge | 360 | |
2434 | Serge | 361 | mov al, ERROR_END_OF_FILE |
5201 | serge | 362 | ;-------------------------------------- |
364 | diamond | 363 | @@: |
2434 | Serge | 364 | pop ecx edi |
365 | mov ebx, [edx+4] |
||
366 | ret |
||
5201 | serge | 367 | ;-------------------------------------- |
87 | mario79 | 368 | .get_names_from_buffer: |
2434 | Serge | 369 | mov [cd_current_pointer_of_input_2], CDDataBuf |
370 | push eax esi edi edx |
||
5201 | serge | 371 | ;-------------------------------------- |
87 | mario79 | 372 | .get_names_from_buffer_1: |
2434 | Serge | 373 | call cd_get_name |
374 | jc .end_buffer |
||
5201 | serge | 375 | |
2434 | Serge | 376 | inc dword [cd_counter_block] |
377 | mov eax, [cd_counter_block] |
||
378 | cmp [ebx], eax |
||
379 | jae .get_names_from_buffer_1 |
||
5201 | serge | 380 | |
2434 | Serge | 381 | test ecx, ecx |
382 | jz .get_names_from_buffer_1 |
||
5201 | serge | 383 | |
2434 | Serge | 384 | mov edi, [cd_counter_block] |
385 | mov [edx+4], edi |
||
386 | dec ecx |
||
387 | mov esi, ebp |
||
388 | mov edi, [cd_mem_location] |
||
389 | add edi, 40 |
||
390 | test dword [ebx+4], 1; 0=ANSI, 1=UNICODE |
||
391 | jnz .unicode |
||
5201 | serge | 392 | ;-------------------------------------- |
87 | mario79 | 393 | .ansi: |
2434 | Serge | 394 | cmp [cd_counter_block], 2 |
395 | jbe .ansi_parent_directory |
||
5201 | serge | 396 | |
2434 | Serge | 397 | cld |
398 | lodsw |
||
399 | xchg ah, al |
||
400 | call uni2ansi_char |
||
401 | cld |
||
402 | stosb |
||
5201 | serge | 403 | ; check end of file |
2434 | Serge | 404 | mov ax, [esi] |
5201 | serge | 405 | cmp ax, word 3B00h ; separator end of file ';' |
2434 | Serge | 406 | je .cd_get_parameters_of_file_1 |
5201 | serge | 407 | ; check for files not ending with separator |
2434 | Serge | 408 | movzx eax, byte [ebp-33] |
409 | add eax, ebp |
||
410 | sub eax, 34 |
||
411 | cmp esi, eax |
||
412 | je .cd_get_parameters_of_file_1 |
||
5201 | serge | 413 | ; check the end of the directory |
2434 | Serge | 414 | movzx eax, byte [ebp-1] |
415 | add eax, ebp |
||
416 | cmp esi, eax |
||
417 | jb .ansi |
||
5201 | serge | 418 | ;-------------------------------------- |
87 | mario79 | 419 | .cd_get_parameters_of_file_1: |
2434 | Serge | 420 | mov [edi], byte 0 |
421 | call cd_get_parameters_of_file |
||
422 | add [cd_mem_location], 304 |
||
423 | jmp .get_names_from_buffer_1 |
||
5201 | serge | 424 | ;-------------------------------------- |
87 | mario79 | 425 | .ansi_parent_directory: |
2434 | Serge | 426 | cmp [cd_counter_block], 2 |
427 | je @f |
||
5201 | serge | 428 | |
2434 | Serge | 429 | mov [edi], byte '.' |
430 | inc edi |
||
431 | jmp .cd_get_parameters_of_file_1 |
||
5201 | serge | 432 | ;-------------------------------------- |
87 | mario79 | 433 | @@: |
2434 | Serge | 434 | mov [edi], word '..' |
435 | add edi, 2 |
||
436 | jmp .cd_get_parameters_of_file_1 |
||
5201 | serge | 437 | ;-------------------------------------- |
87 | mario79 | 438 | .unicode: |
2434 | Serge | 439 | cmp [cd_counter_block], 2 |
440 | jbe .unicode_parent_directory |
||
5201 | serge | 441 | |
2434 | Serge | 442 | cld |
443 | movsw |
||
5201 | serge | 444 | ; check end of file |
2434 | Serge | 445 | mov ax, [esi] |
5201 | serge | 446 | cmp ax, word 3B00h; separator end of file ';' |
2434 | Serge | 447 | je .cd_get_parameters_of_file_2 |
5201 | serge | 448 | ; check for files not ending with separator |
2434 | Serge | 449 | movzx eax, byte [ebp-33] |
450 | add eax, ebp |
||
451 | sub eax, 34 |
||
452 | cmp esi, eax |
||
453 | je .cd_get_parameters_of_file_2 |
||
5201 | serge | 454 | ; check the end of the directory |
2434 | Serge | 455 | movzx eax, byte [ebp-1] |
456 | add eax, ebp |
||
457 | cmp esi, eax |
||
458 | jb .unicode |
||
5201 | serge | 459 | ;-------------------------------------- |
87 | mario79 | 460 | .cd_get_parameters_of_file_2: |
2434 | Serge | 461 | mov [edi], word 0 |
462 | call cd_get_parameters_of_file |
||
463 | add [cd_mem_location], 560 |
||
464 | jmp .get_names_from_buffer_1 |
||
5201 | serge | 465 | ;-------------------------------------- |
87 | mario79 | 466 | .unicode_parent_directory: |
2434 | Serge | 467 | cmp [cd_counter_block], 2 |
468 | je @f |
||
5201 | serge | 469 | |
2434 | Serge | 470 | mov [edi], word 2E00h; '.' |
471 | add edi, 2 |
||
472 | jmp .cd_get_parameters_of_file_2 |
||
5201 | serge | 473 | ;-------------------------------------- |
87 | mario79 | 474 | @@: |
2434 | Serge | 475 | mov [edi], dword 2E002E00h; '..' |
476 | add edi, 4 |
||
477 | jmp .cd_get_parameters_of_file_2 |
||
5201 | serge | 478 | ;-------------------------------------- |
90 | mario79 | 479 | .end_buffer: |
2434 | Serge | 480 | pop edx edi esi eax |
481 | ret |
||
5201 | serge | 482 | ;----------------------------------------------------------------------------- |
90 | mario79 | 483 | cd_get_parameters_of_file: |
2434 | Serge | 484 | mov edi, [cd_mem_location] |
90 | mario79 | 485 | cd_get_parameters_of_file_1: |
5201 | serge | 486 | ; get file attributes |
2434 | Serge | 487 | xor eax, eax |
5201 | serge | 488 | ; file is not archived |
2434 | Serge | 489 | inc eax |
490 | shl eax, 1 |
||
5201 | serge | 491 | ; is a directory? |
2434 | Serge | 492 | test [ebp-8], byte 2 |
493 | jz .file |
||
5201 | serge | 494 | |
2434 | Serge | 495 | inc eax |
5201 | serge | 496 | ;-------------------------------------- |
87 | mario79 | 497 | .file: |
5201 | serge | 498 | ; not as a volume label in the FAT, in this form not available |
499 | ; file is not a system |
||
2434 | Serge | 500 | shl eax, 3 |
5201 | serge | 501 | ; file is hidden? (attribute of existence) |
2434 | Serge | 502 | test [ebp-8], byte 1 |
503 | jz .hidden |
||
5201 | serge | 504 | |
2434 | Serge | 505 | inc eax |
5201 | serge | 506 | ;-------------------------------------- |
87 | mario79 | 507 | .hidden: |
2434 | Serge | 508 | shl eax, 1 |
5201 | serge | 509 | ; file is always read-only, as this CD |
2434 | Serge | 510 | inc eax |
511 | mov [edi], eax |
||
5201 | serge | 512 | ; get the time to file |
513 | ; hour |
||
2434 | Serge | 514 | movzx eax, byte [ebp-12] |
515 | shl eax, 8 |
||
5201 | serge | 516 | ; minute |
2434 | Serge | 517 | mov al, [ebp-11] |
518 | shl eax, 8 |
||
5201 | serge | 519 | ; second |
2434 | Serge | 520 | mov al, [ebp-10] |
5201 | serge | 521 | ; file creation time |
2434 | Serge | 522 | mov [edi+8], eax |
5201 | serge | 523 | ; last access time |
2434 | Serge | 524 | mov [edi+16], eax |
5201 | serge | 525 | ; last write time |
2434 | Serge | 526 | mov [edi+24], eax |
5201 | serge | 527 | ; get date for file |
528 | ; year |
||
2434 | Serge | 529 | movzx eax, byte [ebp-15] |
530 | add eax, 1900 |
||
531 | shl eax, 8 |
||
5201 | serge | 532 | ; month |
2434 | Serge | 533 | mov al, [ebp-14] |
534 | shl eax, 8 |
||
5201 | serge | 535 | ; day |
2434 | Serge | 536 | mov al, [ebp-13] |
5201 | serge | 537 | ; file creation date |
2434 | Serge | 538 | mov [edi+12], eax |
5201 | serge | 539 | ; last access date |
2434 | Serge | 540 | mov [edi+20], eax |
5201 | serge | 541 | ; last write date |
2434 | Serge | 542 | mov [edi+28], eax |
5201 | serge | 543 | ; get the data type of name |
2434 | Serge | 544 | xor eax, eax |
545 | test dword [ebx+4], 1; 0=ANSI, 1=UNICODE |
||
546 | jnz .unicode_1 |
||
5201 | serge | 547 | |
2434 | Serge | 548 | mov [edi+4], eax |
549 | jmp @f |
||
5201 | serge | 550 | ;-------------------------------------- |
87 | mario79 | 551 | .unicode_1: |
2434 | Serge | 552 | inc eax |
553 | mov [edi+4], eax |
||
5201 | serge | 554 | ;-------------------------------------- |
87 | mario79 | 555 | @@: |
5201 | serge | 556 | ; get the file size in bytes |
2434 | Serge | 557 | xor eax, eax |
558 | mov [edi+32+4], eax |
||
559 | mov eax, [ebp-23] |
||
560 | mov [edi+32], eax |
||
561 | ret |
||
5201 | serge | 562 | ;----------------------------------------------------------------------------- |
90 | mario79 | 563 | ; |
564 | ; fs_CdGetFileInfo - LFN variant for CD |
||
565 | ; get file/directory attributes structure |
||
379 | serge | 566 | ; |
5201 | serge | 567 | ;----------------------------------------------------------------------------- |
90 | mario79 | 568 | fs_CdGetFileInfo: |
2434 | Serge | 569 | cmp byte [esi], 0 |
570 | jnz @f |
||
5201 | serge | 571 | |
2434 | Serge | 572 | mov eax, 2 |
573 | ret |
||
5201 | serge | 574 | ;-------------------------------------- |
90 | mario79 | 575 | @@: |
2434 | Serge | 576 | push edi |
577 | call cd_find_lfn |
||
578 | pushfd |
||
579 | cmp [DevErrorCode], 0 |
||
580 | jz @f |
||
5201 | serge | 581 | |
2434 | Serge | 582 | popfd |
583 | pop edi |
||
584 | mov eax, 11 |
||
585 | ret |
||
5201 | serge | 586 | ;-------------------------------------- |
90 | mario79 | 587 | @@: |
2434 | Serge | 588 | popfd |
589 | jnc @f |
||
5201 | serge | 590 | |
2434 | Serge | 591 | pop edi |
592 | mov eax, ERROR_FILE_NOT_FOUND |
||
593 | ret |
||
5201 | serge | 594 | ;-------------------------------------- |
90 | mario79 | 595 | @@: |
596 | |||
2434 | Serge | 597 | mov edi, edx |
598 | push ebp |
||
599 | mov ebp, [cd_current_pointer_of_input] |
||
600 | add ebp, 33 |
||
601 | call cd_get_parameters_of_file_1 |
||
602 | pop ebp |
||
603 | and dword [edi+4], 0 |
||
604 | pop edi |
||
605 | xor eax, eax |
||
606 | ret |
||
5201 | serge | 607 | ;----------------------------------------------------------------------------- |
87 | mario79 | 608 | cd_find_lfn: |
2434 | Serge | 609 | mov [cd_appl_data], 0 |
521 | diamond | 610 | ; in: esi+ebp -> name |
87 | mario79 | 611 | ; out: CF=1 - file not found |
758 | mario79 | 612 | ; else CF=0 and [cd_current_pointer_of_input] direntry |
2434 | Serge | 613 | push eax esi |
5201 | serge | 614 | ; Sector 16 - start set of volume descriptors |
2434 | Serge | 615 | call WaitUnitReady |
616 | cmp [DevErrorCode], 0 |
||
617 | jne .access_denied |
||
758 | mario79 | 618 | |
2434 | Serge | 619 | call prevent_medium_removal |
5201 | serge | 620 | ; testing of reading |
2434 | Serge | 621 | mov [CDSectorAddress], dword 16 |
622 | mov [CDDataBuf_pointer], CDDataBuf |
||
623 | call ReadCDWRetr;_1 |
||
624 | cmp [DevErrorCode], 0 |
||
625 | jne .access_denied |
||
758 | mario79 | 626 | |
5201 | serge | 627 | ; calculation of the last session |
2434 | Serge | 628 | call WaitUnitReady |
629 | cmp [DevErrorCode], 0 |
||
630 | jne .access_denied |
||
5201 | serge | 631 | |
2434 | Serge | 632 | call Read_TOC |
633 | mov ah, [CDDataBuf+4+4] |
||
634 | mov al, [CDDataBuf+4+5] |
||
635 | shl eax, 16 |
||
636 | mov ah, [CDDataBuf+4+6] |
||
637 | mov al, [CDDataBuf+4+7] |
||
638 | add eax, 15 |
||
639 | mov [CDSectorAddress], eax |
||
758 | mario79 | 640 | ; mov [CDSectorAddress],dword 15 |
2434 | Serge | 641 | mov [CDDataBuf_pointer], CDDataBuf |
5201 | serge | 642 | ;-------------------------------------- |
87 | mario79 | 643 | .start: |
2434 | Serge | 644 | inc dword [CDSectorAddress] |
645 | call ReadCDWRetr;_1 |
||
646 | cmp [DevErrorCode], 0 |
||
647 | jne .access_denied |
||
758 | mario79 | 648 | |
649 | .start_check: |
||
5201 | serge | 650 | ; checking for "lice" |
2434 | Serge | 651 | cmp [CDDataBuf+1], dword 'CD00' |
652 | jne .access_denied |
||
5201 | serge | 653 | |
2434 | Serge | 654 | cmp [CDDataBuf+5], byte '1' |
655 | jne .access_denied |
||
5201 | serge | 656 | ; sector is the terminator of set of descriptors volumes? |
2434 | Serge | 657 | cmp [CDDataBuf], byte 0xff |
658 | je .access_denied |
||
5201 | serge | 659 | ; sector is an additional and improved descriptor of volume? |
2434 | Serge | 660 | cmp [CDDataBuf], byte 0x2 |
661 | jne .start |
||
5201 | serge | 662 | ; sector is an additional descriptor of volume? |
2434 | Serge | 663 | cmp [CDDataBuf+6], byte 0x1 |
664 | jne .start |
||
758 | mario79 | 665 | |
5201 | serge | 666 | ; parameters of root directory |
667 | mov eax, [CDDataBuf+0x9c+2]; start of root directory |
||
2434 | Serge | 668 | mov [CDSectorAddress], eax |
5201 | serge | 669 | mov eax, [CDDataBuf+0x9c+10]; size of root directory |
2434 | Serge | 670 | cmp byte [esi], 0 |
671 | jnz @f |
||
5201 | serge | 672 | |
2434 | Serge | 673 | mov [cd_current_pointer_of_input], CDDataBuf+0x9c |
674 | jmp .done |
||
5201 | serge | 675 | ;-------------------------------------- |
87 | mario79 | 676 | @@: |
5201 | serge | 677 | ; start the search |
87 | mario79 | 678 | .mainloop: |
2434 | Serge | 679 | dec dword [CDSectorAddress] |
5201 | serge | 680 | ;-------------------------------------- |
87 | mario79 | 681 | .read_to_buffer: |
2434 | Serge | 682 | inc dword [CDSectorAddress] |
683 | mov [CDDataBuf_pointer], CDDataBuf |
||
5201 | serge | 684 | call ReadCDWRetr ; read sector of directory |
2434 | Serge | 685 | cmp [DevErrorCode], 0 |
686 | jne .access_denied |
||
5201 | serge | 687 | |
2434 | Serge | 688 | push ebp |
689 | call cd_find_name_in_buffer |
||
690 | pop ebp |
||
691 | jnc .found |
||
5201 | serge | 692 | |
2434 | Serge | 693 | sub eax, 2048 |
5201 | serge | 694 | ; directory is over? |
2434 | Serge | 695 | cmp eax, 0 |
696 | ja .read_to_buffer |
||
5201 | serge | 697 | ; desired element of chain is not found |
87 | mario79 | 698 | .access_denied: |
2434 | Serge | 699 | pop esi eax |
700 | mov [cd_appl_data], 1 |
||
701 | stc |
||
702 | ret |
||
5201 | serge | 703 | ;-------------------------------------- |
704 | ; desired element of chain found |
||
705 | .found: |
||
706 | ; the end of the file path |
||
2434 | Serge | 707 | cmp byte [esi-1], 0 |
708 | jz .done |
||
521 | diamond | 709 | .nested: |
2434 | Serge | 710 | mov eax, [cd_current_pointer_of_input] |
711 | push dword [eax+2] |
||
5201 | serge | 712 | pop dword [CDSectorAddress] ; beginning of the directory |
713 | mov eax, [eax+2+8] ; size of directory |
||
2434 | Serge | 714 | jmp .mainloop |
5201 | serge | 715 | ;-------------------------------------- |
716 | ; file pointer found |
||
717 | .done: |
||
2434 | Serge | 718 | test ebp, ebp |
719 | jz @f |
||
5201 | serge | 720 | |
2434 | Serge | 721 | mov esi, ebp |
722 | xor ebp, ebp |
||
723 | jmp .nested |
||
5201 | serge | 724 | ;-------------------------------------- |
521 | diamond | 725 | @@: |
2434 | Serge | 726 | pop esi eax |
727 | mov [cd_appl_data], 1 |
||
728 | clc |
||
729 | ret |
||
5201 | serge | 730 | ;----------------------------------------------------------------------------- |
87 | mario79 | 731 | cd_find_name_in_buffer: |
2434 | Serge | 732 | mov [cd_current_pointer_of_input_2], CDDataBuf |
5201 | serge | 733 | ;-------------------------------------- |
87 | mario79 | 734 | .start: |
2434 | Serge | 735 | call cd_get_name |
736 | jc .not_found |
||
5201 | serge | 737 | |
2434 | Serge | 738 | call cd_compare_name |
739 | jc .start |
||
5201 | serge | 740 | ;-------------------------------------- |
379 | serge | 741 | .found: |
2434 | Serge | 742 | clc |
743 | ret |
||
5201 | serge | 744 | ;-------------------------------------- |
87 | mario79 | 745 | .not_found: |
2434 | Serge | 746 | stc |
747 | ret |
||
5201 | serge | 748 | ;----------------------------------------------------------------------------- |
87 | mario79 | 749 | cd_get_name: |
2434 | Serge | 750 | push eax |
751 | mov ebp, [cd_current_pointer_of_input_2] |
||
752 | mov [cd_current_pointer_of_input], ebp |
||
753 | mov eax, [ebp] |
||
5201 | serge | 754 | test eax, eax ; entry's is over? |
2434 | Serge | 755 | jz .next_sector |
5201 | serge | 756 | |
757 | cmp ebp, CDDataBuf+2048 ; buffer is over? |
||
2434 | Serge | 758 | jae .next_sector |
5201 | serge | 759 | |
2434 | Serge | 760 | movzx eax, byte [ebp] |
5201 | serge | 761 | add [cd_current_pointer_of_input_2], eax ; next entry of directory |
762 | add ebp, 33; pointer is set to the beginning of the name |
||
2434 | Serge | 763 | pop eax |
764 | clc |
||
765 | ret |
||
5201 | serge | 766 | ;-------------------------------------- |
87 | mario79 | 767 | .next_sector: |
2434 | Serge | 768 | pop eax |
769 | stc |
||
770 | ret |
||
5201 | serge | 771 | ;----------------------------------------------------------------------------- |
87 | mario79 | 772 | cd_compare_name: |
773 | ; compares ASCIIZ-names, case-insensitive (cp866 encoding) |
||
774 | ; in: esi->name, ebp->name |
||
775 | ; out: if names match: ZF=1 and esi->next component of name |
||
776 | ; else: ZF=0, esi is not changed |
||
777 | ; destroys eax |
||
2434 | Serge | 778 | push esi eax edi |
779 | mov edi, ebp |
||
5201 | serge | 780 | ;-------------------------------------- |
87 | mario79 | 781 | .loop: |
2434 | Serge | 782 | cld |
783 | lodsb |
||
784 | push eax |
||
785 | call char_todown |
||
786 | call ansi2uni_char |
||
787 | xchg ah, al |
||
788 | scasw |
||
789 | pop eax |
||
790 | je .coincides |
||
791 | call char_toupper |
||
792 | call ansi2uni_char |
||
793 | xchg ah, al |
||
794 | sub edi, 2 |
||
795 | scasw |
||
796 | jne .name_not_coincide |
||
5201 | serge | 797 | ;-------------------------------------- |
87 | mario79 | 798 | .coincides: |
5201 | serge | 799 | cmp [esi], byte '/' ; path separator is end of current element |
2434 | Serge | 800 | je .done |
5201 | serge | 801 | |
802 | cmp [esi], byte 0 ; path separator end of name |
||
2434 | Serge | 803 | je .done |
5201 | serge | 804 | |
2434 | Serge | 805 | jmp .loop |
5201 | serge | 806 | ;-------------------------------------- |
87 | mario79 | 807 | .name_not_coincide: |
2434 | Serge | 808 | pop edi eax esi |
809 | stc |
||
810 | ret |
||
5201 | serge | 811 | ;-------------------------------------- |
87 | mario79 | 812 | .done: |
5201 | serge | 813 | ; check end of file |
814 | cmp [edi], word 3B00h; separator end of file ';' |
||
2434 | Serge | 815 | je .done_1 |
5201 | serge | 816 | ; check for files not ending with separator |
2434 | Serge | 817 | movzx eax, byte [ebp-33] |
818 | add eax, ebp |
||
819 | sub eax, 34 |
||
820 | cmp edi, eax |
||
821 | je .done_1 |
||
5201 | serge | 822 | ; check the end of directory |
2434 | Serge | 823 | movzx eax, byte [ebp-1] |
824 | add eax, ebp |
||
825 | cmp edi, eax |
||
826 | jne .name_not_coincide |
||
5201 | serge | 827 | ;-------------------------------------- |
87 | mario79 | 828 | .done_1: |
2434 | Serge | 829 | pop edi eax |
830 | add esp, 4 |
||
831 | inc esi |
||
832 | clc |
||
833 | ret |
||
5201 | serge | 834 | ;----------------------------------------------------------------------------- |
87 | mario79 | 835 | char_todown: |
836 | ; convert character to uppercase, using cp866 encoding |
||
837 | ; in: al=symbol |
||
838 | ; out: al=converted symbol |
||
2434 | Serge | 839 | cmp al, 'A' |
840 | jb .ret |
||
5201 | serge | 841 | |
2434 | Serge | 842 | cmp al, 'Z' |
843 | jbe .az |
||
5201 | serge | 844 | |
3555 | Serge | 845 | cmp al, 0x80 ; 'А' |
2434 | Serge | 846 | jb .ret |
5201 | serge | 847 | |
3555 | Serge | 848 | cmp al, 0x90 ; 'Р' |
2434 | Serge | 849 | jb .rus1 |
5201 | serge | 850 | |
3555 | Serge | 851 | cmp al, 0x9F ; 'Я' |
2434 | Serge | 852 | ja .ret |
87 | mario79 | 853 | ; 0x90-0x9F -> 0xE0-0xEF |
3555 | Serge | 854 | add al, 0xE0-0x90 |
5201 | serge | 855 | ;-------------------------------------- |
87 | mario79 | 856 | .ret: |
2434 | Serge | 857 | ret |
5201 | serge | 858 | ;-------------------------------------- |
87 | mario79 | 859 | .rus1: |
860 | ; 0x80-0x8F -> 0xA0-0xAF |
||
861 | .az: |
||
2434 | Serge | 862 | add al, 0x20 |
863 | ret |
||
5201 | serge | 864 | ;----------------------------------------------------------------------------- |
87 | mario79 | 865 | uni2ansi_char: |
866 | ; convert UNICODE character in al to ANSI character in ax, using cp866 encoding |
||
867 | ; in: ax=UNICODE character |
||
868 | ; out: al=converted ANSI character |
||
2434 | Serge | 869 | cmp ax, 0x80 |
870 | jb .ascii |
||
5201 | serge | 871 | |
2434 | Serge | 872 | cmp ax, 0x401 |
873 | jz .yo1 |
||
5201 | serge | 874 | |
2434 | Serge | 875 | cmp ax, 0x451 |
876 | jz .yo2 |
||
5201 | serge | 877 | |
2434 | Serge | 878 | cmp ax, 0x410 |
879 | jb .unk |
||
5201 | serge | 880 | |
2434 | Serge | 881 | cmp ax, 0x440 |
882 | jb .rus1 |
||
5201 | serge | 883 | |
2434 | Serge | 884 | cmp ax, 0x450 |
885 | jb .rus2 |
||
5201 | serge | 886 | ;-------------------------------------- |
87 | mario79 | 887 | .unk: |
2434 | Serge | 888 | mov al, '_' |
889 | jmp .doit |
||
5201 | serge | 890 | ;-------------------------------------- |
87 | mario79 | 891 | .yo1: |
3555 | Serge | 892 | mov al, 0xF0 ; 'Ё' in cp866 |
2434 | Serge | 893 | jmp .doit |
5201 | serge | 894 | ;-------------------------------------- |
87 | mario79 | 895 | .yo2: |
3555 | Serge | 896 | mov al, 0xF1 ; 'ё' in cp866 |
2434 | Serge | 897 | jmp .doit |
5201 | serge | 898 | ;-------------------------------------- |
87 | mario79 | 899 | .rus1: |
900 | ; 0x410-0x43F -> 0x80-0xAF |
||
2434 | Serge | 901 | add al, 0x70 |
902 | jmp .doit |
||
5201 | serge | 903 | ;-------------------------------------- |
87 | mario79 | 904 | .rus2: |
905 | ; 0x440-0x44F -> 0xE0-0xEF |
||
2434 | Serge | 906 | add al, 0xA0 |
5201 | serge | 907 | ;-------------------------------------- |
87 | mario79 | 908 | .ascii: |
909 | .doit: |
||
2434 | Serge | 910 | ret |
5201 | serge | 911 | ;----------------------------------------------------------------------------- |