Page 3 of 8

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Fri May 31, 2013 8:24 am
by 0CodErr
Если правильно понял, раздел будет доступен и по "/sys" и по "/cd".
А образ не обязательно должен быть на readonly-диске(то есть, и на /usb может быть).
Тогда приложениям нужно как-то узнавать, что cd и sys — это один и тот же раздел.
Иначе это может создать проблему при работе с файлами, как с bd и hd.

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Fri May 31, 2013 10:55 am
by Serge
0CodErr
/sys не отображается в списке корневого каталога. Это небольшой хак с подменой пути в коде файловой системы. Таким же способом можно добавить и другие подстановки,но это сделает не самую лучшую ситуацию ещё хуже.

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 09, 2013 1:06 am
by Mario_r4
Работа движется черепашьими темпами, но тем не менее движется. Я все же решил делать приложением - нечего лишнему коду, который используется только 1 раз при запуске системы, постоянно висеть в коде ядра.

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

Кому интересно, вот бинарник - выводит некоторую информацию на доску отладки.
searchap.kex (594 Bytes)
Downloaded 217 times

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Thu Jun 13, 2013 12:50 am
by Mario_r4
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
Когда все будет отлажено, я уберу вывод отладочного лога совсем.

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

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 12:26 am
by Mario_r4
SVN r. 3663 - в ядро добавлена ф.30.3, для монтирования дополнительного системного каталога. Можно вызвать только один раз за сеанс (блокировка предусмотрена) и используется для программы SEARCHAP (залита в SVN r. 3650).

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 1:41 am
by Mario_r4
SVN r. 3664 - SEARCHAP использует ф.30.3, можно выбрать включать или нет отладочные сообщения при компиляции (debug equ yes), оптимизация кода для уменьшения размера бинарника (к сожалению пока после KPACK все равно не влезает в 512 байт, хотя идеи есть как еще уменьшить).

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 9:06 am
by 0CodErr
searchap (512 Bytes)
Downloaded 209 times
Searchap.asm:
Spoiler:

Code: Select all

; 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:
;-------------------------------------------------------------------------------

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 10:36 am
by Mario_r4
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"

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 10:42 am
by SoUrcerer
Замечательно!
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 10:49 am
by Mario_r4
SoUrcerer wrote:Замечательно!
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?
1) Они зависят от совпадения файла метки kolibri.lbl - он разный для 4-х дистрибутивов. В идеале в нем должен меняться номер ревизии, но я пока не знаю как это в автосборку прописать.
2) Править придется один раз, вернее не править, а вновь прописывать - в меню ничего нет. Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog. Без параметра при запуске он по сути красивое, но пустое приложение. Так что пока только в ассоциации файловых менеджеров. А вот игрушки всякие уже можно распихивать в меню.

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 10:59 am
by 0CodErr
Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
Разве нет? http://websvn.kolibrios.org/filedetails ... ENDIAL.ASM

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

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 11:03 am
by Mario_r4
0CodErr wrote:
searchap
Searchap.asm:
Spoiler:

Code: Select all

; 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 - добавил эти изменения. Спасибо за помощь!

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

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 11:07 am
by 0CodErr
Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?
Вроде diamond где-то писал про это(может на форуме даже).

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 11:09 am
by Mario_r4
0CodErr wrote:
Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
Разве нет? http://websvn.kolibrios.org/filedetails ... ENDIAL.ASM

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

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

Re: Автомонтирование дополнительного раздела с приложениями

Posted: Sun Jun 16, 2013 11:21 am
by Serge
Mario_r4
Работает замечательно, но есть пара замечаний.
1.Сейчас монтируется весь раздел. Лучше всё же монтировать один каталог. Иначе в корневом каталоге надо будет копировать всю структуру каталогов /rd/1.
2.Как быть с дисками-клонами /hd0/1/ /sd0/1 /bd0/1 ? Желательно добавить программе немного интеллекта и выбирать /bd в последнюю очередь.