Board.KolibriOS.org

Official KolibriOS board
It is currently Sun Jun 16, 2019 1:55 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 115 posts ]  Go to page Previous 1 2 3 4 58 Next
Author Message
PostPosted: Fri May 31, 2013 8:24 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Если правильно понял, раздел будет доступен и по "/sys" и по "/cd".
А образ не обязательно должен быть на readonly-диске(то есть, и на /usb может быть).
Тогда приложениям нужно как-то узнавать, что cd и sys — это один и тот же раздел.
Иначе это может создать проблему при работе с файлами, как с bd и hd.


Top
   
PostPosted: Fri May 31, 2013 10:55 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
0CodErr
/sys не отображается в списке корневого каталога. Это небольшой хак с подменой пути в коде файловой системы. Таким же способом можно добавить и другие подстановки,но это сделает не самую лучшую ситуацию ещё хуже.


Top
   
PostPosted: Sun Jun 09, 2013 1:06 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Работа движется черепашьими темпами, но тем не менее движется. Я все же решил делать приложением - нечего лишнему коду, который используется только 1 раз при запуске системы, постоянно висеть в коде ядра.

Выдрал из KFM кусок строящий список доступных дисков и разделов (который выводится в программе по Alt+F1 и Alt+F2) и заставил его работать. Остается написать процедуру считывания и побайтового сравнения двух файлов, а дальше обеспечить поддержку со стороны ядра.

Кому интересно, вот бинарник - выводит некоторую информацию на доску отладки.
Attachment:
searchap.kex [594 Bytes]
Downloaded 53 times

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Thu Jun 13, 2013 12:50 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
SVN r. 3650 - программа составляет список доступных разделов (подобно списку Alt+F1 и Alt+F2, в KFM и KFAR), загружает эталонный файл-метку "/rd/1/kolibri.lbl", ищет такую-же по списку устройств и сравнивает содержимое.
Сравнение следующее:
1. Найденный файл-метка не должен быть размером меньше эталонного, иначе программа продолжает искать далее.
2. Найденный файл-метка, может быть равен или больше по размеру, чем эталонный.
3. Содержимое найденного файла-метки должно совпадать с эталонным вплоть до символа, в пределах размера эталонного файла. Далее могут размещаться произвольные данные.
4. Размер загружаемых файлов ограничен 9 Кб для каждого - далее информация может присутствовать, но загружаться и сравниваться она не будет. Разумеется в реальной ситуации вряд ли файл будет превышать 512 байт, но вдруг кто-нибудь захочет там хранить данные какие-нибудь.

Для проверки вышеперечисленных пунктов нужно закинуть эталонный файл kolibri.lbl и саму программу на рамдиск, а также разместить или не разместить целевой kolibri.lbl на произвольный диск (кроме /rd/1/ разумеется). После запуска программы вы можете видеть лог в BOARD и boardlog.txt
Когда все будет отлажено, я уберу вывод отладочного лога совсем.

Теперь остается ядро допилить. Думаю сделать одноразовый вызов функции, чтобы потом в процессе работы другие программы не могли уже поменять - будет "флаг-защелка".

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 12:26 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
SVN r. 3663 - в ядро добавлена ф.30.3, для монтирования дополнительного системного каталога. Можно вызвать только один раз за сеанс (блокировка предусмотрена) и используется для программы SEARCHAP (залита в SVN r. 3650).

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 1:41 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
SVN r. 3664 - SEARCHAP использует ф.30.3, можно выбрать включать или нет отладочные сообщения при компиляции (debug equ yes), оптимизация кода для уменьшения размера бинарника (к сожалению пока после KPACK все равно не влезает в 512 байт, хотя идеи есть как еще уменьшить).

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 9:06 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Attachment:
searchap [512 Bytes]
Downloaded 52 times

Searchap.asm:
Spoiler: Show
Code:
; Search Additional Partition for KolibriOS applications
;
; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
;    * Redistributions of source code must retain the above copyright
;      notice, this list of conditions and the following disclaimer.
;    * Redistributions in binary form must reproduce the above copyright
;      notice, this list of conditions and the following disclaimer in the
;      documentation and/or other materials provided with the distribution.
;    * Neither the name of the <organization> nor the
;      names of its contributors may be used to endorse or promote products
;      derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
   use32
   org   0x0

   db   'MENUET01'
   dd 0x01
   dd START
   dd IM_END
   dd I_END
   dd stacktop
   dd 0x0
   dd 0x0
