forked from KolibriOS/kolibrios
f19e882566
Added code for packing the kernel.mnt git-svn-id: svn://kolibrios.org@1713 a494cfbc-eb01-0410-851d-a64ba20cac60
179 lines
2.7 KiB
PHP
179 lines
2.7 KiB
PHP
;*********************************************************************
|
|
unpack:
|
|
call displogo_and_readfile
|
|
jnz infileerr
|
|
|
|
mov ecx,[insize]
|
|
test ecx,ecx
|
|
jz infileerr
|
|
|
|
mcall 68,12
|
|
|
|
mov [infile],eax
|
|
|
|
mov ebx,fn70block
|
|
mov [ebx],byte 0
|
|
mov [ebx+16],eax
|
|
mov eax,[insize]
|
|
mov [ebx+12],eax
|
|
|
|
mcall 70
|
|
test eax,eax
|
|
jnz infileerr
|
|
|
|
mov eax,[infile]
|
|
cmp [eax],dword 'KPCK'
|
|
jz @f
|
|
;--------------------------------------
|
|
unpack_err:
|
|
call return_memory
|
|
mov esi,notpacked_str
|
|
push notpacked_len
|
|
pop ecx
|
|
jmp write_string
|
|
;---------------------------------------------------------------------
|
|
@@:
|
|
mov ecx,[eax+4]
|
|
add ecx,[insize]
|
|
|
|
mcall 68,20,,[infile]
|
|
|
|
mov [infile],eax
|
|
add eax,[insize]
|
|
mov [outfile],eax
|
|
mov [outfilebest],eax
|
|
|
|
|
|
mov esi,[infile]
|
|
mov eax,[esi+8]
|
|
push eax
|
|
and al,0C0h
|
|
cmp al,0C0h
|
|
pop eax
|
|
jz unpack_err
|
|
|
|
and al,not 0C0h
|
|
dec eax
|
|
jnz unpack_err
|
|
|
|
mov eax,[esi+4]
|
|
mov [outsize],eax
|
|
push eax
|
|
push [outfile]
|
|
add esi,11
|
|
push esi
|
|
mov eax,[esi+1]
|
|
xchg al,ah
|
|
ror eax,16
|
|
xchg al,ah
|
|
mov [esi+1],eax
|
|
call lzma_decompress
|
|
mov esi,[infile]
|
|
test [esi+8],byte 80h
|
|
jnz uctr1
|
|
|
|
test [esi+8],byte 40h
|
|
jz udone
|
|
|
|
add esi,[insize]
|
|
sub esi,5
|
|
lodsd
|
|
mov ecx,eax
|
|
jecxz udone
|
|
|
|
mov dl,[esi]
|
|
mov esi,[outfile]
|
|
;--------------------------------------
|
|
uc1:
|
|
lodsb
|
|
sub al,0E8h
|
|
cmp al,1
|
|
ja uc1
|
|
|
|
cmp [esi],dl
|
|
jnz uc1
|
|
|
|
lodsd
|
|
shr ax,8
|
|
ror eax,16
|
|
xchg al,ah
|
|
sub eax,esi
|
|
add eax,[outfile]
|
|
mov [esi-4],eax
|
|
loop uc1
|
|
jmp udone
|
|
;---------------------------------------------------------------------
|
|
uctr1:
|
|
add esi,[insize]
|
|
sub esi,5
|
|
lodsd
|
|
mov ecx,eax
|
|
jecxz udone
|
|
|
|
mov dl,[esi]
|
|
mov esi,[outfile]
|
|
;--------------------------------------
|
|
uc2:
|
|
lodsb
|
|
;--------------------------------------
|
|
@@:
|
|
cmp al,15
|
|
jnz uf
|
|
|
|
lodsb
|
|
cmp al,80h
|
|
jb @b
|
|
|
|
cmp al,90h
|
|
jb @f
|
|
;--------------------------------------
|
|
uf:
|
|
sub al,0E8h
|
|
cmp al,1
|
|
ja uc2
|
|
;--------------------------------------
|
|
@@:
|
|
cmp [esi],dl
|
|
jnz uc2
|
|
|
|
lodsd
|
|
shr ax,8
|
|
ror eax,16
|
|
xchg al,ah
|
|
sub eax,esi
|
|
add eax,[outfile]
|
|
mov [esi-4],eax
|
|
loop uc2
|
|
;--------------------------------------
|
|
udone:
|
|
mov esi,unpacked_ok
|
|
push unpacked_len
|
|
pop ecx
|
|
call write_string
|
|
jmp saveout
|
|
;*********************************************************************
|
|
return_memory:
|
|
mov ecx,[infile]
|
|
test ecx,ecx
|
|
jz @f
|
|
mcall 68,13,
|
|
xor eax,eax
|
|
mov [infile],eax
|
|
@@:
|
|
ret
|
|
;*********************************************************************
|
|
displogo_and_readfile:
|
|
call clear_mess_and_displogo
|
|
; load input file
|
|
mov esi,inname
|
|
call get_full_name
|
|
mov ebx,fn70block
|
|
mov [ebx],dword 5
|
|
and [ebx+4],dword 0
|
|
and [ebx+8],dword 0
|
|
and [ebx+12],dword 0
|
|
mov [ebx+16],dword file_attr
|
|
mcall 70
|
|
test eax,eax
|
|
ret
|
|
;********************************************************************* |