kolibrios-fun/programs/other/kpack/trunk/kerpack.inc

284 lines
5.5 KiB
PHP
Raw Normal View History

; do not touch "purge mov"!!!
purge mov ; for the correct patch of loader
; do not touch "purge mov"!!!
;*********************************************************************
;die_with_err:
; pop esi
;@@:
; lodsb
; test al,al
; jz @f
; mov cl,al
; mcall 63,1
; jmp @b
;*********************************************************************
;@@:
; mcall 63,,13
; mcall ,,10
; mcall -1
;*********************************************************************
kerpack:
call clear_mess_and_displogo
mov ecx,300*1024*3+6A8000h
mcall 68,12
mov [infile],eax
mov [infile3],eax
add eax,300*1024
mov [inbuftmp],eax
add eax,300*1024
mov [outfile],eax
add eax,300*1024
mov [workmem],eax
mov esi,inname
call get_full_name
mov [insize3],300*1024 ; max size of input file
mcall 70,fn70_read
cmp eax,6
jz read_ok
;--------------------------------------
read_err:
; call die_with_err
; db 'KerPack: cannot load kernel.mnt',0
mov esi,errload_str
push errload_len
pop ecx
call write_string
jmp read_ok.exit
;*********************************************************************
read_ok:
mov [insize3],ebx
mov edi,[infile]
add edi,[insize3]
cmp dword [edi-8],dword 'KERN'
jnz .lzma_set_dict_size
cmp dword [edi-4],dword 'PACK'
jnz .lzma_set_dict_size
;--------------------------------------
mov esi,already_str
push already_len
pop ecx
call write_string
jmp read_ok.exit
;*********************************************************************
.not_kernel:
mov esi,notkernel_str
push notkernel_len
pop ecx
call write_string
jmp read_ok.exit
;*********************************************************************
.lzma_set_dict_size:
push 18
call lzma_set_dict_size
; find jump to 32-bit code
; mov edi,infile - 1
mov edi,[infile]
mov eax,edi
add eax,[insize3]
dec edi
;--------------------------------------
@@:
cmp eax,edi
je .not_kernel
inc edi
cmp dword [edi],0xE88EE08E ; mov fs,ax/mov gs,ax
jnz @b
cmp dword [edi+4],0x00BCD08E ; mov ss,ax/mov esp,00xxxxxx
jnz @b
add edi,11
mov [inptr],edi
sub edi,[infile] ; infile
mov [indelta],edi
lea eax,[ebx+0x10000]
mov dword [loader_patch3+2],eax
sub ebx,edi
mov [insize1],ebx
call preprocess_calltrick3
mov al,[cti]
mov [loader_patch5-1],al
mov eax,[ctn]
mov [loader_patch4+1],eax
mov eax,[inptr]
; add eax, outfile - infile + loader_size - 5
add eax,[outfile]
sub eax,[infile]
add eax,loader_size - 5
push eax
call tell_compress_mess
pop eax
push [workmem] ;workmem
push [insize1]
push eax
push [inptr]
call lzma_compress
add eax, loader_size-5
mov [loader_patch1+6],eax
add eax,[indelta]
mov [outsize3],eax
mov eax,[indelta]
; mov ecx,dword [eax + outfile + loader_size - 4]
mov ecx,eax
add ecx,[outfile]
mov ecx,[ecx + loader_size - 4]
bswap ecx
mov [loader_patch2+4],ecx
add eax, 0x10000
mov [loader_patch1+1],eax
mov esi,[infile] ;infile
mov edi,[outfile] ;outfile
mov ecx,[indelta]
rep movsb
mov esi,loader_start
mov ecx,loader_size
rep movsb
mov eax,[outfile]
add eax,[outsize3]
mov [eax],dword 'KERN'
mov [eax+4],dword 'PACK'
add dword [outsize3],8
mov eax,[outsize3]
mov ecx,100
mul ecx
div [insize3]
aam
xchg al,ah
add ax,'00'
mov [ratio],ax
mov esi,done_str
push done_len
pop ecx
call write_string
mov eax,[outfile]
mov [outfile3],eax
mov esi,outname
call get_full_name
mcall 70,fn70_write
test eax,eax
jz .exit ;@f
; call die_with_err
; db 'KerPack: cannot save kernel.mnt',0
mov esi,outfileerr_str
push outfileerr_len
pop ecx
call write_string
;*********************************************************************
.exit:
; call die_with_err
; db 'KerPack: all is OK',0
call return_memory
ret
;*********************************************************************
preprocess_calltrick3:
; input preprocessing
mov edi,ct1
xor eax,eax
push edi
mov ecx,256/4
rep stosd
pop edi
mov ecx,ebx
mov esi,[inptr]
mov ebx,[inbuftmp] ;inbuftmp
xchg eax,edx
;--------------------------------------
input_pre3:
lodsb
;--------------------------------------
@@:
cmp al,0Fh
jnz ip3
dec ecx
jz input_pre_done3
lodsb
cmp al,80h
jb @b
cmp al,90h
jb @f
;--------------------------------------
ip3:
sub al,0E8h
cmp al,1
ja input_pre_cont3
;--------------------------------------
@@:
cmp ecx,5
jb input_pre_done3
lodsd
add eax,esi
sub eax,[inptr]
cmp eax,[insize1]
jae xxx3
cmp eax,1000000h
jae xxx3
sub ecx,4
xchg al,ah
rol eax,16
xchg al,ah
mov [esi-4],eax
inc edx
mov [ebx],esi
add ebx,4
jmp input_pre_cont3
;*********************************************************************
xxx3:
sub esi,4
movzx eax,byte [esi]
mov byte [eax+edi],1
;--------------------------------------
input_pre_cont3:
loop input_pre3
;--------------------------------------
input_pre_done3:
mov [ctn],edx
xor eax,eax
mov ecx,256
repnz scasb
jnz pack_calltrick_done
not cl
mov [cti],cl
;--------------------------------------
@@:
cmp ebx,[inbuftmp] ;inbuftmp
jz pack_calltrick_done
sub ebx,4
mov eax,[ebx]
mov [eax-4],cl
jmp @b
;*********************************************************************
pack_calltrick_done:
ret
;*********************************************************************
include 'loader_lzma.inc'
;*********************************************************************