;---------------------------------------------------------------------
fileinfo:
.subfunction   dd 5
.Offset      dd 0
.Offset_1   dd 0
.size      dd 0
.return      dd folder_data
      db 0
.name:      dd basic_file_path
;---------------------------------------------------------------------
read_folder:
.subfunction   dd 1
.start      dd 0
.flags      dd 0
.size      dd 32
.return      dd folder_data
      db 0
.name:      dd read_folder_name
;---------------------------------------------------------------------
read_folder_1:
.subfunction   dd 1
.start      dd 0
.flags      dd 0
.size      dd 32
.return      dd folder_data_1
      db 0
.name:      dd read_folder_1_name
;---------------------------------------------------------------------
start_dir:
   db '/',0
;-------------------------------------------------------------------------------
basic_file_path:
   db '/rd/1/'
basic_file_name:
   db 'kolibri.lbl',0
additional_dir_name:
   db 'addappl',0

;-------------------------------------------------------------------------------
debug equ no;yes

include   '../../macros.inc'

if debug eq yes   
include   '../../debug.inc'
end if
;-------------------------------------------------------------------------------
START:
   mov   ebx,start_dir
   mov   ax,[ebx]
   mov   ebx,read_folder_name
   mov   [ebx],ax
   mov   ebx,read_folder_1_name
   mov   [ebx],ax
   call   device_detect_f70
;--------------------------------------
if debug eq yes   
   call   print_retrieved_devices_table
dps 'get basic file'
newline
end if
;--------------------------------------
   call   load_file   ; download the master file
   xor   eax,eax
   cmp   [fs_error],eax
   jne   exit
   mov   eax,[fileinfo.size]
   mov   [basic_file_size],eax   
   
   call   search_and_load_pointer_file_label
;---------------------------------------------------------------------
exit:
;--------------------------------------
if debug eq yes
dps 'just exit'
;newline
;   mov   edx,read_folder_name
;   call   debug_outstr
;newline
;   mov   edx,read_folder_1_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   mcall   -1
;---------------------------------------------------------------------
device_detect_f70:
;--------------------------------------
if debug eq yes
dps   'read_folder_name: '
   mov   edx,read_folder_name
   call   debug_outstr
newline
end if
;--------------------------------------
   mcall   70,read_folder
   test   eax,eax
   jz   @f
   cmp   eax,6
   je   @f
;--------------------------------------
if debug eq yes
dps 'read_folder_error'
newline
;   mov   edx,read_folder_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   jmp   exit
@@:
;--------------------------------------
if debug eq yes
   call   print_root_dir
end if
;--------------------------------------
   mov   [left_folder_block],ebx
   xor   eax,eax
   mov   [temp_counter_1],eax
   mov   [retrieved_devices_table_counter],eax
.start_temp_counter_1:
   imul   esi,[temp_counter_1],304
   add   esi,[read_folder.return]
   add   esi,32+40
   call   copy_folder_name_1
;--------------------------------------
if debug eq yes
;dps   'read_folder_1_name: '
;   mov   edx,read_folder_1_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   mcall   70,read_folder_1
   test   eax,eax
   jz   @f
   cmp   eax,6
   je   @f
;--------------------------------------
if debug eq yes
dps 'read_folder_error_1'
newline
;   mov   edx,read_folder_1_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   jmp   exit
@@:
   mov   eax,[read_folder_1.return]
   cmp   [eax+4],dword 0
   je   .continue
   mov   [right_folder_block],ebx
   xor   ebp,ebp
.start_copy_device_patch:
   imul   edi,[retrieved_devices_table_counter],10
   add   edi,retrieved_devices_table
   mov   [edi],byte '/'
   inc   edi
   imul   esi,[temp_counter_1],304
   add   esi,[read_folder.return]
   add   esi,32+40
   call   proc_copy_patch
   imul   esi,ebp,304
   add   esi,[read_folder_1.return]
   add   esi,32+40
   mov   [edi-1],byte '/'
   call   proc_copy_patch
   inc   [retrieved_devices_table_counter]
   inc   ebp
   cmp   ebp,[right_folder_block]
   jb   .start_copy_device_patch
