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

Internal structure and you change requests/suggestions
  • 0CodErr
    /sys не отображается в списке корневого каталога. Это небольшой хак с подменой пути в коде файловой системы. Таким же способом можно добавить и другие подстановки,но это сделает не самую лучшую ситуацию ещё хуже.
  • Работа движется черепашьими темпами, но тем не менее движется. Я все же решил делать приложением - нечего лишнему коду, который используется только 1 раз при запуске системы, постоянно висеть в коде ядра.

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

    Кому интересно, вот бинарник - выводит некоторую информацию на доску отладки.
    searchap.kex (594 Bytes)
    Downloaded 215 times
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • 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 лет себе в жопу!
  • SVN r. 3663 - в ядро добавлена ф.30.3, для монтирования дополнительного системного каталога. Можно вызвать только один раз за сеанс (блокировка предусмотрена) и используется для программы SEARCHAP (залита в SVN r. 3650).
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • SVN r. 3664 - SEARCHAP использует ф.30.3, можно выбрать включать или нет отладочные сообщения при компиляции (debug equ yes), оптимизация кода для уменьшения размера бинарника (к сожалению пока после KPACK все равно не влезает в 512 байт, хотя идеи есть как еще уменьшить).
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • searchap (512 Bytes)
    Downloaded 208 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:
    ;-------------------------------------------------------------------------------
  • 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 лет себе в жопу!
  • Замечательно!
    А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?
  • SoUrcerer wrote:Замечательно!
    А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?
    1) Они зависят от совпадения файла метки kolibri.lbl - он разный для 4-х дистрибутивов. В идеале в нем должен меняться номер ревизии, но я пока не знаю как это в автосборку прописать.
    2) Править придется один раз, вернее не править, а вновь прописывать - в меню ничего нет. Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog. Без параметра при запуске он по сути красивое, но пустое приложение. Так что пока только в ассоциации файловых менеджеров. А вот игрушки всякие уже можно распихивать в меню.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
    Разве нет? http://websvn.kolibrios.org/filedetails ... ENDIAL.ASM

    Вот такая ситуация: положил, допустим, в образ label и записал на болванку. Раздел /cd0/1 будет системным. А завтра мне не надо, чтобы он был системным, но сами программы и данные из образа нужны. А послезавтра опять надо.
    Что если label будет сразу на двух разделах?
    Получается, не совсем автоматическое монтирование.
  • 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 - добавил эти изменения. Спасибо за помощь!

    Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?
    Вроде diamond где-то писал про это(может на форуме даже).
  • 0CodErr wrote:
    Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
    Разве нет? http://websvn.kolibrios.org/filedetails ... ENDIAL.ASM

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

    З.Ы. Для особо упоротых случаев можно предусмотреть параметры запуска отключающие поиск на определенных устройствах, но в 512 байт впихнуть уже вероятно не получится.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Mario_r4
    Работает замечательно, но есть пара замечаний.
    1.Сейчас монтируется весь раздел. Лучше всё же монтировать один каталог. Иначе в корневом каталоге надо будет копировать всю структуру каталогов /rd/1.
    2.Как быть с дисками-клонами /hd0/1/ /sd0/1 /bd0/1 ? Желательно добавить программе немного интеллекта и выбирать /bd в последнюю очередь.
  • Who is online

    Users browsing this forum: No registered users and 4 guests