Subversion Repositories Kolibri OS

Rev

Rev 133 | Rev 237 | 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. ;**********************************************
  32.         db      3,'cd0'
  33.         dd      fs_OnCd0
  34.         dd      fs_NextCd
  35.         db      3,'cd1'
  36.         dd      fs_OnCd1
  37.         dd      fs_NextCd
  38.         db      3,'cd2'
  39.         dd      fs_OnCd2
  40.         dd      fs_NextCd
  41.         db      3,'cd3'
  42.         dd      fs_OnCd3
  43.         dd      fs_NextCd
  44. ;***********************************************        
  45.         db      0
  46.  
  47.  
  48. virtual_root_query:
  49.         dd      fs_HasRamdisk
  50.         db      'rd',0
  51.         dd      fs_HasFloppy
  52.         db      'fd',0
  53.         dd      fs_HasHd0
  54.         db      'hd0',0
  55.         dd      fs_HasHd1
  56.         db      'hd1',0
  57.         dd      fs_HasHd2
  58.         db      'hd2',0
  59.         dd      fs_HasHd3
  60.         db      'hd3',0
  61. ;**********************************************
  62.         dd      fs_HasCd0
  63.         db      'cd0',0
  64.         dd      fs_HasCd1
  65.         db      'cd1',0
  66.         dd      fs_HasCd2
  67.         db      'cd2',0
  68.         dd      fs_HasCd3
  69.         db      'cd3',0
  70. ;**********************************************
  71.         dd      0
  72. endg
  73.  
  74. file_system_lfn:
  75. ; in: eax->fileinfo block
  76. ; operation codes:
  77. ; 0 : read file
  78. ; 1 : read folder
  79. ; 2 : create/rewrite file
  80. ; 3 : write/append to file
  81. ; 4 : set end of file
  82. ; 5 : get file/directory attributes structure
  83. ; 6 : set file/directory attributes structure
  84. ; 7 : start application
  85. ; 8 : delete file
  86. ; 9 : create directory - not implemented yet
  87.  
  88.         add     eax, std_application_base_address
  89. ; parse file name
  90.         xchg    ebx, eax
  91.         lea     esi, [ebx+20]
  92.         mov     ebp, esi        ; for 'start app' function full path must be known
  93.         lodsb
  94.         test    al, al
  95.         jnz     @f
  96.         mov     esi, [esi]
  97.         add     esi, std_application_base_address
  98.         mov     ebp, esi
  99.         lodsb
  100. @@:
  101.         cmp     al, '/'
  102.         jz      @f
  103. .notfound:
  104.         mov     dword [esp+36], 5       ; file not found
  105.         ret
  106. @@:
  107.         cmp     byte [esi], 0
  108.         jz      .rootdir
  109.         mov     edi, rootdirs-8
  110.         xor     ecx, ecx
  111.         push    esi
  112. .scan1:
  113.         pop     esi
  114.         add     edi, ecx
  115.         scasd
  116.         scasd
  117.         mov     cl, byte [edi]
  118.         jecxz   .notfound
  119.         inc     edi
  120.         push    esi
  121. @@:
  122.         lodsb
  123.         or      al, 20h
  124.         scasb
  125.         loopz   @b
  126.         jnz     .scan1
  127.         lodsb
  128.         cmp     al, '/'
  129.         jz      .found1
  130.         test    al, al
  131.         jnz     .scan1
  132.         pop     eax
  133. ; directory /xxx
  134. .maindir:
  135.         cmp     dword [ebx], 1
  136.         jnz     .access_denied
  137.         xor     eax, eax
  138.         mov     ebp, [ebx+12]
  139.         mov     edx, [ebx+16]
  140.         add     edx, std_application_base_address
  141.         push    dword [ebx+4]   ; first block
  142.         mov     ebx, [ebx+8]    ; flags
  143.         mov     esi, [edi+4]
  144. ; ebx=flags, [esp]=first block, ebp=number of blocks, edx=return area, esi='Next' handler
  145.         mov     edi, edx
  146.         mov     ecx, 32/4
  147.         rep     stosd
  148.         mov     byte [edx], 1   ; version
  149. .maindir_loop:
  150.         call    esi
  151.         jc      .maindir_done
  152.         inc     dword [edx+8]
  153.         dec     dword [esp]
  154.         jns     .maindir_loop
  155.         dec     ebp
  156.         js      .maindir_loop
  157.         inc     dword [edx+4]
  158.         mov     dword [edi], 0x10       ; attributes: folder
  159.         mov     dword [edi+4], 1        ; name type: UNICODE
  160.         push    eax
  161.         xor     eax, eax
  162.         add     edi, 8
  163.         mov     ecx, 40/4-2
  164.         rep     stosd
  165.         pop     eax
  166.         push    eax edx
  167. ; convert number in eax to decimal UNICODE string
  168.         push    edi
  169.         push    -'0'
  170.         mov     cl, 10
  171. @@:
  172.         xor     edx, edx
  173.         div     ecx
  174.         push    edx
  175.         test    eax, eax
  176.         jnz     @b
  177. @@:
  178.         pop     eax
  179.         add     al, '0'
  180.         stosb
  181.         test    bl, 1           ; UNICODE name?
  182.         jz      .ansi2
  183.         mov     byte [edi], 0
  184.         inc     edi
  185. .ansi2:
  186.         test    al, al
  187.         jnz     @b
  188.         mov     byte [edi-1], 0
  189.         pop     edi
  190. ; UNICODE name length is 520 bytes, ANSI - 264
  191.         add     edi, 520
  192.         test    bl, 1
  193.         jnz     @f
  194.         sub     edi, 520-264
  195. @@:
  196.         pop     edx eax
  197.         jmp     .maindir_loop
  198. .maindir_done:
  199.         pop     eax
  200.         mov     ebx, [edx+4]
  201.         xor     eax, eax
  202.         dec     ebp
  203.         js      @f
  204.         mov     al, ERROR_END_OF_FILE
  205. @@:
  206.         mov     [esp+36], eax
  207.         mov     [esp+24], ebx
  208.         ret
  209. ; directory /
  210. .rootdir:
  211.         cmp     dword [ebx], 1  ; read folder?
  212.         jz      .readroot
  213. .access_denied:
  214.         mov     dword [esp+36], 10      ; access denied
  215.         ret
  216.  
  217. .readroot:
  218. ; virtual root folder - special handler
  219.         mov     esi, virtual_root_query
  220.         mov     ebp, [ebx+12]
  221.         mov     edx, [ebx+16]
  222.         add     edx, std_application_base_address
  223.         push    dword [ebx+4]   ; first block
  224.         mov     ebx, [ebx+8]    ; flags
  225.         xor     eax, eax
  226. ; eax=0, [esp]=first block, ebx=flags, ebp=number of blocks, edx=return area
  227.         mov     edi, edx
  228.         mov     ecx, 32/4
  229.         rep     stosd
  230.         mov     byte [edx], 1   ; version
  231. .readroot_loop:
  232.         cmp     dword [esi], eax
  233.         jz      .readroot_done
  234.         call    dword [esi]
  235.         add     esi, 4
  236.         test    eax, eax
  237.         jnz     @f
  238. .readroot_next:
  239.         or      ecx, -1
  240.         xchg    esi, edi
  241.         repnz   scasb
  242.         xchg    esi, edi
  243.         jmp     .readroot_loop
  244. @@:
  245.         xor     eax, eax
  246.         inc     dword [edx+8]
  247.         dec     dword [esp]
  248.         jns     .readroot_next
  249.         dec     ebp
  250.         js      .readroot_next
  251.         inc     dword [edx+4]
  252.         mov     dword [edi], 0x10       ; attributes: folder
  253.         mov     dword [edi+4], 1        ; name type: UNICODE
  254.         add     edi, 8
  255.         mov     ecx, 40/4-2
  256.         rep     stosd
  257.         push    edi
  258. @@:
  259.         lodsb
  260.         stosb
  261.         test    bl, 1
  262.         jz      .ansi
  263.         mov     byte [edi], 0
  264.         inc     edi
  265. .ansi:
  266.         test    eax, eax
  267.         jnz     @b
  268.         pop     edi
  269.         add     edi, 520
  270.         test    bl, 1
  271.         jnz     .readroot_loop
  272.         sub     edi, 520-264
  273.         jmp     .readroot_loop
  274. .readroot_done:
  275.         pop     eax
  276.         mov     ebx, [edx+4]
  277.         xor     eax, eax
  278.         dec     ebp
  279.         js      @f
  280.         mov     al, ERROR_END_OF_FILE
  281. @@:
  282.         mov     [esp+36], eax
  283.         mov     [esp+24], ebx
  284.         ret
  285.  
  286. .found1:
  287.         pop     eax
  288.         cmp     byte [esi], 0
  289.         jz      .maindir
  290. ; read partition number
  291.         xor     ecx, ecx
  292.         xor     eax, eax
  293. @@:
  294.         lodsb
  295.         cmp     al, '/'
  296.         jz      .done1
  297.         test    al, al
  298.         jz      .done1
  299.         sub     al, '0'
  300.         cmp     al, 9
  301.         ja      .notfound
  302.         imul    ecx, 10
  303.         add     ecx, eax
  304.         jmp     @b
  305. .done1:
  306.         test    ecx, ecx
  307.         jz      .notfound
  308.         test    al, al
  309.         jnz     @f
  310.         dec     esi
  311. @@:
  312. ; now [edi] contains handler address, ecx - partition number,
  313. ; esi points to ASCIIZ string - rest of name
  314.         jmp     dword [edi]
  315.  
  316. ; handlers for devices
  317. ; in: ecx = 0 => query virtual directory /xxx
  318. ; in: ecx = partition number
  319. ;     esi -> relative (for device) name
  320. ;     ebx -> fileinfo
  321. ; out: [esp+36]=image of eax, [esp+24]=image of ebx
  322.  
  323. fs_OnRamdisk:
  324.         cmp     ecx, 1
  325.         jnz     file_system_lfn.notfound
  326.         mov     eax, [ebx]
  327.         cmp     eax, fs_NumRamdiskServices
  328.         jae     .not_impl
  329.         mov     ecx, [ebx+12]
  330.         mov     edx, [ebx+16]
  331.         add     edx, std_application_base_address
  332.         add     ebx, 4
  333.         call    dword [fs_RamdiskServices + eax*4]
  334.         mov     [esp+36], eax
  335.         mov     [esp+24], ebx
  336.         ret
  337. .not_impl:
  338.         mov     dword [esp+36], 2       ; not implemented
  339.         ret
  340.  
  341. fs_NotImplemented:
  342.         mov     eax, 2
  343.         ret
  344.  
  345. fs_RamdiskServices:
  346.         dd      fs_RamdiskRead
  347.         dd      fs_RamdiskReadFolder
  348.         dd      fs_RamdiskRewrite
  349.         dd      fs_RamdiskWrite
  350.         dd      fs_RamdiskSetFileEnd
  351.         dd      fs_RamdiskGetFileInfo
  352.         dd      fs_RamdiskSetFileInfo
  353.         dd      fs_RamdiskExecute
  354.         dd      fs_RamdiskDelete
  355. fs_NumRamdiskServices = ($ - fs_RamdiskServices)/4
  356.  
  357. fs_OnFloppy:
  358.         cmp     ecx, 2
  359.         ja      file_system_lfn.notfound
  360.         mov     eax, [ebx]
  361.         cmp     eax, fs_NumFloppyServices
  362.         jae     fs_OnRamdisk.not_impl
  363.         call    reserve_flp
  364.         mov     [flp_number], cl
  365.         mov     ecx, [ebx+12]
  366.         mov     edx, [ebx+16]
  367.         add     edx, std_application_base_address
  368.         add     ebx, 4
  369.         call    dword [fs_FloppyServices + eax*4]
  370.         and     [flp_status], 0
  371.         mov     [esp+36], eax
  372.         mov     [esp+24], ebx
  373.         ret
  374.  
  375. fs_FloppyServices:
  376.         dd      fs_FloppyRead
  377.         dd      fs_FloppyReadFolder
  378.         dd      fs_FloppyRewrite
  379.         dd      fs_FloppyWrite
  380.         dd      fs_FloppySetFileEnd
  381.         dd      fs_FloppyGetFileInfo
  382.         dd      fs_FloppySetFileInfo
  383.         dd      fs_FloppyExecute
  384.         dd      fs_FloppyDelete
  385. fs_NumFloppyServices = ($ - fs_FloppyServices)/4
  386.  
  387. fs_OnHd0:
  388.         call    reserve_hd1
  389.         mov     [hdbase], 0x1F0
  390.         mov     [hdid], 0
  391.         push    1
  392.         jmp     fs_OnHd
  393. fs_OnHd1:
  394.         call    reserve_hd1
  395.         mov     [hdbase], 0x1F0
  396.         mov     [hdid], 0x10
  397.         push    2
  398.         jmp     fs_OnHd
  399. fs_OnHd2:
  400.         call    reserve_hd1
  401.         mov     [hdbase], 0x170
  402.         mov     [hdid], 0
  403.         push    3
  404.         jmp     fs_OnHd
  405. fs_OnHd3:
  406.         call    reserve_hd1
  407.         mov     [hdbase], 0x170
  408.         mov     [hdid], 0x10
  409.         push    4
  410. fs_OnHd:
  411.         call    reserve_hd_channel
  412.         pop     eax
  413.         mov     [hdpos], eax
  414.         cmp     ecx, 0x100
  415.         jae     .nf
  416.         cmp     cl, [0x40001+eax]
  417.         jbe     @f
  418. .nf:
  419.         call    free_hd_channel
  420.         and     [hd1_status], 0
  421.         mov     dword [esp+36], 5       ; not found
  422.         ret
  423. @@:
  424.         mov     [fat32part], ecx
  425.         push    ebx esi
  426.         call    choice_necessity_partition_1
  427.         pop     esi ebx
  428.         mov     ecx, [ebx+12]
  429.         mov     edx, [ebx+16]
  430.         add     edx, std_application_base_address
  431.         mov     eax, [ebx]
  432.         cmp     eax, fs_NumHdServices
  433.         jae     .not_impl
  434.         add     ebx, 4
  435.         call    dword [fs_HdServices + eax*4]
  436.         call    free_hd_channel
  437.         and     [hd1_status], 0
  438.         mov     [esp+36], eax
  439.         mov     [esp+24], ebx
  440.         ret
  441. .not_impl:
  442.         call    free_hd_channel
  443.         and     [hd1_status], 0
  444.         mov     dword [esp+36], 2       ; not implemented
  445.         ret
  446.  
  447. fs_HdServices:
  448.         dd      fs_HdRead
  449.         dd      fs_HdReadFolder
  450.         dd      fs_HdRewrite
  451.         dd      fs_HdWrite
  452.         dd      fs_HdSetFileEnd
  453.         dd      fs_HdGetFileInfo
  454.         dd      fs_HdSetFileInfo
  455.         dd      fs_HdExecute
  456.         dd      fs_HdDelete
  457. fs_NumHdServices = ($ - fs_HdServices)/4
  458.  
  459. ;*******************************************************
  460. fs_OnCd0:
  461.         call    reserve_cd
  462.         mov  [ChannelNumber],1
  463.         mov  [DiskNumber],0
  464.         push    6
  465.         jmp     fs_OnCd
  466. fs_OnCd1:
  467.         call    reserve_cd
  468.         mov  [ChannelNumber],1
  469.         mov  [DiskNumber],1
  470.         push    4
  471.         jmp     fs_OnCd
  472. fs_OnCd2:
  473.         call    reserve_cd
  474.         mov  [ChannelNumber],2
  475.         mov  [DiskNumber],0
  476.         push    2
  477.         jmp     fs_OnCd
  478. fs_OnCd3:
  479.         call    reserve_cd
  480.         mov  [ChannelNumber],2
  481.         mov  [DiskNumber],1
  482.         push    0
  483. fs_OnCd:
  484.         call    reserve_cd_channel
  485.         pop     eax
  486.         mov     [hdpos], eax
  487.         cmp     ecx, 0x100
  488.         jae     .nf
  489.         push    ecx ebx
  490.         mov     cl,al
  491.         mov     bl,[0x40001]
  492.         shr     bl,cl
  493.         test    bl,2
  494.         pop     ebx ecx
  495.  
  496.         jnz     @f
  497. .nf:
  498.         call    free_cd_channel
  499.         and    [cd_status], 0
  500.         mov     dword [esp+36], 5       ; not found
  501.         ret
  502. @@:
  503.         mov     ecx, [ebx+12]
  504.         mov     edx, [ebx+16]
  505.         add     edx, std_application_base_address
  506.         mov     eax, [ebx]
  507.         cmp     eax,fs_NumCdServices
  508.         jae      .not_impl
  509.         add     ebx, 4
  510.         call    dword [fs_CdServices + eax*4]
  511.         call    free_cd_channel
  512.         and     [cd_status], 0
  513.         mov     [esp+36], eax
  514.         mov     [esp+24], ebx
  515.         ret
  516. .not_impl:
  517.         call    free_cd_channel
  518.         and     [cd_status], 0
  519.         mov     dword [esp+36], 2       ; not implemented
  520.         ret
  521.  
  522. fs_CdServices:
  523.         dd      fs_CdRead
  524.         dd      fs_CdReadFolder
  525.         dd      fs_NotImplemented
  526.         dd      fs_NotImplemented
  527.         dd      fs_NotImplemented
  528.         dd      fs_CdGetFileInfo
  529.         dd      fs_NotImplemented
  530.         dd      fs_CdExecute
  531. fs_NumCdServices = ($ - fs_CdServices)/4
  532.  
  533. ;*******************************************************
  534.  
  535. fs_HasRamdisk:
  536.         mov     al, 1   ; we always have ramdisk
  537.         ret
  538.  
  539. fs_HasFloppy:
  540.         cmp     byte [0x40000], 0
  541.         setnz   al
  542.         ret
  543.  
  544. fs_HasHd0:
  545.         mov     al, [0x40001]
  546.         and     al, 11000000b
  547.         cmp     al, 01000000b
  548.         setz    al
  549.         ret
  550. fs_HasHd1:
  551.         mov     al, [0x40001]
  552.         and     al, 00110000b
  553.         cmp     al, 00010000b
  554.         setz    al
  555.         ret
  556. fs_HasHd2:
  557.         mov     al, [0x40001]
  558.         and     al, 00001100b
  559.         cmp     al, 00000100b
  560.         setz    al
  561.         ret
  562. fs_HasHd3:
  563.         mov     al, [0x40001]
  564.         and     al, 00000011b
  565.         cmp     al, 00000001b
  566.         setz    al
  567.         ret
  568.  
  569. ;*******************************************************
  570. fs_HasCd0:
  571.         mov     al, [0x40001]
  572.         and     al, 11000000b
  573.         cmp     al, 10000000b
  574.         setz    al
  575.         ret
  576. fs_HasCd1:
  577.         mov     al, [0x40001]
  578.         and     al, 00110000b
  579.         cmp     al, 00100000b
  580.         setz    al
  581.         ret
  582. fs_HasCd2:
  583.         mov     al, [0x40001]
  584.         and     al, 00001100b
  585.         cmp     al, 00001000b
  586.         setz    al
  587.         ret
  588. fs_HasCd3:
  589.         mov     al, [0x40001]
  590.         and     al, 00000011b
  591.         cmp     al, 00000010b
  592.         setz    al
  593.         ret
  594. ;*******************************************************        
  595.  
  596. ; fs_NextXXX functions:
  597. ; in: eax = partition number, from which start to scan
  598. ; out: CF=1 => no more partitions
  599. ;      CF=0 => eax=next partition number
  600.  
  601. fs_NextRamdisk:
  602. ; we always have /rd/1
  603.         test    eax, eax
  604.         stc
  605.         jnz     @f
  606.         mov     al, 1
  607.         clc
  608. @@:
  609.         ret
  610.  
  611. fs_NextFloppy:
  612. ; we have /fd/1 iff (([0x40000] and 0xF0) != 0) and /fd/2 iff (([0x40000] and 0x0F) != 0)
  613.         test    byte [0x40000], 0xF0
  614.         jz      .no1
  615.         test    eax, eax
  616.         jnz     .no1
  617.         inc     eax
  618.         ret     ; CF cleared
  619. .no1:
  620.         test    byte [0x40000], 0x0F
  621.         jz      .no2
  622.         cmp     al, 2
  623.         jae     .no2
  624.         mov     al, 2
  625.         clc
  626.         ret
  627. .no2:
  628.         stc
  629.         ret
  630.  
  631. ; on hdx, we have partitions from 1 to [0x40002+x]
  632. fs_NextHd0:
  633.         push    0
  634.         jmp     fs_NextHd
  635. fs_NextHd1:
  636.         push    1
  637.         jmp     fs_NextHd
  638. fs_NextHd2:
  639.         push    2
  640.         jmp     fs_NextHd
  641. fs_NextHd3:
  642.         push    3
  643. fs_NextHd:
  644.         pop     ecx
  645.         movzx   ecx, byte [0x40002+ecx]
  646.         cmp     eax, ecx
  647.         jae     fs_NextFloppy.no2
  648.         inc     eax
  649.         clc
  650.         ret
  651.        
  652. ;*******************************************************
  653. fs_NextCd:
  654. ; we always have /cdX/1
  655.         test    eax, eax
  656.         stc
  657.         jnz     @f
  658.         mov     al, 1
  659.         clc
  660. @@:
  661.         ret
  662. ;*******************************************************
  663.  
  664.