Если правильно понял, раздел будет доступен и по "/sys" и по "/cd".
А образ не обязательно должен быть на readonly-диске(то есть, и на /usb может быть).
Тогда приложениям нужно как-то узнавать, что cd и sys — это один и тот же раздел.
Иначе это может создать проблему при работе с файлами, как с bd и hd.
Автомонтирование дополнительного раздела с приложениями
0CodErr
/sys не отображается в списке корневого каталога. Это небольшой хак с подменой пути в коде файловой системы. Таким же способом можно добавить и другие подстановки,но это сделает не самую лучшую ситуацию ещё хуже.
/sys не отображается в списке корневого каталога. Это небольшой хак с подменой пути в коде файловой системы. Таким же способом можно добавить и другие подстановки,но это сделает не самую лучшую ситуацию ещё хуже.
Работа движется черепашьими темпами, но тем не менее движется. Я все же решил делать приложением - нечего лишнему коду, который используется только 1 раз при запуске системы, постоянно висеть в коде ядра.
Выдрал из KFM кусок строящий список доступных дисков и разделов (который выводится в программе по Alt+F1 и Alt+F2) и заставил его работать. Остается написать процедуру считывания и побайтового сравнения двух файлов, а дальше обеспечить поддержку со стороны ядра.
Кому интересно, вот бинарник - выводит некоторую информацию на доску отладки.
Выдрал из KFM кусок строящий список доступных дисков и разделов (который выводится в программе по Alt+F1 и Alt+F2) и заставил его работать. Остается написать процедуру считывания и побайтового сравнения двух файлов, а дальше обеспечить поддержку со стороны ядра.
Кому интересно, вот бинарник - выводит некоторую информацию на доску отладки.
Всем чмоки в этом проекте! Засуньте эти 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
Когда все будет отлажено, я уберу вывод отладочного лога совсем.
Теперь остается ядро допилить. Думаю сделать одноразовый вызов функции, чтобы потом в процессе работы другие программы не могли уже поменять - будет "флаг-защелка".
Сравнение следующее:
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 лет себе в жопу!
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"
Можно начинать добавлять тяжелые приложения вроде FPLAY (видеоплеер) в ISO образ дистрибутива и прописывать ассоциации в файловых менеджерах.
К примеру:
KFM "avi /addappl/media/fplay"
KFAR "avi=/addappl/media/fplay"
EOLITE "avi=/addappl/media/fplay"
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Замечательно!
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?
1) Они зависят от совпадения файла метки kolibri.lbl - он разный для 4-х дистрибутивов. В идеале в нем должен меняться номер ревизии, но я пока не знаю как это в автосборку прописать.SoUrcerer wrote:Замечательно!
А меню и ассоциации не зависят от образа, верно? То есть меню всё равно вручную править придется?
2) Править придется один раз, вернее не править, а вновь прописывать - в меню ничего нет. Хотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog. Без параметра при запуске он по сути красивое, но пустое приложение. Так что пока только в ассоциации файловых менеджеров. А вот игрушки всякие уже можно распихивать в меню.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Разве нет? http://websvn.kolibrios.org/filedetails ... ENDIAL.ASMХотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
Вот такая ситуация: положил, допустим, в образ label и записал на болванку. Раздел /cd0/1 будет системным. А завтра мне не надо, чтобы он был системным, но сами программы и данные из образа нужны. А послезавтра опять надо.
Что если label будет сразу на двух разделах?
Получается, не совсем автоматическое монтирование.
SVN r. 3668 - добавил эти изменения. Спасибо за помощь!0CodErr wrote: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: ;-------------------------------------------------------------------------------
Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Вроде diamond где-то писал про это(может на форуме даже).Ты экспериментальным путем выяснил, что такое перемещение помогает более плотно упаковать данные?
1) Вероятно забыл и тогда, да, имеет смысл.0CodErr wrote:Разве нет? http://websvn.kolibrios.org/filedetails ... ENDIAL.ASMХотя смысл прописывать в меню видеоплеер, если в него не интегрирована поддержка OpenDialog.
Вот такая ситуация: положил, допустим, в образ label и записал на болванку. Раздел /cd0/1 будет системным. А завтра мне не надо, чтобы он был системным, но сами программы и данные из образа нужны. А послезавтра опять надо.
Что если label будет сразу на двух разделах?
Получается, не совсем автоматическое монтирование.
2) Образ CD делается системным вставлением/удалением диска из привода. А жесткий диск - добавлением/удалением файла kolibri.lbl с нужного раздела жесткого диска. В случае наличия более одного kolibri.lbl полностью идентичных с эталонным на рамдиске, используется первый найденныйи далее просто не производится поиск. Приоритет поиска по порядку следования в директории "/" и связанных вторичных директорий (обычно там номера разделов на данном физическом устройстве).
З.Ы. Для особо упоротых случаев можно предусмотреть параметры запуска отключающие поиск на определенных устройствах, но в 512 байт впихнуть уже вероятно не получится.
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
Mario_r4
Работает замечательно, но есть пара замечаний.
1.Сейчас монтируется весь раздел. Лучше всё же монтировать один каталог. Иначе в корневом каталоге надо будет копировать всю структуру каталогов /rd/1.
2.Как быть с дисками-клонами /hd0/1/ /sd0/1 /bd0/1 ? Желательно добавить программе немного интеллекта и выбирать /bd в последнюю очередь.
Работает замечательно, но есть пара замечаний.
1.Сейчас монтируется весь раздел. Лучше всё же монтировать один каталог. Иначе в корневом каталоге надо будет копировать всю структуру каталогов /rd/1.
2.Как быть с дисками-клонами /hd0/1/ /sd0/1 /bd0/1 ? Желательно добавить программе немного интеллекта и выбирать /bd в последнюю очередь.
Who is online
Users browsing this forum: No registered users and 1 guest