Subversion Repositories Kolibri OS

Rev

Rev 75 | Rev 84 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ; System function 70 - files with long names (LFN)
  2. ; diamond, 2006
  3.  
  4. iglobal
  5. ; in this table names must be in lowercase
  6. rootdirs:
  7.         db      2,'rd'
  8.         dd      fs_OnRamdisk
  9.         dd      fs_NextRamdisk
  10.         db      7,'ramdisk'
  11.         dd      fs_OnRamdisk
  12.         dd      fs_NextRamdisk
  13.         db      2,'fd'
  14.         dd      fs_OnFloppy
  15.         dd      fs_NextFloppy
  16.         db      10,'floppydisk'
  17.         dd      fs_OnFloppy
  18.         dd      fs_NextFloppy
  19.         db      3,'hd0'
  20.         dd      fs_OnHd0
  21.         dd      fs_NextHd0
  22.         db      3,'hd1'
  23.         dd      fs_OnHd1
  24.         dd      fs_NextHd1
  25.         db      3,'hd2'
  26.         dd      fs_OnHd2
  27.         dd      fs_NextHd2
  28.         db      3,'hd3'
  29.         dd      fs_OnHd3
  30.         dd      fs_NextHd3
  31.         db      0
  32.  
  33. virtual_root_query:
  34.         dd      fs_HasRamdisk
  35.         db      'rd',0
  36.         dd      fs_HasFloppy
  37.         db      'fd',0
  38.         dd      fs_HasHd0
  39.         db      'hd0',0
  40.         dd      fs_HasHd1
  41.         db      'hd1',0
  42.         dd      fs_HasHd2
  43.         db      'hd2',0
  44.         dd      fs_HasHd3
  45.         db      'hd3',0
  46.         dd      0
  47. endg
  48.  
  49. file_system_lfn:
  50. ; in: eax->fileinfo block
  51. ; operation codes:
  52. ; 0 : read file
  53. ; 1 : read folder
  54. ; 2 : rewrite file - not implemented yet
  55. ; 3 : write/append to file - not implemented yet
  56. ; 4 : start application - not implemented yet
  57. ; 5 : delete file - not implemented yet
  58. ; 6 : create directory - not implemented yet
  59. ; 7 : rename file/directory - not implemented yet
  60. ; 8 : get file attributes structure - not implemented yet
  61.  
  62.         add     eax, std_application_base_address
  63. ; parse file name
  64.         xchg    ebx, eax
  65.         lea     esi, [ebx+20]
  66.         lodsb
  67.         cmp     al, '/'
  68.         jz      @f
  69. .notfound:
  70.         mov     dword [esp+36], 5       ; file not found
  71.         ret
  72. @@:
  73.         cmp     byte [esi], 0
  74.         jz      .rootdir
  75.         mov     edi, rootdirs-8
  76.         xor     ecx, ecx
  77.         push    esi
  78. .scan1:
  79.         pop     esi
  80.         add     edi, ecx
  81.         scasd
  82.         scasd
  83.         mov     cl, byte [edi]
  84.         jecxz   .notfound
  85.         inc     edi
  86.         push    esi
  87. @@:
  88.         lodsb
  89.         or      al, 20h
  90.         scasb
  91.         loopz   @b
  92.         jnz     .scan1
  93.         lodsb
  94.         cmp     al, '/'
  95.         jz      .found1
  96.         test    al, al
  97.         jnz     .scan1
  98.         pop     eax
  99. ; directory /xxx
  100. .maindir:
  101.         cmp     dword [ebx], 1
  102.         jnz     .access_denied
  103.         xor     eax, eax
  104.         mov     ebp, [ebx+12]
  105.         mov     edx, [ebx+16]
  106.         add     edx, std_application_base_address
  107.         push    dword [ebx+4]   ; first block
  108.         mov     ebx, [ebx+8]    ; flags
  109.         mov     esi, [edi+4]
  110. ; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
  111.         mov     edi, edx
  112.         mov     ecx, 32/4
  113.         rep     stosd
  114.         mov     byte [edx], 1   ; version
  115. .maindir_loop:
  116.         call    esi
  117.         jc      .maindir_done
  118.         inc     dword [edx+8]
  119.         dec     dword [esp]
  120.         jns     .maindir_loop
  121.         dec     ebp
  122.         js      .maindir_loop
  123.         inc     dword [edx+4]
  124.         mov     dword [edi], 0x10       ; attributes: folder
  125.         mov     dword [edi+4], 1        ; name type: UNICODE
  126.         push    eax
  127.         xor     eax, eax
  128.         add     edi, 8
  129.         mov     ecx, 40/4-2
  130.         rep     stosd
  131.         pop     eax
  132.         push    eax edx
  133. ; convert number in eax to decimal UNICODE string
  134.         push    edi
  135.         push    -'0'
  136.         mov     cl, 10
  137. @@:
  138.         xor     edx, edx
  139.         div     ecx
  140.         push    edx
  141.         test    eax, eax
  142.         jnz     @b
  143. @@:
  144.         pop     eax
  145.         add     al, '0'
  146.         stosb
  147.         test    bl, 1           ; UNICODE name?
  148.         jz      .ansi2
  149.         mov     byte [edi], 0
  150.         inc     edi
  151. .ansi2:
  152.         test    al, al
  153.         jnz     @b
  154.         mov     byte [edi-1], 0
  155.         pop     edi
  156. ; UNICODE name length is 520 bytes, ANSI - 264
  157.         add     edi, 520
  158.         test    bl, 1
  159.         jnz     @f
  160.         sub     edi, 520-264
  161. @@:
  162.         pop     edx eax
  163.         jmp     .maindir_loop
  164. .maindir_done:
  165.         pop     eax
  166.         mov     ebx, [edx+4]
  167.         xor     eax, eax
  168.         dec     ebp
  169.         js      @f
  170.         mov     al, ERROR_END_OF_FILE
  171. @@:
  172.         mov     [esp+36], eax
  173.         mov     [esp+24], ebx
  174.         ret
  175. ; directory /
  176. .rootdir:
  177.         cmp     dword [ebx], 1  ; read folder?
  178.         jz      .readroot
  179. .access_denied:
  180.         mov     dword [esp+36], 10      ; access denied
  181.         ret
  182.  
  183. .readroot:
  184. ; virtual root folder - special handler
  185.         mov     esi, virtual_root_query
  186.         mov     ebp, [ebx+12]
  187.         mov     edx, [ebx+16]
  188.         add     edx, std_application_base_address
  189.         push    dword [ebx+4]   ; first block
  190.         mov     ebx, [ebx+8]    ; flags
  191.         xor     eax, eax
  192. ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
  193.         mov     edi, edx
  194.         mov     ecx, 32/4
  195.         rep     stosd
  196.         mov     byte [edx], 1   ; version
  197. .readroot_loop:
  198.         cmp     dword [esi], eax
  199.         jz      .readroot_done
  200.         call    dword [esi]
  201.         add     esi, 4
  202.         test    eax, eax
  203.         jnz     @f
  204. .readroot_next:
  205.         or      ecx, -1
  206.         xchg    esi, edi
  207.         repnz   scasb
  208.         xchg    esi, edi
  209.         jmp     .readroot_loop
  210. @@:
  211.         xor     eax, eax
  212.         inc     dword [edx+8]
  213.         dec     dword [esp]
  214.         jns     .readroot_next
  215.         dec     ebp
  216.         js      .readroot_next
  217.         inc     dword [edx+4]
  218.         mov     dword [edi], 0x10       ; attributes: folder
  219.         mov     dword [edi+4], 1        ; name type: UNICODE
  220.         add     edi, 8
  221.         mov     ecx, 40/4-2
  222.         rep     stosd
  223.         push    edi
  224. @@:
  225.         lodsb
  226.         stosb
  227.         test    bl, 1
  228.         jz      .ansi
  229.         mov     byte [edi], 0
  230.         inc     edi
  231. .ansi:
  232.         test    eax, eax
  233.         jnz     @b
  234.         pop     edi
  235.         add     edi, 520
  236.         test    bl, 1
  237.         jnz     .readroot_loop
  238.         sub     edi, 520-264
  239.         jmp     .readroot_loop
  240. .readroot_done:
  241.         pop     eax
  242.         mov     ebx, [edx+4]
  243.         xor     eax, eax
  244.         dec     ebp
  245.         js      @f
  246.         mov     al, ERROR_END_OF_FILE
  247. @@:
  248.         mov     [esp+36], eax
  249.         mov     [esp+24], ebx
  250.         ret
  251.  
  252. .found1:
  253.         pop     eax
  254.         cmp     byte [esi], 0
  255.         jz      .maindir
  256. ; read partition number
  257.         xor     ecx, ecx
  258.         xor     eax, eax
  259. @@:
  260.         lodsb
  261.         cmp     al, '/'
  262.         jz      .done1
  263.         test    al, al
  264.         jz      .done1
  265.         sub     al, '0'
  266.         cmp     al, 9
  267.         ja      .notfound
  268.         imul    ecx, 10
  269.         add     ecx, eax
  270.         jmp     @b
  271. .done1:
  272.         test    ecx, ecx
  273.         jz      .notfound
  274.         test    al, al
  275.         jnz     @f
  276.         dec     esi
  277. @@:
  278. ; now [edi] contains handler address, ecx - partition number,
  279. ; esi points to ASCIIZ string - rest of name
  280.         jmp     dword [edi]
  281.  
  282. ; handlers for devices
  283. ; in: ecx = 0 => query virtual directory /xxx
  284. ; in: ecx = partition number
  285. ;     esi -> relative (for device) name
  286. ;     ebx -> fileinfo
  287. ; out: [esp+36]=image of eax, [esp+24]=image of ebx
  288.  
  289. fs_OnRamdisk:
  290.         cmp     ecx, 1
  291.         jnz     file_system_lfn.notfound
  292.         mov     eax, [ebx]
  293.         cmp     eax, 1
  294.         ja      .not_impl
  295.         mov     ecx, [ebx+12]
  296.         mov     edx, [ebx+16]
  297.         add     edx, std_application_base_address
  298.         add     ebx, 4
  299.         call    dword [fs_RamdiskServices + eax*4]
  300.         mov     [esp+36], eax
  301.         mov     [esp+24], ebx
  302.         ret
  303. .not_impl:
  304.         mov     dword [esp+36], 2       ; not implemented
  305.         ret
  306.  
  307. fs_RamdiskServices:
  308.         dd      fs_RamdiskRead
  309.         dd      fs_RamdiskReadFolder
  310.  
  311. fs_OnFloppy:
  312.         cmp     ecx, 2
  313.         ja      file_system_lfn.notfound
  314.         mov     eax, [ebx]
  315.         cmp     eax, 1
  316.         ja      fs_OnRamdisk.not_impl
  317.         call    reserve_flp
  318.         mov     [flp_number], cl
  319.         mov     ecx, [ebx+12]
  320.         mov     edx, [ebx+16]
  321.         add     edx, std_application_base_address
  322.         add     ebx, 4
  323.         call    dword [fs_FloppyServices + eax*4]
  324.         and     [flp_status], 0
  325.         mov     [esp+36], eax
  326.         mov     [esp+24], ebx
  327.         ret
  328.  
  329. fs_FloppyServices:
  330.         dd      fs_FloppyRead
  331.         dd      fs_FloppyReadFolder
  332.  
  333. fs_OnHd0:
  334.         call    reserve_hd1
  335.         mov     [hdbase], 0x1F0
  336.         mov     [hdid], 0
  337.         push    1
  338.         jmp     fs_OnHd
  339. fs_OnHd1:
  340.         call    reserve_hd1
  341.         mov     [hdbase], 0x1F0
  342.         mov     [hdid], 0x10
  343.         push    2
  344.         jmp     fs_OnHd
  345. fs_OnHd2:
  346.         call    reserve_hd1
  347.         mov     [hdbase], 0x170
  348.         mov     [hdid], 0
  349.         push    3
  350.         jmp     fs_OnHd
  351. fs_OnHd3:
  352.         call    reserve_hd1
  353.         mov     [hdbase], 0x170
  354.         mov     [hdid], 0x10
  355.         push    4
  356. fs_OnHd:
  357.         pop     eax
  358.         mov     [hdpos], eax
  359.         cmp     ecx, 0x100
  360.         jae     .nf
  361.         cmp     cl, [0x40001+eax]
  362.         jbe     @f
  363. .nf:
  364.         and     [hd1_status], 0
  365.         mov     dword [esp+36], 5       ; not found
  366.         ret
  367. @@:
  368.         mov     [fat32part], ecx
  369.         push    ebx esi
  370.         call    choice_necessity_partition_1
  371.         pop     esi ebx
  372.         mov     ecx, [ebx+12]
  373.         mov     edx, [ebx+16]
  374.         add     edx, std_application_base_address
  375.         mov     eax, [ebx]
  376.         cmp     eax, 1
  377.         ja      .not_impl
  378.         add     ebx, 4
  379.         call    dword [fs_HdServices + eax*4]
  380.         and     [hd1_status], 0
  381.         mov     [esp+36], eax
  382.         mov     [esp+24], ebx
  383.         ret
  384. .not_impl:
  385.         and     [hd1_status], 0
  386.         mov     dword [esp+36], 2       ; not implemented
  387.         ret
  388.  
  389. fs_HdServices:
  390.         dd      fs_HdRead
  391.         dd      fs_HdReadFolder
  392.  
  393. fs_HasRamdisk:
  394.         mov     al, 1   ; we always have ramdisk
  395.         ret
  396.  
  397. fs_HasFloppy:
  398.         cmp     byte [0x40000], 0
  399.         setnz   al
  400.         ret
  401.  
  402. fs_HasHd0:
  403.         mov     al, [0x40001]
  404.         and     al, 11000000b
  405.         cmp     al, 01000000b
  406.         setz    al
  407.         ret
  408. fs_HasHd1:
  409.         mov     al, [0x40001]
  410.         and     al, 00110000b
  411.         cmp     al, 00010000b
  412.         setz    al
  413.         ret
  414. fs_HasHd2:
  415.         mov     al, [0x40001]
  416.         and     al, 00001100b
  417.         cmp     al, 00000100b
  418.         setz    al
  419.         ret
  420. fs_HasHd3:
  421.         mov     al, [0x40001]
  422.         and     al, 00000011b
  423.         cmp     al, 00000001b
  424.         setz    al
  425.         ret
  426.  
  427. ; fs_NextXXX functions:
  428. ; in: eax = partition number, from which start to scan
  429. ; out: CF=1 => no more partitions
  430. ;      CF=0 => eax=next partition number
  431.  
  432. fs_NextRamdisk:
  433. ; we always have /rd/1
  434.         test    eax, eax
  435.         stc
  436.         jnz     @f
  437.         mov     al, 1
  438.         clc
  439. @@:
  440.         ret
  441.  
  442. fs_NextFloppy:
  443. ; we have /fd/1 iff (([0x40000] and 0xF0) != 0) and /fd/2 iff (([0x40000] and 0x0F) != 0)
  444.         test    byte [0x40000], 0xF0
  445.         jz      .no1
  446.         test    eax, eax
  447.         jnz     .no1
  448.         inc     eax
  449.         ret     ; CF cleared
  450. .no1:
  451.         test    byte [0x40000], 0x0F
  452.         jz      .no2
  453.         cmp     al, 2
  454.         jae     .no2
  455.         mov     al, 2
  456.         clc
  457.         ret
  458. .no2:
  459.         stc
  460.         ret
  461.  
  462. ; on hdx, we have partitions from 1 to [0x40002+x]
  463. fs_NextHd0:
  464.         push    0
  465.         jmp     fs_NextHd
  466. fs_NextHd1:
  467.         push    1
  468.         jmp     fs_NextHd
  469. fs_NextHd2:
  470.         push    2
  471.         jmp     fs_NextHd
  472. fs_NextHd3:
  473.         push    3
  474. fs_NextHd:
  475.         pop     ecx
  476.         movzx   ecx, byte [0x40002+ecx]
  477.         cmp     eax, ecx
  478.         jae     fs_NextFloppy.no2
  479.         inc     eax
  480.         clc
  481.         ret
  482.