SEARCHAP - Search Additional Partition for KolibriOS applications
git-svn-id: svn://kolibrios.org@3650 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
4c497bf812
commit
1ea7de7d1b
|
@ -0,0 +1,3 @@
|
|||
@fasm searchap.asm searchap
|
||||
@kpack searchap
|
||||
@pause
|
|
@ -0,0 +1,7 @@
|
|||
#!/bin/bash
|
||||
# This script does for linux the same as build.bat for DOS,
|
||||
# it compiles the KolibriOS application
|
||||
|
||||
fasm -m 16384 searchap.asm ./searchap
|
||||
rm -f lang.inc
|
||||
exit 0
|
|
@ -0,0 +1,7 @@
|
|||
KolibriOS
|
||||
version 0770
|
||||
svnr 3650
|
||||
language RU
|
||||
|
||||
;just comment
|
||||
; Hi, curious person! :-)
|
|
@ -0,0 +1,447 @@
|
|||
; 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
|
||||
;-------------------------------------------------------------------------------
|
||||
include '../../macros.inc'
|
||||
include '../../debug.inc'
|
||||
;-------------------------------------------------------------------------------
|
||||
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
|
||||
call print_retrieved_devices_table
|
||||
|
||||
mov [fileinfo.return],dword folder_data
|
||||
;--------------------------------------
|
||||
dps 'get basic file'
|
||||
newline
|
||||
;--------------------------------------
|
||||
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:
|
||||
dps 'just exit'
|
||||
;newline
|
||||
; mov edx,read_folder_name
|
||||
; call debug_outstr
|
||||
;newline
|
||||
; mov edx,read_folder_1_name
|
||||
; call debug_outstr
|
||||
;newline
|
||||
mcall -1
|
||||
;---------------------------------------------------------------------
|
||||
device_detect_f70:
|
||||
;--------------------------------------
|
||||
dps 'read_folder_name: '
|
||||
mov edx,read_folder_name
|
||||
call debug_outstr
|
||||
newline
|
||||
;--------------------------------------
|
||||
mcall 70,read_folder
|
||||
test eax,eax
|
||||
jz @f
|
||||
cmp eax,6
|
||||
je @f
|
||||
dps 'read_folder_error'
|
||||
newline
|
||||
; mov edx,read_folder_name
|
||||
; call debug_outstr
|
||||
;newline
|
||||
jmp exit
|
||||
@@:
|
||||
;--------------------------------------
|
||||
call print_root_dir
|
||||
mov [left_folder_block],ebx
|
||||
mov [temp_counter_1],0
|
||||
mov [retrieved_devices_table_counter],0
|
||||
.start_temp_counter_1:
|
||||
imul esi,[temp_counter_1],304
|
||||
add esi,[read_folder.return]
|
||||
add esi,32+40
|
||||
call copy_folder_name_1
|
||||
;dps 'read_folder_1_name: '
|
||||
; mov edx,read_folder_1_name
|
||||
; call debug_outstr
|
||||
;newline
|
||||
mcall 70,read_folder_1
|
||||
test eax,eax
|
||||
jz @f
|
||||
cmp eax,6
|
||||
je @f
|
||||
dps 'read_folder_error_1'
|
||||
newline
|
||||
; mov edx,read_folder_1_name
|
||||
; call debug_outstr
|
||||
;newline
|
||||
jmp exit
|
||||
@@:
|
||||
mov eax,[read_folder_1.return]
|
||||
cmp [eax+4],dword 0
|
||||
je .continue
|
||||
mov [right_folder_block],ebx
|
||||
mov ebp,0
|
||||
.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
|
||||
mov ecx,0
|
||||
@@:
|
||||
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
|
||||
dps 'get file info'
|
||||
newline
|
||||
mcall 70,fileinfo
|
||||
mov [fs_error],eax
|
||||
test eax,eax
|
||||
jnz .file_error
|
||||
dps 'file info ok'
|
||||
newline
|
||||
mov [fileinfo.subfunction],dword 0
|
||||
mov eax,[fileinfo.return]
|
||||
mov ecx,[eax+32]
|
||||
dps 'real file size: '
|
||||
dpd ecx
|
||||
newline
|
||||
test ecx,ecx
|
||||
jz .file_error
|
||||
cmp ecx,304*32+32 ; 9 Kb
|
||||
jbe @f
|
||||
mov ecx,304*32+32 ; 9 Kb
|
||||
;-----------------------------------
|
||||
@@:
|
||||
mov [fileinfo.size],ecx
|
||||
dps 'get file'
|
||||
newline
|
||||
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:
|
||||
dps 'read file - error!'
|
||||
newline
|
||||
ret
|
||||
;-----------------------------------
|
||||
@@:
|
||||
dps 'read file corrected size: '
|
||||
dpd dword[fileinfo.size]
|
||||
newline
|
||||
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:
|
||||
newline
|
||||
dps 'copy next entry'
|
||||
newline
|
||||
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
|
||||
mov edx,[fileinfo.name]
|
||||
push ecx
|
||||
call debug_outstr
|
||||
pop ecx
|
||||
newline
|
||||
; 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
|
||||
dps 'additional parttition is not found!'
|
||||
newline
|
||||
ret
|
||||
.sucess:
|
||||
call compare_files_and_mount
|
||||
cmp [compare_flag],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
|
||||
dps 'compare files sucess!'
|
||||
newline
|
||||
dps 'mount directory:'
|
||||
newline
|
||||
mov edx,esi
|
||||
call debug_outstr
|
||||
newline
|
||||
; here is call kernel function to mount the found partition
|
||||
; as "/addappl" directory to root directory "/"
|
||||
ret
|
||||
;--------------------------------------
|
||||
.not_match:
|
||||
mov [compare_flag],byte 1
|
||||
pop esi ecx
|
||||
dps 'compare files is not match!'
|
||||
newline
|
||||
ret
|
||||
;---------------------------------------------------------------------
|
||||
proc_copy_patch:
|
||||
@@:
|
||||
cld
|
||||
lodsb
|
||||
stosb
|
||||
cmp al,0
|
||||
jne @r
|
||||
ret
|
||||
;---------------------------------------------------------------------
|
||||
copy_folder_name:
|
||||
mov edi,read_folder_name+1
|
||||
.1:
|
||||
@@:
|
||||
cld
|
||||
lodsb
|
||||
stosb
|
||||
cmp al,0
|
||||
jne @r
|
||||
ret
|
||||
;---------------------------------------------------------------------
|
||||
copy_folder_name_1:
|
||||
mov edi,read_folder_1_name+1
|
||||
@@:
|
||||
cld
|
||||
lodsb
|
||||
stosb
|
||||
cmp al,0
|
||||
jne @r
|
||||
ret
|
||||
;---------------------------------------------------------------------
|
||||
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
|
||||
;---------------------------------------------------------------------
|
||||
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
|
||||
;---------------------------------------------------------------------
|
||||
align 4
|
||||
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
|
||||
;---------------------------------------------------------------------
|
||||
start_dir:
|
||||
db '/',0
|
||||
;-------------------------------------------------------------------------------
|
||||
basic_file_path:
|
||||
db '/rd/1/'
|
||||
basic_file_name:
|
||||
db 'kolibri.lbl',0
|
||||
;-------------------------------------------------------------------------------
|
||||
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
|
||||
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:
|
||||
;-------------------------------------------------------------------------------
|
Loading…
Reference in New Issue