.continue:
   inc   [temp_counter_1]
   mov   eax,[temp_counter_1]
   cmp   eax,[left_folder_block]
   jb   .start_temp_counter_1
   mov   esi,retrieved_devices_table+1
   call   copy_folder_name
   mov   esi,retrieved_devices_table+3
   xor   ecx,ecx
@@:
   add   esi,8
   cld
   lodsw
   inc   ecx
   cmp   ecx,[retrieved_devices_table_counter]
   ja   @f
   cmp   ax,'hd'
   jne   @r
   sub   esi,2
   call   copy_folder_name_1
   ret
@@:
   mov   esi,retrieved_devices_table+1
   call   copy_folder_name_1
   ret
;---------------------------------------------------------------------
load_file:
   mov   [fileinfo.subfunction],dword 5
   xor   eax,eax
   mov   [fileinfo.size],eax
   mov   [fs_error],eax
;--------------------------------------
if debug eq yes
dps 'get file info'
newline
end if
;--------------------------------------
   mcall   70,fileinfo
   mov   [fs_error],eax
   test   eax,eax
   jnz   .file_error
;--------------------------------------
if debug eq yes
dps 'file info ok'
newline
end if
;--------------------------------------
   xor   eax,eax
   mov   [fileinfo.subfunction],eax   ;dword 0
   mov   eax,[fileinfo.return]
   mov   ecx,[eax+32]
;--------------------------------------
if debug eq yes
dps 'real file size: '
dpd ecx
newline
end if
;--------------------------------------
   test   ecx,ecx
   jz   .file_error
   mov   eax,304*32+32 ; 9 Kb
   cmp   ecx,eax
   jbe   @f
   mov   ecx,eax
;-----------------------------------
@@:   
   mov   [fileinfo.size],ecx
;--------------------------------------
if debug eq yes
dps 'get file'
newline   
end if
;--------------------------------------
   mcall   70,fileinfo
   mov   [fs_error],eax
   test   eax,eax
   jz   @f
;   cmp   eax,6
;   jne   .file_error
;   xor   eax,eax
;   mov   [fs_error],eax
;   jmp   @f
;-----------------------------------
.file_error:
;--------------------------------------
if debug eq yes
dps 'read file - error!'
newline
end if
;--------------------------------------
   ret
;-----------------------------------   
@@:
;--------------------------------------
if debug eq yes
dps 'read file corrected size: '
dpd dword[fileinfo.size]
newline
end if
;--------------------------------------
   ret
;---------------------------------------------------------------------
search_and_load_pointer_file_label:
   mov   [fileinfo.return],dword folder_data_1
   mov   ecx,[retrieved_devices_table_counter]
   dec   ecx   ; /rd/1/ no need to check
   mov   [fileinfo.name],dword read_folder_name
   mov   esi,retrieved_devices_table
;   sub   esi,10   ; deleted because /rd/1/ no need to check
.next_entry:
;--------------------------------------
if debug eq yes
newline
dps 'copy next entry'
newline
end if
;--------------------------------------
   add   esi,10
   push   esi
   add   esi,1
   call   copy_folder_name
   mov   esi,basic_file_name-1
   dec   edi
   call   copy_folder_name.1
   pop   esi
;--------------------------------------
if debug eq yes
   mov   edx,[fileinfo.name]
   push   ecx
   call   debug_outstr
   pop   ecx
newline   
end if
;--------------------------------------
;   mcall   5,10
   push   ecx
   call   load_file
   pop   ecx

   xor   eax,eax
   cmp   [fs_error],eax
   jne   @f
   mov   eax,[fileinfo.size]
   cmp   eax,[basic_file_size]
   jae   .sucess
@@:
   dec   ecx
   jnz   .next_entry
;--------------------------------------
if debug eq yes
dps 'additional parttition is not found!'
newline   
end if
;--------------------------------------
   ret
