Rev 3908 | Rev 5201 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 3908 | Rev 4287 | ||
---|---|---|---|
Line 3... | Line 3... | ||
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 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
Line 7... | Line 7... | ||
7 | 7 | ||
Line 8... | Line 8... | ||
8 | $Revision: 3908 $ |
8 | $Revision: 4287 $ |
9 | 9 | ||
10 | ERROR_SUCCESS = 0 |
10 | ERROR_SUCCESS = 0 |
11 | ERROR_DISK_BASE = 1 |
11 | ERROR_DISK_BASE = 1 |
Line 28... | Line 28... | ||
28 | ; diamond, 2006 |
28 | ; diamond, 2006 |
Line 29... | Line 29... | ||
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: |
- | |
33 | db 2,'rd' |
- | |
34 | dd fs_OnRamdisk |
- | |
35 | dd fs_NextRamdisk |
- | |
36 | db 7,'ramdisk' |
- | |
37 | dd fs_OnRamdisk |
- | |
38 | dd fs_NextRamdisk |
- | |
39 | db 2,'fd' |
- | |
40 | dd fs_OnFloppy |
- | |
41 | dd fs_NextFloppy |
- | |
42 | db 10,'floppydisk' |
- | |
43 | dd fs_OnFloppy |
- | |
44 | dd fs_NextFloppy |
32 | rootdirs: |
45 | ;********************************************** |
33 | ;********************************************** |
46 | db 3,'cd0' |
34 | db 3,'cd0' |
47 | dd fs_OnCd0 |
35 | dd fs_OnCd0 |
48 | dd fs_NextCd |
36 | dd fs_NextCd |
Line 58... | Line 46... | ||
58 | ;*********************************************** |
46 | ;*********************************************** |
59 | db 0 |
47 | db 0 |
Line 60... | Line 48... | ||
60 | 48 | ||
61 | - | ||
62 | virtual_root_query: |
- | |
63 | dd fs_HasRamdisk |
- | |
64 | db 'rd',0 |
- | |
65 | dd fs_HasFloppy |
49 | |
66 | db 'fd',0 |
50 | virtual_root_query: |
67 | ;********************************************** |
51 | ;********************************************** |
68 | dd fs_HasCd0 |
52 | dd fs_HasCd0 |
69 | db 'cd0',0 |
53 | db 'cd0',0 |
Line 73... | Line 57... | ||
73 | db 'cd2',0 |
57 | db 'cd2',0 |
74 | dd fs_HasCd3 |
58 | dd fs_HasCd3 |
75 | db 'cd3',0 |
59 | db 'cd3',0 |
76 | ;********************************************** |
60 | ;********************************************** |
77 | dd 0 |
61 | dd 0 |
78 | - | ||
79 | fs_additional_handlers: |
- | |
80 | dd dyndisk_handler, dyndisk_enum_root |
- | |
81 | ; add new handlers here |
- | |
82 | dd 0 |
- | |
83 | - | ||
84 | endg |
62 | endg |
Line 85... | Line 63... | ||
85 | 63 | ||
86 | file_system_lfn_protected: |
64 | file_system_lfn_protected: |
87 | pushad |
65 | pushad |
Line 255... | Line 233... | ||
255 | mov dword [image_of_eax], 10 ; access denied |
233 | mov dword [image_of_eax], 10 ; access denied |
256 | ret |
234 | ret |
Line 257... | Line 235... | ||
257 | 235 | ||
258 | .readroot: |
236 | .readroot: |
259 | ; virtual root folder - special handler |
- | |
260 | mov esi, virtual_root_query |
237 | ; virtual root folder - special handler |
261 | mov ebp, [ebx+12] |
238 | mov ebp, [ebx+12] |
262 | mov edx, [ebx+16] |
239 | mov edx, [ebx+16] |
263 | ; add edx, std_application_base_address |
240 | ; add edx, std_application_base_address |
264 | push dword [ebx+4] ; first block |
241 | push dword [ebx+4] ; first block |
Line 267... | Line 244... | ||
267 | ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area |
244 | ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area |
268 | mov edi, edx |
245 | mov edi, edx |
269 | mov ecx, 32/4 |
246 | mov ecx, 32/4 |
270 | rep stosd |
247 | rep stosd |
271 | mov byte [edx], 1 ; version |
248 | mov byte [edx], 1 ; version |
- | 249 | sub esp, 16 |
|
- | 250 | .readroot_ah_loop2: |
|
- | 251 | push edi |
|
- | 252 | lea edi, [esp+4] |
|
- | 253 | call dyndisk_enum_root |
|
- | 254 | pop edi |
|
- | 255 | test eax, eax |
|
- | 256 | jz .readroot_done_dynamic |
|
- | 257 | inc dword [edx+8] |
|
- | 258 | dec dword [esp+16] |
|
- | 259 | jns .readroot_ah_loop2 |
|
- | 260 | dec ebp |
|
- | 261 | js .readroot_ah_loop2 |
|
- | 262 | push eax |
|
- | 263 | xor eax, eax |
|
- | 264 | inc dword [edx+4] |
|
- | 265 | mov dword [edi], 0x10 ; attributes: folder |
|
- | 266 | mov dword [edi+4], ebx |
|
- | 267 | add edi, 8 |
|
- | 268 | mov ecx, 40/4-2 |
|
- | 269 | rep stosd |
|
- | 270 | push esi edi |
|
- | 271 | lea esi, [esp+12] |
|
- | 272 | @@: |
|
- | 273 | lodsb |
|
- | 274 | stosb |
|
- | 275 | test bl, 1 |
|
- | 276 | jz .ansi3 |
|
- | 277 | mov byte [edi], 0 |
|
- | 278 | inc edi |
|
- | 279 | .ansi3: |
|
- | 280 | test al, al |
|
- | 281 | jnz @b |
|
- | 282 | pop edi esi eax |
|
- | 283 | add edi, 520 |
|
- | 284 | test bl, 1 |
|
- | 285 | jnz .readroot_ah_loop2 |
|
- | 286 | sub edi, 520-264 |
|
- | 287 | jmp .readroot_ah_loop2 |
|
- | 288 | .readroot_done_dynamic: |
|
- | 289 | add esp, 16 |
|
- | 290 | mov esi, virtual_root_query |
|
272 | .readroot_loop: |
291 | .readroot_loop: |
273 | cmp dword [esi], eax |
292 | cmp dword [esi], eax |
274 | jz .readroot_done_static |
293 | jz .readroot_done |
275 | call dword [esi] |
294 | call dword [esi] |
276 | add esi, 4 |
295 | add esi, 4 |
277 | test eax, eax |
296 | test eax, eax |
278 | jnz @f |
297 | jnz @f |
279 | .readroot_next: |
298 | .readroot_next: |
Line 310... | Line 329... | ||
310 | add edi, 520 |
329 | add edi, 520 |
311 | test bl, 1 |
330 | test bl, 1 |
312 | jnz .readroot_loop |
331 | jnz .readroot_loop |
313 | sub edi, 520-264 |
332 | sub edi, 520-264 |
314 | jmp .readroot_loop |
333 | jmp .readroot_loop |
315 | .readroot_done_static: |
- | |
316 | mov esi, fs_additional_handlers-8 |
- | |
317 | sub esp, 16 |
- | |
318 | .readroot_ah_loop: |
- | |
319 | add esi, 8 |
- | |
320 | cmp dword [esi], 0 |
- | |
321 | jz .readroot_done |
- | |
322 | xor eax, eax |
- | |
323 | .readroot_ah_loop2: |
- | |
324 | push edi |
- | |
325 | lea edi, [esp+4] |
- | |
326 | call dword [esi+4] |
- | |
327 | pop edi |
- | |
328 | test eax, eax |
- | |
329 | jz .readroot_ah_loop |
- | |
330 | inc dword [edx+8] |
- | |
331 | dec dword [esp+16] |
- | |
332 | jns .readroot_ah_loop2 |
- | |
333 | dec ebp |
- | |
334 | js .readroot_ah_loop2 |
- | |
335 | push eax |
- | |
336 | xor eax, eax |
- | |
337 | inc dword [edx+4] |
- | |
338 | mov dword [edi], 0x10 ; attributes: folder |
- | |
339 | mov dword [edi+4], ebx |
- | |
340 | add edi, 8 |
- | |
341 | mov ecx, 40/4-2 |
- | |
342 | rep stosd |
- | |
343 | push esi edi |
- | |
344 | lea esi, [esp+12] |
- | |
345 | @@: |
- | |
346 | lodsb |
- | |
347 | stosb |
- | |
348 | test bl, 1 |
- | |
349 | jz .ansi3 |
- | |
350 | mov byte [edi], 0 |
- | |
351 | inc edi |
- | |
352 | .ansi3: |
- | |
353 | test al, al |
- | |
354 | jnz @b |
- | |
355 | pop edi esi eax |
- | |
356 | add edi, 520 |
- | |
357 | test bl, 1 |
- | |
358 | jnz .readroot_ah_loop2 |
- | |
359 | sub edi, 520-264 |
- | |
360 | jmp .readroot_ah_loop2 |
- | |
361 | .readroot_done: |
334 | .readroot_done: |
362 | add esp, 16 |
- | |
363 | pop eax |
335 | pop eax |
364 | mov ebx, [edx+4] |
336 | mov ebx, [edx+4] |
365 | xor eax, eax |
337 | xor eax, eax |
366 | dec ebp |
338 | dec ebp |
367 | js @f |
339 | js @f |
Line 369... | Line 341... | ||
369 | @@: |
341 | @@: |
370 | mov [image_of_eax], eax |
342 | mov [image_of_eax], eax |
371 | mov [image_of_ebx], ebx |
343 | mov [image_of_ebx], ebx |
372 | ret |
344 | ret |
373 | .notfound_try: |
345 | .notfound_try: |
374 | mov edi, fs_additional_handlers |
- | |
375 | @@: |
- | |
376 | cmp dword [edi], 0 |
- | |
377 | jz .notfound |
- | |
378 | call dword [edi] |
346 | call dyndisk_handler |
379 | scasd |
- | |
380 | scasd |
- | |
381 | jmp @b |
- | |
382 | .notfound: |
347 | .notfound: |
383 | mov dword [image_of_eax], ERROR_FILE_NOT_FOUND |
348 | mov dword [image_of_eax], ERROR_FILE_NOT_FOUND |
384 | and dword [image_of_ebx], 0 |
349 | and dword [image_of_ebx], 0 |
385 | ret |
350 | ret |
Line 434... | Line 399... | ||
434 | ; esi -> relative (for device) name |
399 | ; esi -> relative (for device) name |
435 | ; ebx -> fileinfo |
400 | ; ebx -> fileinfo |
436 | ; ebp = 0 or pointer to rest of name from folder addressed by esi |
401 | ; ebp = 0 or pointer to rest of name from folder addressed by esi |
437 | ; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx |
402 | ; out: [image_of_eax]=image of eax, [image_of_ebx]=image of ebx |
Line 438... | Line -... | ||
438 | - | ||
439 | fs_OnRamdisk: |
- | |
440 | cmp ecx, 1 |
- | |
441 | jnz file_system_lfn.notfound |
- | |
442 | mov eax, [ebx] |
- | |
443 | cmp eax, fs_NumRamdiskServices |
- | |
444 | jae .not_impl |
- | |
445 | mov ecx, [ebx+12] |
- | |
446 | mov edx, [ebx+16] |
- | |
447 | ; add edx, std_application_base_address |
- | |
448 | add ebx, 4 |
- | |
449 | call dword [fs_RamdiskServices + eax*4] |
- | |
450 | mov [image_of_eax], eax |
- | |
451 | mov [image_of_ebx], ebx |
- | |
452 | ret |
- | |
453 | .not_impl: |
- | |
454 | mov dword [image_of_eax], 2 ; not implemented |
- | |
455 | ret |
- | |
456 | 403 | ||
457 | fs_NotImplemented: |
404 | fs_NotImplemented: |
458 | mov eax, 2 |
405 | mov eax, 2 |
Line 459... | Line -... | ||
459 | ret |
- | |
460 | - | ||
461 | fs_RamdiskServices: |
- | |
462 | dd fs_RamdiskRead |
- | |
463 | dd fs_RamdiskReadFolder |
- | |
464 | dd fs_RamdiskRewrite |
- | |
465 | dd fs_RamdiskWrite |
- | |
466 | dd fs_RamdiskSetFileEnd |
- | |
467 | dd fs_RamdiskGetFileInfo |
- | |
468 | dd fs_RamdiskSetFileInfo |
- | |
469 | dd 0 |
- | |
470 | dd fs_RamdiskDelete |
- | |
471 | dd fs_RamdiskCreateFolder |
- | |
472 | fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4 |
- | |
473 | - | ||
474 | fs_OnFloppy: |
- | |
475 | cmp ecx, 2 |
- | |
476 | ja file_system_lfn.notfound |
- | |
477 | mov eax, [ebx] |
- | |
478 | cmp eax, fs_NumFloppyServices |
- | |
479 | jae fs_OnRamdisk.not_impl |
- | |
480 | call reserve_flp |
- | |
481 | mov [flp_number], cl |
- | |
482 | mov ecx, [ebx+12] |
- | |
483 | mov edx, [ebx+16] |
- | |
484 | ; add edx, std_application_base_address |
- | |
485 | add ebx, 4 |
- | |
486 | call dword [fs_FloppyServices + eax*4] |
- | |
487 | and [flp_status], 0 |
- | |
488 | mov [image_of_eax], eax |
- | |
489 | mov [image_of_ebx], ebx |
- | |
490 | ret |
- | |
491 | - | ||
492 | fs_FloppyServices: |
- | |
493 | dd fs_FloppyRead |
- | |
494 | dd fs_FloppyReadFolder |
- | |
495 | dd fs_FloppyRewrite |
- | |
496 | dd fs_FloppyWrite |
- | |
497 | dd fs_FloppySetFileEnd |
- | |
498 | dd fs_FloppyGetFileInfo |
- | |
499 | dd fs_FloppySetFileInfo |
- | |
500 | dd 0 |
- | |
501 | dd fs_FloppyDelete |
- | |
502 | dd fs_FloppyCreateFolder |
- | |
503 | fs_NumFloppyServices = ($ - fs_FloppyServices)/4 |
406 | ret |
504 | 407 | ||
505 | ;******************************************************* |
408 | ;******************************************************* |
506 | fs_OnCd0: |
409 | fs_OnCd0: |
507 | call reserve_cd |
410 | call reserve_cd |
Line 582... | Line 485... | ||
582 | dd fs_NotImplemented |
485 | dd fs_NotImplemented |
583 | dd fs_NotImplemented |
486 | dd fs_NotImplemented |
584 | fs_NumCdServices = ($ - fs_CdServices)/4 |
487 | fs_NumCdServices = ($ - fs_CdServices)/4 |
Line 585... | Line 488... | ||
585 | 488 | ||
586 | ;******************************************************* |
- | |
587 | - | ||
588 | fs_HasRamdisk: |
- | |
589 | mov al, 1 ; we always have ramdisk |
- | |
590 | ret |
- | |
591 | fs_HasFloppy: |
- | |
592 | cmp byte [DRIVE_DATA], 0 |
- | |
593 | setnz al |
- | |
594 | ret |
- | |
595 | - | ||
596 | ;******************************************************* |
489 | ;******************************************************* |
597 | fs_HasCd0: |
490 | fs_HasCd0: |
598 | test byte [DRIVE_DATA+1], 10000000b |
491 | test byte [DRIVE_DATA+1], 10000000b |
599 | setnz al |
492 | setnz al |
600 | ret |
493 | ret |
Line 615... | Line 508... | ||
615 | ; fs_NextXXX functions: |
508 | ; fs_NextXXX functions: |
616 | ; in: eax = partition number, from which start to scan |
509 | ; in: eax = partition number, from which start to scan |
617 | ; out: CF=1 => no more partitions |
510 | ; out: CF=1 => no more partitions |
618 | ; CF=0 => eax=next partition number |
511 | ; CF=0 => eax=next partition number |
Line 619... | Line -... | ||
619 | - | ||
620 | fs_NextRamdisk: |
- | |
621 | ; we always have /rd/1 |
- | |
622 | test eax, eax |
- | |
623 | stc |
- | |
624 | jnz @f |
- | |
625 | mov al, 1 |
- | |
626 | clc |
- | |
627 | @@: |
- | |
628 | ret |
- | |
629 | - | ||
630 | fs_NextFloppy: |
- | |
631 | ; we have /fd/1 iff (([DRIVE_DATA] and 0xF0) != 0) and /fd/2 iff (([DRIVE_DATA] and 0x0F) != 0) |
- | |
632 | test byte [DRIVE_DATA], 0xF0 |
- | |
633 | jz .no1 |
- | |
634 | test eax, eax |
- | |
635 | jnz .no1 |
- | |
636 | inc eax |
- | |
637 | ret ; CF cleared |
- | |
638 | .no1: |
- | |
639 | test byte [DRIVE_DATA], 0x0F |
- | |
640 | jz .no2 |
- | |
641 | cmp al, 2 |
- | |
642 | jae .no2 |
- | |
643 | mov al, 2 |
- | |
644 | clc |
- | |
645 | ret |
- | |
646 | .no2: |
- | |
647 | stc |
- | |
648 | ret |
- | |
649 | 512 | ||
650 | ;******************************************************* |
513 | ;******************************************************* |
651 | fs_NextCd: |
514 | fs_NextCd: |
652 | ; we always have /cdX/1 |
515 | ; we always have /cdX/1 |
653 | test eax, eax |
516 | test eax, eax |