Subversion Repositories Kolibri OS

Rev

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

  1. ; Search Additional Partition for KolibriOS applications
  2. ;
  3. ; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario
  4. ; All rights reserved.
  5. ;
  6. ; Redistribution and use in source and binary forms, with or without
  7. ; modification, are permitted provided that the following conditions are met:
  8. ;        * Redistributions of source code must retain the above copyright
  9. ;          notice, this list of conditions and the following disclaimer.
  10. ;        * Redistributions in binary form must reproduce the above copyright
  11. ;          notice, this list of conditions and the following disclaimer in the
  12. ;          documentation and/or other materials provided with the distribution.
  13. ;        * Neither the name of the <organization> nor the
  14. ;          names of its contributors may be used to endorse or promote products
  15. ;          derived from this software without specific prior written permission.
  16. ;
  17. ; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
  18. ; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. ; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. ; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
  21. ; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22. ; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23. ; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24. ; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. ; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26. ; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. ;*****************************************************************************
  28.         use32
  29.         org     0x0
  30.  
  31.         db      'MENUET01'
  32.         dd 0x01
  33.         dd START
  34.         dd IM_END
  35.         dd I_END
  36.         dd stacktop
  37.         dd 0x0
  38.         dd 0x0
  39. ;---------------------------------------------------------------------
  40. fileinfo:
  41. .subfunction    dd 5
  42. .Offset         dd 0
  43. .Offset_1       dd 0
  44. .size           dd 0
  45. .return         dd folder_data
  46.                 db 0
  47. .name:          dd basic_file_path
  48. ;---------------------------------------------------------------------
  49. read_folder:
  50. .subfunction    dd 1
  51. .start          dd 0
  52. .flags          dd 0
  53. .size           dd 32
  54. .return         dd folder_data
  55.                 db 0
  56. .name:          dd read_folder_name
  57. ;---------------------------------------------------------------------
  58. read_folder_1:
  59. .subfunction    dd 1
  60. .start          dd 0
  61. .flags          dd 0
  62. .size           dd 32
  63. .return         dd folder_data_1
  64.                 db 0
  65. .name:          dd read_folder_1_name
  66. ;---------------------------------------------------------------------
  67. start_dir:
  68.         db '/',0
  69. ;-------------------------------------------------------------------------------
  70. basic_file_path:
  71.         db '/rd/1/'
  72. basic_file_name:
  73.         db 'kolibri.lbl',0
  74. additional_dir_name:
  75.         db 'addappl',0
  76. real_additional_dir:
  77.         db '/kolibrios',0
  78. ;-------------------------------------------------------------------------------
  79. debug equ no    ;yes
  80.  
  81. include '../../macros.inc'
  82.  
  83. if debug eq yes
  84. include '../../debug.inc'
  85. end if
  86. ;-------------------------------------------------------------------------------
  87. START:
  88.         mov     ebx,start_dir
  89.         mov     ax,[ebx]
  90.         mov     ebx,read_folder_name
  91.         mov     [ebx],ax
  92.         mov     ebx,read_folder_1_name
  93.         mov     [ebx],ax
  94.         call    device_detect_f70
  95. ;--------------------------------------
  96. if debug eq yes
  97.         call    print_retrieved_devices_table
  98. dps 'get basic file'
  99. newline
  100. end if
  101. ;--------------------------------------
  102.         call    load_file       ; download the master file
  103.         xor     eax,eax
  104.         cmp     [fs_error],eax
  105.         jne     exit
  106.         mov     eax,[fileinfo.size]
  107.         mov     [basic_file_size],eax  
  108.        
  109.         call    search_and_load_pointer_file_label
  110. ;---------------------------------------------------------------------
  111. exit:
  112. ;--------------------------------------
  113. if debug eq yes
  114. dps 'just exit'
  115. ;newline
  116. ;       mov     edx,read_folder_name
  117. ;       call    debug_outstr
  118. ;newline
  119. ;       mov     edx,read_folder_1_name
  120. ;       call    debug_outstr
  121. ;newline
  122. end if
  123. ;--------------------------------------
  124.         mcall   -1
  125. ;---------------------------------------------------------------------
  126. device_detect_f70:
  127. ;--------------------------------------
  128. if debug eq yes
  129. dps     'read_folder_name: '
  130.         mov     edx,read_folder_name
  131.         call    debug_outstr
  132. newline
  133. end if
  134. ;--------------------------------------
  135.         mcall   70,read_folder
  136.         test    eax,eax
  137.         jz      @f
  138.         cmp     eax,6
  139.         je      @f
  140. ;--------------------------------------
  141. if debug eq yes
  142. dps 'read_folder_error'
  143. newline
  144. ;       mov     edx,read_folder_name
  145. ;       call    debug_outstr
  146. ;newline
  147. end if
  148. ;--------------------------------------
  149.         jmp     exit
  150. @@:
  151. ;--------------------------------------
  152. if debug eq yes
  153.         call    print_root_dir
  154. end if
  155. ;--------------------------------------
  156.         mov     [left_folder_block],ebx
  157.         xor     eax,eax
  158.         mov     [temp_counter_1],eax
  159.         mov     [retrieved_devices_table_counter],eax
  160. .start_temp_counter_1:
  161.         imul    esi,[temp_counter_1],304
  162.         add     esi,[read_folder.return]
  163.         add     esi,32+40
  164.         call    copy_folder_name_1
  165. ;--------------------------------------
  166. if debug eq yes
  167. ;dps    'read_folder_1_name: '
  168. ;       mov     edx,read_folder_1_name
  169. ;       call    debug_outstr
  170. ;newline
  171. end if
  172. ;--------------------------------------
  173.         mcall   70,read_folder_1
  174.         test    eax,eax
  175.         jz      @f
  176.         cmp     eax,6
  177.         je      @f
  178. ;--------------------------------------
  179. if debug eq yes
  180. dps 'read_folder_error_1'
  181. newline
  182. ;       mov     edx,read_folder_1_name
  183. ;       call    debug_outstr
  184. ;newline
  185. end if
  186. ;--------------------------------------
  187.         jmp     exit
  188. @@:
  189.         mov     eax,[read_folder_1.return]
  190.         cmp     [eax+4],dword 0
  191.         je      .continue
  192.         mov     [right_folder_block],ebx
  193.         xor     ebp,ebp
  194. .start_copy_device_patch:
  195.         imul    edi,[retrieved_devices_table_counter],10
  196.         add     edi,retrieved_devices_table
  197.         mov     [edi],byte '/'
  198.         inc     edi
  199.         imul    esi,[temp_counter_1],304
  200.         add     esi,[read_folder.return]
  201.         add     esi,32+40
  202.         call    proc_copy_patch
  203.         imul    esi,ebp,304
  204.         add     esi,[read_folder_1.return]
  205.         add     esi,32+40
  206.         mov     [edi-1],byte '/'
  207.         call    proc_copy_patch
  208.         inc     [retrieved_devices_table_counter]
  209.         inc     ebp
  210.         cmp     ebp,[right_folder_block]
  211.         jb      .start_copy_device_patch
  212. .continue:
  213.         inc     [temp_counter_1]
  214.         mov     eax,[temp_counter_1]
  215.         cmp     eax,[left_folder_block]
  216.         jb      .start_temp_counter_1
  217.         mov     esi,retrieved_devices_table+1
  218.         call    copy_folder_name
  219.         mov     esi,retrieved_devices_table+3
  220.         xor     ecx,ecx
  221. @@:
  222.         add     esi,8
  223.         cld
  224.         lodsw
  225.         inc     ecx
  226.         cmp     ecx,[retrieved_devices_table_counter]
  227.         ja      @f
  228.         cmp     ax,'hd'
  229.         jne     @r
  230.         sub     esi,2
  231.         call    copy_folder_name_1
  232.         ret
  233. @@:
  234.         mov     esi,retrieved_devices_table+1
  235.         call    copy_folder_name_1
  236.         ret
  237. ;---------------------------------------------------------------------
  238. load_file:
  239.         mov     [fileinfo.subfunction],dword 5
  240.         xor     eax,eax
  241.         mov     [fileinfo.size],eax
  242.         mov     [fs_error],eax
  243. ;--------------------------------------
  244. if debug eq yes
  245. dps 'get file info'
  246. newline
  247. end if
  248. ;--------------------------------------
  249.         mcall   70,fileinfo
  250.         mov     [fs_error],eax
  251.         test    eax,eax
  252.         jnz     .file_error
  253. ;--------------------------------------
  254. if debug eq yes
  255. dps 'file info ok'
  256. newline
  257. end if
  258. ;--------------------------------------
  259.         xor     eax,eax
  260.         mov     [fileinfo.subfunction],eax      ;dword 0
  261.         mov     eax,[fileinfo.return]
  262.         mov     ecx,[eax+32]
  263. ;--------------------------------------
  264. if debug eq yes
  265. dps 'real file size: '
  266. dpd ecx
  267. newline
  268. end if
  269. ;--------------------------------------
  270.         test    ecx,ecx
  271.         jz      .file_error
  272.         mov     eax,304*32+32 ; 9 Kb
  273.         cmp     ecx,eax
  274.         jbe     @f
  275.         mov     ecx,eax
  276. ;-----------------------------------
  277. @@:    
  278.         mov     [fileinfo.size],ecx
  279. ;--------------------------------------
  280. if debug eq yes
  281. dps 'get file'
  282. newline
  283. end if
  284. ;--------------------------------------
  285.         mcall   70,fileinfo
  286.         mov     [fs_error],eax
  287.         test    eax,eax
  288.         jz      @f
  289. ;       cmp     eax,6
  290. ;       jne     .file_error
  291. ;       xor     eax,eax
  292. ;       mov     [fs_error],eax
  293. ;       jmp     @f
  294. ;-----------------------------------
  295. .file_error:
  296. ;--------------------------------------
  297. if debug eq yes
  298. dps 'read file - error!'
  299. newline
  300. end if
  301. ;--------------------------------------
  302.         ret
  303. ;-----------------------------------   
  304. @@:
  305. ;--------------------------------------
  306. if debug eq yes
  307. dps 'read file corrected size: '
  308. dpd dword[fileinfo.size]
  309. newline
  310. end if
  311. ;--------------------------------------
  312.         ret
  313. ;---------------------------------------------------------------------
  314. search_and_load_pointer_file_label:
  315.         mov     [fileinfo.return],dword folder_data_1
  316.         mov     ecx,[retrieved_devices_table_counter]
  317.         dec     ecx     ; /rd/1/ no need to check
  318.         mov     [fileinfo.name],dword read_folder_name
  319.         mov     esi,retrieved_devices_table
  320. ;       sub     esi,10  ; deleted because /rd/1/ no need to check
  321. .next_entry:
  322. ;--------------------------------------
  323. if debug eq yes
  324. newline
  325. dps 'copy next entry'
  326. newline
  327. end if
  328. ;--------------------------------------
  329.         add     esi,10
  330.         push    esi
  331.         add     esi,1
  332.         call    copy_folder_name
  333.         mov     esi,basic_file_name-1
  334.         dec     edi
  335.         call    copy_folder_name.1
  336.         pop     esi
  337. ;--------------------------------------
  338. if debug eq yes
  339.         mov     edx,[fileinfo.name]
  340.         push    ecx
  341.         call    debug_outstr
  342.         pop     ecx
  343. newline
  344. end if
  345. ;--------------------------------------
  346. ;       mcall   5,10
  347.         push    ecx
  348.         call    load_file
  349.         pop     ecx
  350.  
  351.         xor     eax,eax
  352.         cmp     [fs_error],eax
  353.         jne     @f
  354.         mov     eax,[fileinfo.size]
  355.         cmp     eax,[basic_file_size]
  356.         jae     .sucess
  357. @@:
  358.         dec     ecx
  359.         jnz     .next_entry
  360. ;--------------------------------------
  361. if debug eq yes
  362. dps 'additional parttition is not found!'
  363. newline
  364. end if
  365. ;--------------------------------------
  366.         ret
  367. .sucess:
  368.         call    compare_files_and_mount
  369.         cmp     [compare_flag],byte 0
  370.         jne     @b
  371.         ret
  372. ;---------------------------------------------------------------------
  373. compare_files_and_mount:
  374.         push    ecx esi
  375.         mov     ecx,[basic_file_size]
  376.         mov     esi,folder_data
  377.         mov     edi,folder_data_1
  378. .next_char:
  379.         cld
  380.         lodsb
  381.         mov     ah,[edi]
  382.         inc     edi
  383.         cmp     al,ah
  384.         jne     .not_match
  385.         dec     ecx
  386.         jnz     .next_char
  387.         mov     [compare_flag],byte 0
  388.         pop     esi ecx
  389. ;--------------------------------------
  390. if debug eq yes
  391. dps 'compare files sucess!'
  392. newline
  393. dps 'mount directory:'
  394. newline
  395.         mov     edx,esi
  396.         push    esi
  397.         call    debug_outstr
  398.         pop     esi
  399. newline
  400. end if
  401. ;--------------------------------------
  402. ; prepare real directory path for mounting
  403.         inc     esi
  404.         mov     edi,f30_3_work_area+64
  405.         call    proc_copy_patch
  406.         dec     edi
  407.         mov     esi,real_additional_dir
  408.         call    proc_copy_patch
  409. ; prepare fake directory name
  410.         mov     esi,additional_dir_name
  411.         mov     edi,f30_3_work_area
  412.         call    proc_copy_patch
  413. ; here is call kernel function to mount the found partition
  414. ; as "/addappl" directory to root directory "/"
  415.         mcall   30,3,f30_3_work_area
  416.         ret
  417. ;--------------------------------------
  418. .not_match:
  419.         mov     [compare_flag],byte 1
  420.         pop     esi ecx
  421. ;--------------------------------------
  422. if debug eq yes
  423. dps 'compare files is not match!'
  424. newline
  425. end if
  426. ;--------------------------------------
  427.         ret
  428. ;---------------------------------------------------------------------
  429. copy_folder_name:
  430.         mov     edi,read_folder_name+1
  431. .1:
  432. proc_copy_patch:
  433.         cld
  434. @@:
  435.         lodsb
  436.         stosb
  437.         test    al,al
  438.         jnz     @r
  439.         ret
  440. ;---------------------------------------------------------------------
  441. copy_folder_name_1:
  442.         mov     edi,read_folder_1_name+1
  443.         jmp     proc_copy_patch
  444. ;---------------------------------------------------------------------
  445. if debug eq yes
  446. print_retrieved_devices_table:
  447.         mov     ecx,[retrieved_devices_table_counter]
  448.         mov     edx,retrieved_devices_table
  449. dps 'retrieved_devices_table:'
  450. newline
  451. dps '----------'
  452. newline
  453. @@:
  454.         push    ecx edx
  455.         call    debug_outstr
  456. newline
  457.         pop     edx ecx
  458.         add     edx,10
  459.         dec     ecx
  460.         jnz     @b
  461. newline
  462. dps '----------'
  463. newline
  464.         ret
  465. ;---------------------------------------------------------------------
  466. print_root_dir:
  467. dps '----------'
  468. dps 'root dir:'
  469. dps '----------'
  470. newline
  471.         pusha
  472.         mov     ecx,ebx
  473.         mov     edx,folder_data+32+40
  474. @@:
  475.         push    ecx edx
  476.         call    debug_outstr
  477. newline
  478.         pop     edx ecx
  479.         add     edx,304
  480.         dec     ecx
  481.         jnz     @b
  482.         popa
  483. newline
  484. dps '----------'
  485. newline
  486.         ret
  487. end if
  488. ;-------------------------------------------------------------------------------
  489. IM_END:
  490. ;-------------------------------------------------------------------------------
  491. align 4
  492. left_folder_block       rd 1
  493. right_folder_block      rd 1
  494. temp_counter_1          rd 1
  495. retrieved_devices_table_counter rd 1
  496. basic_file_size         rd 1
  497. fs_error                rd 1
  498. compare_flag            rb 1
  499. ;-------------------------------------------------------------------------------
  500. align 4
  501. f30_3_work_area:
  502.         rb 128
  503. ;-------------------------------------------------------------------------------
  504. align 4
  505. retrieved_devices_table:
  506.         rb 10*100
  507. ;-------------------------------------------------------------------------------
  508. align 4
  509. read_folder_name:
  510.         rb 256
  511. ;-------------------------------------------------------------------------------
  512. align 4
  513. read_folder_1_name:
  514.         rb 256
  515. ;-------------------------------------------------------------------------------
  516. align 4
  517. folder_data:
  518.         rb 304*32+32 ; 9 Kb
  519. ;-------------------------------------------------------------------------------
  520. align 4
  521. folder_data_1:
  522.         rb 304*32+32 ; 9 Kb
  523. ;-------------------------------------------------------------------------------
  524. align 4
  525.         rb 512
  526. stacktop:
  527. ;-------------------------------------------------------------------------------
  528. I_END:
  529. ;-------------------------------------------------------------------------------