.sucess:
   call   compare_files_and_mount
   cmp   [compare_flag], byte 0
   jne   @b
   ret
;---------------------------------------------------------------------
compare_files_and_mount:
   push   ecx esi
   mov   ecx,[basic_file_size]
   mov   esi,folder_data
   mov   edi,folder_data_1
.next_char:
   cld
   lodsb
   mov   ah,[edi]
   inc   edi
   cmp   al,ah
   jne   .not_match
   dec   ecx
   jnz   .next_char
   mov   [compare_flag],byte 0
   pop   esi ecx
;--------------------------------------
if debug eq yes
dps 'compare files sucess!'
newline   
dps 'mount directory:'
newline
   mov   edx,esi
   push   esi
   call   debug_outstr
   pop   esi
newline
end if
;--------------------------------------
; prepare real directory path for mounting
   inc   esi
   mov   edi,f30_3_work_area+64
   call   proc_copy_patch
; prepare fake directory name
   mov   esi,additional_dir_name
   mov   edi,f30_3_work_area
   call   proc_copy_patch
; here is call kernel function to mount the found partition
; as "/addappl" directory to root directory "/"
   mcall   30,3,f30_3_work_area
   ret
;--------------------------------------
.not_match:
   mov   [compare_flag],byte 1
   pop   esi ecx
;--------------------------------------
if debug eq yes
dps 'compare files is not match!'
newline   
end if
;--------------------------------------
   ret
;---------------------------------------------------------------------
copy_folder_name:
   mov   edi,read_folder_name+1
.1:
proc_copy_patch:
   cld
@@:
   lodsb
   stosb
   test   al,al
   jnz   @r
   ret
;---------------------------------------------------------------------
copy_folder_name_1:
   mov   edi,read_folder_1_name+1
   jmp   proc_copy_patch
;---------------------------------------------------------------------
if debug eq yes
print_retrieved_devices_table:
   mov   ecx,[retrieved_devices_table_counter]
   mov   edx,retrieved_devices_table
dps 'retrieved_devices_table:'
newline
dps '----------'
newline
@@:
   push   ecx edx
   call   debug_outstr
newline
   pop   edx ecx
   add   edx,10
   dec   ecx
   jnz   @b
newline
dps '----------'
newline
   ret
;---------------------------------------------------------------------
print_root_dir:
dps '----------'
dps 'root dir:'
dps '----------'
newline
   pusha
   mov   ecx,ebx
   mov   edx,folder_data+32+40
@@:
   push   ecx edx
   call   debug_outstr
newline
   pop   edx ecx
   add   edx,304
   dec   ecx
   jnz   @b
   popa
newline
dps '----------'
newline
   ret
end if

;-------------------------------------------------------------------------------
IM_END:
;-------------------------------------------------------------------------------
align 4
left_folder_block   rd 1
right_folder_block   rd 1
temp_counter_1      rd 1
retrieved_devices_table_counter   rd 1
basic_file_size      rd 1
fs_error      rd 1
compare_flag      rb 1
;-------------------------------------------------------------------------------
align 4
f30_3_work_area:
   rb 128
;-------------------------------------------------------------------------------
align 4
retrieved_devices_table:
   rb 10*100
;-------------------------------------------------------------------------------
align 4
read_folder_name:
   rb 256
;-------------------------------------------------------------------------------
align 4
read_folder_1_name:
   rb 256
;-------------------------------------------------------------------------------
align 4
folder_data:
   rb 304*32+32 ; 9 Kb
;-------------------------------------------------------------------------------
align 4
folder_data_1:
   rb 304*32+32 ; 9 Kb
;-------------------------------------------------------------------------------
align 4
   rb 512
stacktop:
;-------------------------------------------------------------------------------
I_END:
;-------------------------------------------------------------------------------


Top
   
PostPosted: Sun Jun 16, 2013 10:36 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
SVN r. 3665-3667 - автомонтирование добавлено в ночные сборки для RUS/ENG/IT/SP дистрибутивов.

Можно начинать добавлять тяжелые приложения вроде FPLAY (видеоплеер) в ISO образ дистрибутива и прописывать ассоциации в файловых менеджерах.

К примеру:
KFM "avi /addappl/media/fplay"
KFAR "avi=/addappl/media/fplay"
EOLITE "avi=/addappl/media/fplay"

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 10:42 am 
Offline

Joined: Mon Sep 24, 2007 11:11 am
Posts: 2814
Замечательно!
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?


Top
   
PostPosted: Sun Jun 16, 2013 10:49 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
SoUrcerer wrote:
Замечательно!
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?

1) Они зависят от совпадения файла метки kolibri.lbl - он разный для 4-х дистрибутивов. В идеале в нем должен меняться номер ревизии, но я пока не знаю как это в автосборку прописать.
2) Править придется один раз, вернее не править, а вновь прописывать - в меню ничего нет. Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog. Без параметра при запуске он по сути красивое, но пустое приложение. Так что пока только в ассоциации файловых менеджеров. А вот игрушки всякие уже можно распихивать в меню.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 10:59 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Quote:
Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
Разве нет? http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fmedia%2FFplay%2FOPENDIAL.ASM

Вот такая ситуация: положил, допустим, в образ label и записал на болванку. Раздел /cd0/1 будет системным. А завтра мне не надо, чтобы он был системным, но сами программы и данные из образа нужны. А послезавтра опять надо.
Что если label будет сразу на двух разделах?
Получается, не совсем автоматическое монтирование.


Top
   
PostPosted: Sun Jun 16, 2013 11:03 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
0CodErr wrote:
Attachment:
searchap

Searchap.asm:
Spoiler: Show
Code:
; Search Additional Partition for KolibriOS applications
;
; Copyright (c) 2013, Marat Zakiyanov aka Mario79, aka Mario
; All rights reserved.
;
; Redistribution and use in source and binary forms, with or without
; modification, are permitted provided that the following conditions are met:
;    * Redistributions of source code must retain the above copyright
;      notice, this list of conditions and the following disclaimer.
;    * Redistributions in binary form must reproduce the above copyright
;      notice, this list of conditions and the following disclaimer in the
;      documentation and/or other materials provided with the distribution.
;    * Neither the name of the <organization> nor the
;      names of its contributors may be used to endorse or promote products
;      derived from this software without specific prior written permission.
;
; THIS SOFTWARE IS PROVIDED BY Marat Zakiyanov ''AS IS'' AND ANY
; EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
; DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
; DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
; ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
; (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
; SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
;*****************************************************************************
   use32
   org   0x0

   db   'MENUET01'
   dd 0x01
   dd START
   dd IM_END
   dd I_END
   dd stacktop
   dd 0x0
   dd 0x0
;---------------------------------------------------------------------
fileinfo:
.subfunction   dd 5
.Offset      dd 0
.Offset_1   dd 0
.size      dd 0
.return      dd folder_data
      db 0
.name:      dd basic_file_path
;---------------------------------------------------------------------
read_folder:
.subfunction   dd 1
.start      dd 0
.flags      dd 0
.size      dd 32
.return      dd folder_data
      db 0
.name:      dd read_folder_name
;---------------------------------------------------------------------
read_folder_1:
.subfunction   dd 1
.start      dd 0
.flags      dd 0
.size      dd 32
.return      dd folder_data_1
      db 0
.name:      dd read_folder_1_name
;---------------------------------------------------------------------
start_dir:
   db '/',0
;-------------------------------------------------------------------------------
basic_file_path:
   db '/rd/1/'
basic_file_name:
   db 'kolibri.lbl',0
additional_dir_name:
   db 'addappl',0

;-------------------------------------------------------------------------------
debug equ no;yes

include   '../../macros.inc'

if debug eq yes   
include   '../../debug.inc'
end if
;-------------------------------------------------------------------------------
START:
   mov   ebx,start_dir
   mov   ax,[ebx]
   mov   ebx,read_folder_name
   mov   [ebx],ax
   mov   ebx,read_folder_1_name
   mov   [ebx],ax
   call   device_detect_f70
;--------------------------------------
if debug eq yes   
   call   print_retrieved_devices_table
dps 'get basic file'
newline
end if
;--------------------------------------
   call   load_file   ; download the master file
   xor   eax,eax
   cmp   [fs_error],eax
   jne   exit
   mov   eax,[fileinfo.size]
   mov   [basic_file_size],eax   
   
   call   search_and_load_pointer_file_label
;---------------------------------------------------------------------
exit:
;--------------------------------------
if debug eq yes
dps 'just exit'
;newline
;   mov   edx,read_folder_name
;   call   debug_outstr
;newline
;   mov   edx,read_folder_1_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   mcall   -1
;---------------------------------------------------------------------
device_detect_f70:
;--------------------------------------
if debug eq yes
dps   'read_folder_name: '
   mov   edx,read_folder_name
   call   debug_outstr
newline
end if
;--------------------------------------
   mcall   70,read_folder
   test   eax,eax
   jz   @f
   cmp   eax,6
   je   @f
;--------------------------------------
if debug eq yes
dps 'read_folder_error'
newline
;   mov   edx,read_folder_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   jmp   exit
@@:
;--------------------------------------
if debug eq yes
   call   print_root_dir
end if
;--------------------------------------
   mov   [left_folder_block],ebx
   xor   eax,eax
   mov   [temp_counter_1],eax
   mov   [retrieved_devices_table_counter],eax
.start_temp_counter_1:
   imul   esi,[temp_counter_1],304
   add   esi,[read_folder.return]
   add   esi,32+40
   call   copy_folder_name_1
;--------------------------------------
if debug eq yes
;dps   'read_folder_1_name: '
;   mov   edx,read_folder_1_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   mcall   70,read_folder_1
   test   eax,eax
   jz   @f
   cmp   eax,6
   je   @f
;--------------------------------------
if debug eq yes
dps 'read_folder_error_1'
newline
;   mov   edx,read_folder_1_name
;   call   debug_outstr
;newline
end if
;--------------------------------------
   jmp   exit
@@:
   mov   eax,[read_folder_1.return]
   cmp   [eax+4],dword 0
   je   .continue
   mov   [right_folder_block],ebx
   xor   ebp,ebp
.start_copy_device_patch:
   imul   edi,[retrieved_devices_table_counter],10
   add   edi,retrieved_devices_table
   mov   [edi],byte '/'
   inc   edi
   imul   esi,[temp_counter_1],304
   add   esi,[read_folder.return]
   add   esi,32+40
   call   proc_copy_patch
   imul   esi,ebp,304
   add   esi,[read_folder_1.return]
   add   esi,32+40
   mov   [edi-1],byte '/'
   call   proc_copy_patch
   inc   [retrieved_devices_table_counter]
   inc   ebp
   cmp   ebp,[right_folder_block]
   jb   .start_copy_device_patch
.continue:
   inc   [temp_counter_1]
   mov   eax,[temp_counter_1]
   cmp   eax,[left_folder_block]
   jb   .start_temp_counter_1
   mov   esi,retrieved_devices_table+1
   call   copy_folder_name
   mov   esi,retrieved_devices_table+3
   xor   ecx,ecx
@@:
   add   esi,8
   cld
   lodsw
   inc   ecx
   cmp   ecx,[retrieved_devices_table_counter]
   ja   @f
   cmp   ax,'hd'
   jne   @r
   sub   esi,2
   call   copy_folder_name_1
   ret
@@:
   mov   esi,retrieved_devices_table+1
   call   copy_folder_name_1
   ret
;---------------------------------------------------------------------
load_file:
   mov   [fileinfo.subfunction],dword 5
   xor   eax,eax
   mov   [fileinfo.size],eax
   mov   [fs_error],eax
;--------------------------------------
if debug eq yes
dps 'get file info'
newline
end if
;--------------------------------------
   mcall   70,fileinfo
   mov   [fs_error],eax
   test   eax,eax
   jnz   .file_error
;--------------------------------------
if debug eq yes
dps 'file info ok'
newline
end if
;--------------------------------------
   xor   eax,eax
   mov   [fileinfo.subfunction],eax   ;dword 0
   mov   eax,[fileinfo.return]
   mov   ecx,[eax+32]
;--------------------------------------
if debug eq yes
dps 'real file size: '
dpd ecx
newline
end if
;--------------------------------------
   test   ecx,ecx
   jz   .file_error
   mov   eax,304*32+32 ; 9 Kb
   cmp   ecx,eax
   jbe   @f
   mov   ecx,eax
;-----------------------------------
@@:   
   mov   [fileinfo.size],ecx
;--------------------------------------
if debug eq yes
dps 'get file'
newline   
end if
;--------------------------------------
   mcall   70,fileinfo
   mov   [fs_error],eax
   test   eax,eax
   jz   @f
;   cmp   eax,6
;   jne   .file_error
;   xor   eax,eax
;   mov   [fs_error],eax
;   jmp   @f
;-----------------------------------
.file_error:
;--------------------------------------
if debug eq yes
dps 'read file - error!'
newline
end if
;--------------------------------------
   ret
;-----------------------------------   
@@:
;--------------------------------------
if debug eq yes
dps 'read file corrected size: '
dpd dword[fileinfo.size]
newline
end if
;--------------------------------------
   ret
;---------------------------------------------------------------------
search_and_load_pointer_file_label:
   mov   [fileinfo.return],dword folder_data_1
   mov   ecx,[retrieved_devices_table_counter]
   dec   ecx   ; /rd/1/ no need to check
   mov   [fileinfo.name],dword read_folder_name
   mov   esi,retrieved_devices_table
;   sub   esi,10   ; deleted because /rd/1/ no need to check
.next_entry:
;--------------------------------------
if debug eq yes
newline
dps 'copy next entry'
newline
end if
;--------------------------------------
   add   esi,10
   push   esi
   add   esi,1
   call   copy_folder_name
   mov   esi,basic_file_name-1
   dec   edi
   call   copy_folder_name.1
   pop   esi
;--------------------------------------
if debug eq yes
   mov   edx,[fileinfo.name]
   push   ecx
   call   debug_outstr
   pop   ecx
newline   
end if
;--------------------------------------
;   mcall   5,10
   push   ecx
   call   load_file
   pop   ecx

   xor   eax,eax
   cmp   [fs_error],eax
   jne   @f
   mov   eax,[fileinfo.size]
   cmp   eax,[basic_file_size]
   jae   .sucess
@@:
   dec   ecx
   jnz   .next_entry
;--------------------------------------
if debug eq yes
dps 'additional parttition is not found!'
newline   
end if
;--------------------------------------
   ret
.sucess:
   call   compare_files_and_mount
   cmp   [compare_flag], byte 0
   jne   @b
   ret
;---------------------------------------------------------------------
compare_files_and_mount:
   push   ecx esi
   mov   ecx,[basic_file_size]
   mov   esi,folder_data
   mov   edi,folder_data_1
.next_char:
   cld
   lodsb
   mov   ah,[edi]
   inc   edi
   cmp   al,ah
   jne   .not_match
   dec   ecx
   jnz   .next_char
   mov   [compare_flag],byte 0
   pop   esi ecx
;--------------------------------------
if debug eq yes
dps 'compare files sucess!'
newline   
dps 'mount directory:'
newline
   mov   edx,esi
   push   esi
   call   debug_outstr
   pop   esi
newline
end if
;--------------------------------------
; prepare real directory path for mounting
   inc   esi
   mov   edi,f30_3_work_area+64
   call   proc_copy_patch
; prepare fake directory name
   mov   esi,additional_dir_name
   mov   edi,f30_3_work_area
   call   proc_copy_patch
; here is call kernel function to mount the found partition
; as "/addappl" directory to root directory "/"
   mcall   30,3,f30_3_work_area
   ret
;--------------------------------------
.not_match:
   mov   [compare_flag],byte 1
   pop   esi ecx
;--------------------------------------
if debug eq yes
dps 'compare files is not match!'
newline   
end if
;--------------------------------------
   ret
;---------------------------------------------------------------------
copy_folder_name:
   mov   edi,read_folder_name+1
.1:
proc_copy_patch:
   cld
@@:
   lodsb
   stosb
   test   al,al
   jnz   @r
   ret
;---------------------------------------------------------------------
copy_folder_name_1:
   mov   edi,read_folder_1_name+1
   jmp   proc_copy_patch
;---------------------------------------------------------------------
if debug eq yes
print_retrieved_devices_table:
   mov   ecx,[retrieved_devices_table_counter]
   mov   edx,retrieved_devices_table
dps 'retrieved_devices_table:'
newline
dps '----------'
newline
@@:
   push   ecx edx
   call   debug_outstr
newline
   pop   edx ecx
   add   edx,10
   dec   ecx
   jnz   @b
newline
dps '----------'
newline
   ret
;---------------------------------------------------------------------
print_root_dir:
dps '----------'
dps 'root dir:'
dps '----------'
newline
   pusha
   mov   ecx,ebx
   mov   edx,folder_data+32+40
@@:
   push   ecx edx
   call   debug_outstr
newline
   pop   edx ecx
   add   edx,304
   dec   ecx
   jnz   @b
   popa
newline
dps '----------'
newline
   ret
end if

;-------------------------------------------------------------------------------
IM_END:
;-------------------------------------------------------------------------------
align 4
left_folder_block   rd 1
right_folder_block   rd 1
temp_counter_1      rd 1
retrieved_devices_table_counter   rd 1
basic_file_size      rd 1
fs_error      rd 1
compare_flag      rb 1
;-------------------------------------------------------------------------------
align 4
f30_3_work_area:
   rb 128
;-------------------------------------------------------------------------------
align 4
retrieved_devices_table:
   rb 10*100
;-------------------------------------------------------------------------------
align 4
read_folder_name:
   rb 256
;-------------------------------------------------------------------------------
align 4
read_folder_1_name:
   rb 256
;-------------------------------------------------------------------------------
align 4
folder_data:
   rb 304*32+32 ; 9 Kb
;-------------------------------------------------------------------------------
align 4
folder_data_1:
   rb 304*32+32 ; 9 Kb
;-------------------------------------------------------------------------------
align 4
   rb 512
stacktop:
;-------------------------------------------------------------------------------
I_END:
;-------------------------------------------------------------------------------

SVN r. 3668 - добавил эти изменения. Спасибо за помощь!

Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 11:07 am 
Offline

Joined: Sun Oct 30, 2011 6:43 pm
Posts: 1499
Quote:
Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?
Вроде diamond где-то писал про это(может на форуме даже).


Top
   
PostPosted: Sun Jun 16, 2013 11:09 am 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
0CodErr wrote:
Quote:
Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
Разве нет? http://websvn.kolibrios.org/filedetails.php?repname=Kolibri+OS&path=%2Fprograms%2Fmedia%2FFplay%2FOPENDIAL.ASM

Вот такая ситуация: положил, допустим, в образ label и записал на болванку. Раздел /cd0/1 будет системным. А завтра мне не надо, чтобы он был системным, но сами программы и данные из образа нужны. А послезавтра опять надо.
Что если label будет сразу на двух разделах?
Получается, не совсем автоматическое монтирование.

1) Вероятно забыл и тогда, да, имеет смысл.
2) Образ CD делается системным вставлением/удалением диска из привода. А жесткий диск - добавлением/удалением файла kolibri.lbl с нужного раздела жесткого диска. В случае наличия более одного kolibri.lbl полностью идентичных с эталонным на рамдиске, используется первый найденныйи далее просто не производится поиск. Приоритет поиска по порядку следования в директории "/" и связанных вторичных директорий (обычно там номера разделов на данном физическом устройстве).

З.Ы. Для особо упоротых случаев можно предусмотреть параметры запуска отключающие поиск на определенных устройствах, но в 512 байт впихнуть уже вероятно не получится.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Top
   
PostPosted: Sun Jun 16, 2013 11:21 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario_r4
Работает замечательно, но есть пара замечаний.
1.Сейчас монтируется весь раздел. Лучше всё же монтировать один каталог. Иначе в корневом каталоге надо будет копировать всю структуру каталогов /rd/1.
2.Как быть с дисками-клонами /hd0/1/ /sd0/1 /bd0/1 ? Желательно добавить программе немного интеллекта и выбирать /bd в последнюю очередь.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 115 posts ]  Go to page Previous 1 2 3 4 58 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Limited