forked from KolibriOS/kolibrios
removed KlbrInWin, in the main repository it is offtopic
git-svn-id: svn://kolibrios.org@2297 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
6e3f4100a5
commit
5fc7def903
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 19 KiB |
Binary file not shown.
File diff suppressed because it is too large
Load Diff
@ -1,80 +0,0 @@
|
|||||||
[Disk]
|
|
||||||
# path to ramdisk, must end with '\'
|
|
||||||
RamDisk=
|
|
||||||
|
|
||||||
# hard disks:
|
|
||||||
# there may be up to 4 physical harddisks,
|
|
||||||
# each may contain 1 or more partitions (but no more than 255)
|
|
||||||
# (sysfunction 18::11 returns this number as byte)
|
|
||||||
# 255 should be enough :-)
|
|
||||||
# Syntax:
|
|
||||||
# hd<i>n = number of partitions for /hd<i>, 0 <= i <= 3
|
|
||||||
# hd<i>_<j> = Win32 path for /hd<i>/<j>, 0 <= i <= 3, 1 <= j <= hd<i>n
|
|
||||||
# must end with '\'; ',readonly' string may follow
|
|
||||||
# (j is represented in decimal system)
|
|
||||||
# (if harddisk /hd<i> is used, all partitions /hd<i>/<j> must be defined)
|
|
||||||
|
|
||||||
[Main]
|
|
||||||
# skin file name
|
|
||||||
Skin=orqua.skn
|
|
||||||
|
|
||||||
# first font must be 9*0x100 bytes, second 10*0x100 bytes
|
|
||||||
Font1=char.mt
|
|
||||||
Font2=char2.mt
|
|
||||||
|
|
||||||
# DO NOT MODIFY THIS PARAMETER UNLESS YOU KNOW WHAT ARE YOU DOING!!!
|
|
||||||
# if this parameter is not empty,
|
|
||||||
# on NT/2k/XP+ administrator rights are required
|
|
||||||
# enables i/o ports for function 46
|
|
||||||
# all ports from this parameter can be reserved with fn46,
|
|
||||||
# and (after reservation) may be accessed via in/out.
|
|
||||||
# DO NOT ADD SYSTEM CRITICAL PORTS!!!
|
|
||||||
# USE THIS PARAMETER ONLY AT YOUR OWN RISK!!!
|
|
||||||
# note that Menuet/Kolibri reserves ports 0-FF for system use
|
|
||||||
# syntax: EnablePorts=port1 port2beg-port2end port3 ...
|
|
||||||
# (when range is used, both begin and end are included)
|
|
||||||
# example (only for syntax demonstration!!!): EnablePorts=A3 B1 92-9f 70-74 269
|
|
||||||
# total length of parameter string is limited to 1024 chars (must be enough :) )
|
|
||||||
EnablePorts=
|
|
||||||
|
|
||||||
# boolean parameters (true/false)
|
|
||||||
# if at least one of these parameters is true,
|
|
||||||
# on NT/2k/XP+ administrator rights are required
|
|
||||||
|
|
||||||
# enables function 68.3
|
|
||||||
AllowReadMSR=false
|
|
||||||
# enables function 62
|
|
||||||
AllowReadPCI=false
|
|
||||||
|
|
||||||
# do not unload driver when exiting
|
|
||||||
KeepLoadedDriver=false
|
|
||||||
|
|
||||||
[Questions]
|
|
||||||
# on set background question
|
|
||||||
# 0=ask, 1=set permanently, 2=set temporarily, 3=don't set
|
|
||||||
SetBgr=0
|
|
||||||
|
|
||||||
[sys_setup]
|
|
||||||
# kernel global variable sound_flag
|
|
||||||
# 0=playnote sound on, 1=off (it is for 55::55 function only)
|
|
||||||
sound_flag=0
|
|
||||||
# 0=min (no sound), 127=max
|
|
||||||
sound_vol=10
|
|
||||||
|
|
||||||
# kernel global variable syslang (see functions 21::5, 26::5)
|
|
||||||
# 1=eng 2=fi 3=ger 4=ru
|
|
||||||
syslang=1
|
|
||||||
|
|
||||||
# kernel global variable keyboard (see functions 21::2::9, 26::2::9)
|
|
||||||
# 1=eng 2=fi 3=ger 4=ru
|
|
||||||
# Note that this definition doesn't affect keymap tables,
|
|
||||||
# it only sets variable for functions above
|
|
||||||
# (in Kolibri application @panel/setup changes keymap tables)
|
|
||||||
keyboard=1
|
|
||||||
|
|
||||||
[DirectScreenAccess]
|
|
||||||
# bits per pixel, currently supported 0 (=disable), 24, 32
|
|
||||||
ColorDepth=32
|
|
||||||
# When the program first accesses [gs:N] data, the snapshot is created.
|
|
||||||
# Other accesses within InvalidateTime milliseconds use this snapshot.
|
|
||||||
DSAInvalidateTime=200
|
|
@ -1,21 +0,0 @@
|
|||||||
IDD_DIALOG1 = 101
|
|
||||||
IDI_ICON1 = 103
|
|
||||||
IDC_RAMDISK = 1001
|
|
||||||
IDC_RAMDISK_BROWSE = 1002
|
|
||||||
IDC_PARTITION = 1003
|
|
||||||
IDC_HD_DEV = 1004
|
|
||||||
IDC_HD_PART = 1005
|
|
||||||
IDC_ADD_PARTITION = 1006
|
|
||||||
IDC_DEL_PARTITION = 1007
|
|
||||||
IDC_PARTITION_BROWSE = 1008
|
|
||||||
IDC_CHECK1 = 1009
|
|
||||||
IDC_SKIN = 1010
|
|
||||||
IDC_SKIN_BROWSE = 1011
|
|
||||||
IDC_FONT1 = 1012
|
|
||||||
IDC_FONT1_BROWSE = 1013
|
|
||||||
IDC_FONT2 = 1014
|
|
||||||
IDC_FONT2_BROWSE = 1015
|
|
||||||
IDC_EMPTY_EXT = 1016
|
|
||||||
IDC_NOTEMPTY_EXT = 1017
|
|
||||||
IDC_EXTENSIONS = 1018
|
|
||||||
IDC_PATH_STRING = 1019
|
|
@ -1,238 +0,0 @@
|
|||||||
; kiw0.sys - KlbrInWin ring-0 component
|
|
||||||
; (c) diamond, 2006, 2007, 2008
|
|
||||||
; Cb-n#%li.-# @l$i Lkbnbe
|
|
||||||
DRIVER_VERSION = 1
|
|
||||||
format PE native
|
|
||||||
section '.text' code data readable writable executable
|
|
||||||
;section '.text' code readable executable
|
|
||||||
entry start
|
|
||||||
start:
|
|
||||||
push eax
|
|
||||||
push esp
|
|
||||||
push 0
|
|
||||||
push 0
|
|
||||||
push 22h ; FILE_DEVICE_UNKNOWN
|
|
||||||
push devname
|
|
||||||
push 0
|
|
||||||
push dword [esp+20h]
|
|
||||||
call [IoCreateDevice]
|
|
||||||
pop ecx
|
|
||||||
test eax, eax
|
|
||||||
js .ret
|
|
||||||
push ecx
|
|
||||||
push devname
|
|
||||||
push symlinkname
|
|
||||||
call [IoCreateSymbolicLink]
|
|
||||||
pop ecx
|
|
||||||
test eax, eax
|
|
||||||
jns @f
|
|
||||||
push eax
|
|
||||||
push ecx
|
|
||||||
call [IoDeleteDevice]
|
|
||||||
pop eax
|
|
||||||
jmp .ret
|
|
||||||
@@:
|
|
||||||
mov eax, [esp+4]
|
|
||||||
mov dword [eax+38h], DispatchCreateClose
|
|
||||||
mov dword [eax+40h], DispatchCreateClose
|
|
||||||
mov dword [eax+70h], DispatchControl
|
|
||||||
mov dword [eax+34h], DriverUnload
|
|
||||||
push 'kiw0'
|
|
||||||
push 2000h
|
|
||||||
push 0
|
|
||||||
call [ExAllocatePoolWithTag]
|
|
||||||
mov [oldiomap], eax
|
|
||||||
push eax
|
|
||||||
push 1
|
|
||||||
call [Ke386QueryIoAccessMap]
|
|
||||||
xor eax, eax
|
|
||||||
.ret:
|
|
||||||
ret 8
|
|
||||||
|
|
||||||
DriverUnload:
|
|
||||||
push symlinkname
|
|
||||||
call [IoDeleteSymbolicLink]
|
|
||||||
mov eax, [esp+4]
|
|
||||||
push dword [eax+4]
|
|
||||||
call [IoDeleteDevice]
|
|
||||||
push [oldiomap]
|
|
||||||
push 1
|
|
||||||
call [Ke386SetIoAccessMap]
|
|
||||||
push [oldiomap]
|
|
||||||
call [ExFreePool]
|
|
||||||
ret 4
|
|
||||||
|
|
||||||
DispatchCreateClose:
|
|
||||||
mov ecx, [esp+8]
|
|
||||||
xor edx, edx
|
|
||||||
mov [ecx+18h], edx
|
|
||||||
mov [ecx+1Ch], edx
|
|
||||||
call [IofCompleteRequest]
|
|
||||||
xor eax, eax
|
|
||||||
ret 8
|
|
||||||
|
|
||||||
DispatchControl:
|
|
||||||
mov ecx, [esp+8]
|
|
||||||
mov eax, [ecx+60h]
|
|
||||||
cmp dword [eax+0Ch], 0x222000
|
|
||||||
jz .readmsr
|
|
||||||
cmp dword [eax+0Ch], 0x222004
|
|
||||||
jz .readpci
|
|
||||||
cmp dword [eax+0Ch], 0x222008
|
|
||||||
jz .getversion
|
|
||||||
cmp dword [eax+0Ch], 0x22203C
|
|
||||||
jnz .invreq
|
|
||||||
cmp dword [eax+8], 2000h
|
|
||||||
jnz .invreq
|
|
||||||
push ecx
|
|
||||||
push dword [ecx+0Ch]
|
|
||||||
push 1
|
|
||||||
call [Ke386SetIoAccessMap]
|
|
||||||
push 1
|
|
||||||
call [IoGetCurrentProcess]
|
|
||||||
push eax
|
|
||||||
call [Ke386IoSetAccessProcess]
|
|
||||||
str ax
|
|
||||||
sub esp, 6
|
|
||||||
sgdt [esp]
|
|
||||||
pop cx
|
|
||||||
pop ecx
|
|
||||||
movzx eax, ax
|
|
||||||
mov dh, [eax+ecx+7]
|
|
||||||
mov dl, [eax+ecx+4]
|
|
||||||
shl edx, 16
|
|
||||||
mov dx, [eax+ecx+2]
|
|
||||||
mov word [edx+66h], 88h
|
|
||||||
pop ecx
|
|
||||||
xor eax, eax
|
|
||||||
mov [ecx+1Ch], eax
|
|
||||||
jmp .ret
|
|
||||||
.getversion:
|
|
||||||
cmp dword [eax+4], 4
|
|
||||||
jnz .invreq
|
|
||||||
mov eax, [ecx+0Ch]
|
|
||||||
mov dword [eax], DRIVER_VERSION
|
|
||||||
mov dword [ecx+1Ch], 4
|
|
||||||
jmp .ret0
|
|
||||||
.readmsr:
|
|
||||||
cmp dword [eax+8], 4
|
|
||||||
jnz .invreq
|
|
||||||
cmp dword [eax+4], 9
|
|
||||||
jnz .invreq
|
|
||||||
push ecx
|
|
||||||
mov ecx, [ecx+0Ch]
|
|
||||||
mov byte [ecx+8], 0 ; assume OK
|
|
||||||
; rdmsr may throw exception
|
|
||||||
push .exception_handler
|
|
||||||
push dword [fs:0]
|
|
||||||
mov [fs:0], esp
|
|
||||||
push ecx
|
|
||||||
mov ecx, [ecx]
|
|
||||||
rdmsr
|
|
||||||
pop ecx
|
|
||||||
mov [ecx], eax
|
|
||||||
mov [ecx+4], edx
|
|
||||||
.msr_common:
|
|
||||||
pop dword [fs:0]
|
|
||||||
pop ecx
|
|
||||||
pop ecx
|
|
||||||
mov dword [ecx+1Ch], 9
|
|
||||||
.ret0:
|
|
||||||
xor eax, eax
|
|
||||||
jmp .ret
|
|
||||||
.invreq2:
|
|
||||||
pop ecx
|
|
||||||
.invreq:
|
|
||||||
mov eax, 0xC0000010 ; STATUS_INVALID_DEVICE_REQUEST
|
|
||||||
.ret:
|
|
||||||
push eax
|
|
||||||
mov [ecx+18h], eax
|
|
||||||
xor edx, edx
|
|
||||||
call [IofCompleteRequest]
|
|
||||||
pop eax
|
|
||||||
ret 8
|
|
||||||
.exception_handler:
|
|
||||||
mov eax, [esp+12]
|
|
||||||
mov dword [eax+0xB8], .no_msr
|
|
||||||
xor eax, eax
|
|
||||||
ret
|
|
||||||
.no_msr:
|
|
||||||
pop ecx
|
|
||||||
mov byte [ecx+8], 1
|
|
||||||
jmp .msr_common
|
|
||||||
.readpci:
|
|
||||||
cmp dword [eax+8], 4
|
|
||||||
jnz .invreq
|
|
||||||
cmp dword [eax+4], 4
|
|
||||||
jnz .invreq
|
|
||||||
push ecx
|
|
||||||
mov ecx, [ecx+0Ch]
|
|
||||||
movzx eax, byte [ecx]
|
|
||||||
cmp al, 2
|
|
||||||
ja .invreq2
|
|
||||||
jb @f
|
|
||||||
inc eax
|
|
||||||
@@:
|
|
||||||
test byte [ecx+2], al
|
|
||||||
jnz .readpci.unaligned
|
|
||||||
inc eax
|
|
||||||
push eax
|
|
||||||
push eax ; Length
|
|
||||||
movzx eax, byte [ecx+2]
|
|
||||||
push eax ; Offset
|
|
||||||
push ecx ; Buffer
|
|
||||||
movzx eax, byte [ecx+3]
|
|
||||||
ror al, 3
|
|
||||||
push eax ; SlotNumber
|
|
||||||
movzx eax, byte [ecx+1]
|
|
||||||
push eax ; BusNumber
|
|
||||||
push 4 ; PCIConfiguration
|
|
||||||
or dword [ecx], -1
|
|
||||||
call [HalGetBusDataByOffset]
|
|
||||||
pop edx
|
|
||||||
pop ecx
|
|
||||||
mov dword [ecx+1Ch], edx
|
|
||||||
jmp .ret0
|
|
||||||
.readpci.unaligned:
|
|
||||||
or dword [ecx], -1
|
|
||||||
pop ecx
|
|
||||||
mov dword [ecx+1Ch], 4
|
|
||||||
jmp .ret0
|
|
||||||
|
|
||||||
include 'd:\program files\fasm\fasmw16723\include\win32a.inc'
|
|
||||||
data import
|
|
||||||
library ntoskrnl,'ntoskrnl.exe',hal,'hal.dll'
|
|
||||||
import ntoskrnl, \
|
|
||||||
IoCreateDevice, 'IoCreateDevice', \
|
|
||||||
IoCreateSymbolicLink, 'IoCreateSymbolicLink', \
|
|
||||||
IoDeleteDevice, 'IoDeleteDevice', \
|
|
||||||
IoDeleteSymbolicLink, 'IoDeleteSymbolicLink', \
|
|
||||||
IoGetCurrentProcess, 'IoGetCurrentProcess', \
|
|
||||||
Ke386QueryIoAccessMap, 'Ke386QueryIoAccessMap', \
|
|
||||||
Ke386SetIoAccessMap, 'Ke386SetIoAccessMap', \
|
|
||||||
Ke386IoSetAccessProcess, 'Ke386IoSetAccessProcess', \
|
|
||||||
IofCompleteRequest, 'IofCompleteRequest', \
|
|
||||||
ExAllocatePoolWithTag, 'ExAllocatePoolWithTag', \
|
|
||||||
ExFreePool, 'ExFreePool'
|
|
||||||
import hal, HalGetBusDataByOffset, 'HalGetBusDataByOffset'
|
|
||||||
end data
|
|
||||||
|
|
||||||
str1 db 'control code 0x%X',13,10,0
|
|
||||||
str2 db 'kiw0 loaded',13,10,0
|
|
||||||
|
|
||||||
devname:
|
|
||||||
dw 12*2
|
|
||||||
dw 13*2
|
|
||||||
dd @f
|
|
||||||
@@ du '\Device\kiw0',0
|
|
||||||
symlinkname:
|
|
||||||
dw 16*2
|
|
||||||
dw 17*2
|
|
||||||
dd @f
|
|
||||||
@@ du '\DosDevices\kiw0',0
|
|
||||||
|
|
||||||
data fixups
|
|
||||||
end data
|
|
||||||
|
|
||||||
;section '.data' data readable writable
|
|
||||||
oldiomap dd ?
|
|
@ -1,492 +0,0 @@
|
|||||||
; void __stdcall unpack(void* packed_data, void* unpacked_data);
|
|
||||||
unpack:
|
|
||||||
pushad
|
|
||||||
mov esi, [esp+32+4]
|
|
||||||
mov edi, [esp+32+8]
|
|
||||||
mov eax, [esi+8]
|
|
||||||
and al, 0xC0
|
|
||||||
cmp al, 0xC0
|
|
||||||
jz .failed
|
|
||||||
mov eax, [esi+8]
|
|
||||||
push eax
|
|
||||||
add esi, 12
|
|
||||||
and al, not 0xC0
|
|
||||||
dec eax
|
|
||||||
jz .lzma
|
|
||||||
.failed:
|
|
||||||
pop eax
|
|
||||||
popad
|
|
||||||
ret 8
|
|
||||||
.lzma:
|
|
||||||
call .lzma_unpack
|
|
||||||
.common:
|
|
||||||
pop eax
|
|
||||||
test al, 0x80
|
|
||||||
jnz .ctr1
|
|
||||||
test al, 0x40
|
|
||||||
jz .ok
|
|
||||||
lodsd
|
|
||||||
mov ecx, eax
|
|
||||||
jecxz .ok
|
|
||||||
mov dl, [esi]
|
|
||||||
mov esi, [esp+32+8]
|
|
||||||
.c1:
|
|
||||||
lodsb
|
|
||||||
sub al, 0E8h
|
|
||||||
cmp al, 1
|
|
||||||
ja .c1
|
|
||||||
cmp byte [esi], dl
|
|
||||||
jnz .c1
|
|
||||||
lodsd
|
|
||||||
; "bswap eax" is not supported on i386
|
|
||||||
shr ax, 8
|
|
||||||
ror eax, 16
|
|
||||||
xchg al, ah
|
|
||||||
sub eax, esi
|
|
||||||
add eax, [esp+32+8]
|
|
||||||
mov [esi-4], eax
|
|
||||||
loop .c1
|
|
||||||
.ok:
|
|
||||||
popad
|
|
||||||
ret 8
|
|
||||||
.ctr1:
|
|
||||||
lodsd
|
|
||||||
mov ecx, eax
|
|
||||||
jecxz .ok
|
|
||||||
mov dl, [esi]
|
|
||||||
mov esi, [esp+32+8]
|
|
||||||
.c2:
|
|
||||||
lodsb
|
|
||||||
@@:
|
|
||||||
cmp al, 0xF
|
|
||||||
jnz .f
|
|
||||||
lodsb
|
|
||||||
cmp al, 80h
|
|
||||||
jb @b
|
|
||||||
cmp al, 90h
|
|
||||||
jb @f
|
|
||||||
.f:
|
|
||||||
sub al, 0E8h
|
|
||||||
cmp al, 1
|
|
||||||
ja .c2
|
|
||||||
@@:
|
|
||||||
cmp byte [esi], dl
|
|
||||||
jnz .c2
|
|
||||||
lodsd
|
|
||||||
shr ax, 8
|
|
||||||
ror eax, 16
|
|
||||||
xchg al, ah
|
|
||||||
sub eax, esi
|
|
||||||
add eax, [esp+32+8]
|
|
||||||
mov [esi-4], eax
|
|
||||||
loop .c2
|
|
||||||
jmp .ok
|
|
||||||
|
|
||||||
.lzma_unpack:
|
|
||||||
|
|
||||||
.pb = 2 ; pos state bits
|
|
||||||
.lp = 0 ; literal pos state bits
|
|
||||||
.lc = 3 ; literal context bits
|
|
||||||
.posStateMask = ((1 shl .pb)-1)
|
|
||||||
.literalPosMask = ((1 shl .lp)-1)
|
|
||||||
|
|
||||||
.kNumPosBitsMax = 4
|
|
||||||
.kNumPosStatesMax = (1 shl .kNumPosBitsMax)
|
|
||||||
|
|
||||||
.kLenNumLowBits = 3
|
|
||||||
.kLenNumLowSymbols = (1 shl .kLenNumLowBits)
|
|
||||||
.kLenNumMidBits = 3
|
|
||||||
.kLenNumMidSymbols = (1 shl .kLenNumMidBits)
|
|
||||||
.kLenNumHighBits = 8
|
|
||||||
.kLenNumHighSymbols = (1 shl .kLenNumHighBits)
|
|
||||||
|
|
||||||
.LenChoice = 0
|
|
||||||
.LenChoice2 = 1
|
|
||||||
.LenLow = 2
|
|
||||||
.LenMid = (.LenLow + (.kNumPosStatesMax shl .kLenNumLowBits))
|
|
||||||
.LenHigh = (.LenMid + (.kNumPosStatesMax shl .kLenNumMidBits))
|
|
||||||
.kNumLenProbs = (.LenHigh + .kLenNumHighSymbols)
|
|
||||||
|
|
||||||
.kNumStates = 12
|
|
||||||
.kNumLitStates = 7
|
|
||||||
.kStartPosModelIndex = 4
|
|
||||||
.kEndPosModelIndex = 14
|
|
||||||
.kNumFullDistances = (1 shl (.kEndPosModelIndex/2))
|
|
||||||
.kNumPosSlotBits = 6
|
|
||||||
.kNumLenToPosStates = 4
|
|
||||||
.kNumAlignBits = 4
|
|
||||||
.kAlignTableSize = (1 shl .kNumAlignBits)
|
|
||||||
.kMatchMinLen = 2
|
|
||||||
|
|
||||||
.IsMatch = 0
|
|
||||||
.IsRep = (.IsMatch + (.kNumStates shl .kNumPosBitsMax))
|
|
||||||
.IsRepG0 = (.IsRep + .kNumStates)
|
|
||||||
.IsRepG1 = (.IsRepG0 + .kNumStates)
|
|
||||||
.IsRepG2 = (.IsRepG1 + .kNumStates)
|
|
||||||
.IsRep0Long = (.IsRepG2 + .kNumStates)
|
|
||||||
.PosSlot = (.IsRep0Long + (.kNumStates shl .kNumPosBitsMax))
|
|
||||||
.SpecPos = (.PosSlot + (.kNumLenToPosStates shl .kNumPosSlotBits))
|
|
||||||
.Align_ = (.SpecPos + .kNumFullDistances - .kEndPosModelIndex)
|
|
||||||
.Lencoder = (.Align_ + .kAlignTableSize)
|
|
||||||
.RepLencoder = (.Lencoder + .kNumLenProbs)
|
|
||||||
.Literal = (.RepLencoder + .kNumLenProbs)
|
|
||||||
|
|
||||||
.LZMA_BASE_SIZE = 1846 ; must be ==Literal
|
|
||||||
.LZMA_LIT_SIZE = 768
|
|
||||||
|
|
||||||
.kNumTopBits = 24
|
|
||||||
.kTopValue = (1 shl .kNumTopBits)
|
|
||||||
|
|
||||||
.kNumBitModelTotalBits = 11
|
|
||||||
.kBitModelTotal = (1 shl .kNumBitModelTotalBits)
|
|
||||||
.kNumMoveBits = 5
|
|
||||||
|
|
||||||
push edi
|
|
||||||
; int state=0;
|
|
||||||
xor ebx, ebx
|
|
||||||
mov [.previousByte], bl
|
|
||||||
; unsigned rep0=1,rep1=1,rep2=1,rep3=1;
|
|
||||||
mov eax, 1
|
|
||||||
mov edi, .rep0
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
; int len=0;
|
|
||||||
; result=0;
|
|
||||||
mov ecx, .Literal + (.LZMA_LIT_SIZE shl (.lc+.lp))
|
|
||||||
mov eax, .kBitModelTotal/2
|
|
||||||
mov edi, .p
|
|
||||||
rep stosd
|
|
||||||
; RangeDecoderInit
|
|
||||||
; rd->ExtraBytes = 0
|
|
||||||
; rd->Buffer = stream
|
|
||||||
; rd->BufferLim = stream+bufferSize
|
|
||||||
; rd->Range = 0xFFFFFFFF
|
|
||||||
pop edi
|
|
||||||
mov ebp, [esi-8] ; dest_length
|
|
||||||
add ebp, edi ; ebp = destination limit
|
|
||||||
lodsd
|
|
||||||
; rd->code_ = eax
|
|
||||||
mov [.code_], eax
|
|
||||||
or [.range], -1
|
|
||||||
.main_loop:
|
|
||||||
cmp edi, ebp
|
|
||||||
jae .main_loop_done
|
|
||||||
mov edx, edi
|
|
||||||
and edx, .posStateMask
|
|
||||||
mov eax, ebx
|
|
||||||
shl eax, .kNumPosBitsMax+2
|
|
||||||
lea eax, [.p + .IsMatch*4 + eax + edx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
jc .1
|
|
||||||
movzx eax, [.previousByte]
|
|
||||||
if .literalPosMask
|
|
||||||
mov ah, dl
|
|
||||||
and ah, .literalPosMask
|
|
||||||
end if
|
|
||||||
shr eax, 8-.lc
|
|
||||||
imul eax, .LZMA_LIT_SIZE*4
|
|
||||||
add eax, .p+.Literal*4
|
|
||||||
cmp ebx, .kNumLitStates
|
|
||||||
jb .literal
|
|
||||||
xor edx, edx
|
|
||||||
sub edx, [.rep0]
|
|
||||||
mov dl, [edi + edx]
|
|
||||||
call .LzmaLiteralDecodeMatch
|
|
||||||
jmp @f
|
|
||||||
.literal:
|
|
||||||
call .LzmaLiteralDecode
|
|
||||||
@@:
|
|
||||||
mov [.previousByte], al
|
|
||||||
stosb
|
|
||||||
mov al, bl
|
|
||||||
cmp bl, 4
|
|
||||||
jb @f
|
|
||||||
mov al, 3
|
|
||||||
cmp bl, 10
|
|
||||||
jb @f
|
|
||||||
mov al, 6
|
|
||||||
@@: sub bl, al
|
|
||||||
jmp .main_loop
|
|
||||||
.1:
|
|
||||||
lea eax, [.p + .IsRep*4 + ebx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
jnc .10
|
|
||||||
lea eax, [.p + .IsRepG0*4 + ebx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
jc .111
|
|
||||||
mov eax, ebx
|
|
||||||
shl eax, .kNumPosBitsMax+2
|
|
||||||
lea eax, [.p + .IsRep0Long*4 + eax + edx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
jc .1101
|
|
||||||
cmp bl, 7
|
|
||||||
setae bl
|
|
||||||
lea ebx, [9 + ebx + ebx]
|
|
||||||
xor edx, edx
|
|
||||||
sub edx, [.rep0]
|
|
||||||
mov al, [edi + edx]
|
|
||||||
stosb
|
|
||||||
mov [.previousByte], al
|
|
||||||
jmp .main_loop
|
|
||||||
.111:
|
|
||||||
lea eax, [.p + .IsRepG1*4 + ebx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
mov eax, [.rep1]
|
|
||||||
jnc .l3
|
|
||||||
.l1:
|
|
||||||
lea eax, [.p + .IsRepG2*4 + ebx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
mov eax, [.rep2]
|
|
||||||
jnc .l2
|
|
||||||
xchg [.rep3], eax
|
|
||||||
.l2:
|
|
||||||
push [.rep1]
|
|
||||||
pop [.rep2]
|
|
||||||
.l3:
|
|
||||||
xchg eax, [.rep0]
|
|
||||||
mov [.rep1], eax
|
|
||||||
.1101:
|
|
||||||
mov eax, .p + .RepLencoder*4
|
|
||||||
call .LzmaLenDecode
|
|
||||||
cmp bl, 7
|
|
||||||
setc bl
|
|
||||||
adc bl, bl
|
|
||||||
xor bl, 3
|
|
||||||
add bl, 8
|
|
||||||
jmp .repmovsb
|
|
||||||
.10:
|
|
||||||
mov eax, [.rep0]
|
|
||||||
xchg eax, [.rep1]
|
|
||||||
xchg eax, [.rep2]
|
|
||||||
xchg eax, [.rep3]
|
|
||||||
cmp bl, 7
|
|
||||||
setc bl
|
|
||||||
adc bl, bl
|
|
||||||
xor bl, 3
|
|
||||||
add bl, 7
|
|
||||||
mov eax, .p + .Lencoder*4
|
|
||||||
call .LzmaLenDecode
|
|
||||||
mov eax, .kNumLenToPosStates-1
|
|
||||||
cmp eax, ecx
|
|
||||||
jb @f
|
|
||||||
mov eax, ecx
|
|
||||||
@@:
|
|
||||||
push ecx
|
|
||||||
mov ecx, .kNumPosSlotBits
|
|
||||||
shl eax, cl
|
|
||||||
shl eax, 2
|
|
||||||
add eax, .p+.PosSlot*4
|
|
||||||
call .RangeDecoderBitTreeDecode
|
|
||||||
mov [.rep0], ecx
|
|
||||||
cmp ecx, .kStartPosModelIndex
|
|
||||||
jb .l6
|
|
||||||
push ecx
|
|
||||||
mov eax, ecx
|
|
||||||
and eax, 1
|
|
||||||
shr ecx, 1
|
|
||||||
or eax, 2
|
|
||||||
dec ecx
|
|
||||||
shl eax, cl
|
|
||||||
mov [.rep0], eax
|
|
||||||
pop edx
|
|
||||||
cmp edx, .kEndPosModelIndex
|
|
||||||
jae .l5
|
|
||||||
sub eax, edx
|
|
||||||
shl eax, 2
|
|
||||||
add eax, .p + (.SpecPos - 1)*4
|
|
||||||
call .RangeDecoderReverseBitTreeDecode
|
|
||||||
add [.rep0], ecx
|
|
||||||
jmp .l6
|
|
||||||
.l5:
|
|
||||||
sub ecx, .kNumAlignBits
|
|
||||||
call .RangeDecoderDecodeDirectBits
|
|
||||||
mov ecx, .kNumAlignBits
|
|
||||||
shl eax, cl
|
|
||||||
add [.rep0], eax
|
|
||||||
mov eax, .p+.Align_*4
|
|
||||||
call .RangeDecoderReverseBitTreeDecode
|
|
||||||
add [.rep0], ecx
|
|
||||||
.l6:
|
|
||||||
pop ecx
|
|
||||||
inc [.rep0]
|
|
||||||
jz .main_loop_done
|
|
||||||
.repmovsb:
|
|
||||||
add ecx, .kMatchMinLen
|
|
||||||
push esi
|
|
||||||
mov esi, edi
|
|
||||||
sub esi, [.rep0]
|
|
||||||
rep movsb
|
|
||||||
pop esi
|
|
||||||
mov al, [edi-1]
|
|
||||||
mov [.previousByte], al
|
|
||||||
jmp .main_loop
|
|
||||||
.main_loop_done:
|
|
||||||
ret
|
|
||||||
|
|
||||||
.RangeDecoderBitDecode:
|
|
||||||
; in: eax->prob
|
|
||||||
; out: CF=bit; destroys eax
|
|
||||||
push edx
|
|
||||||
mov edx, [.range]
|
|
||||||
shr edx, .kNumBitModelTotalBits
|
|
||||||
imul edx, [eax]
|
|
||||||
cmp [.code_], edx
|
|
||||||
jae .ae
|
|
||||||
mov [.range], edx
|
|
||||||
mov edx, .kBitModelTotal
|
|
||||||
sub edx, [eax]
|
|
||||||
shr edx, .kNumMoveBits
|
|
||||||
add [eax], edx
|
|
||||||
clc
|
|
||||||
.n:
|
|
||||||
lahf
|
|
||||||
cmp [.range], .kTopValue
|
|
||||||
jae @f
|
|
||||||
shl [.range], 8
|
|
||||||
shl [.code_], 8
|
|
||||||
lodsb
|
|
||||||
mov byte [.code_], al
|
|
||||||
@@:
|
|
||||||
sahf
|
|
||||||
pop edx
|
|
||||||
ret
|
|
||||||
.ae:
|
|
||||||
sub [.range], edx
|
|
||||||
sub [.code_], edx
|
|
||||||
mov edx, [eax]
|
|
||||||
shr edx, .kNumMoveBits
|
|
||||||
sub [eax], edx
|
|
||||||
stc
|
|
||||||
jmp .n
|
|
||||||
|
|
||||||
.RangeDecoderDecodeDirectBits:
|
|
||||||
; in: ecx=numTotalBits
|
|
||||||
; out: eax=result; destroys edx
|
|
||||||
xor eax, eax
|
|
||||||
.l:
|
|
||||||
shr [.range], 1
|
|
||||||
shl eax, 1
|
|
||||||
mov edx, [.code_]
|
|
||||||
sub edx, [.range]
|
|
||||||
jb @f
|
|
||||||
mov [.code_], edx
|
|
||||||
or eax, 1
|
|
||||||
@@:
|
|
||||||
cmp [.range], .kTopValue
|
|
||||||
jae @f
|
|
||||||
shl [.range], 8
|
|
||||||
shl [.code_], 8
|
|
||||||
push eax
|
|
||||||
lodsb
|
|
||||||
mov byte [.code_], al
|
|
||||||
pop eax
|
|
||||||
@@:
|
|
||||||
loop .l
|
|
||||||
ret
|
|
||||||
|
|
||||||
.LzmaLiteralDecode:
|
|
||||||
; in: eax->probs
|
|
||||||
; out: al=byte; destroys edx
|
|
||||||
push ecx
|
|
||||||
mov ecx, 1
|
|
||||||
@@:
|
|
||||||
push eax
|
|
||||||
lea eax, [eax+ecx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
pop eax
|
|
||||||
adc cl, cl
|
|
||||||
jnc @b
|
|
||||||
.LzmaLiteralDecode.ret:
|
|
||||||
mov al, cl
|
|
||||||
pop ecx
|
|
||||||
ret
|
|
||||||
.LzmaLiteralDecodeMatch:
|
|
||||||
; in: eax->probs, dl=matchByte
|
|
||||||
; out: al=byte; destroys edx
|
|
||||||
push ecx
|
|
||||||
mov ecx, 1
|
|
||||||
.LzmaLiteralDecodeMatch.1:
|
|
||||||
add dl, dl
|
|
||||||
setc ch
|
|
||||||
push eax
|
|
||||||
lea eax, [eax+ecx*4+0x100*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
pop eax
|
|
||||||
adc cl, cl
|
|
||||||
jc .LzmaLiteralDecode.ret
|
|
||||||
xor ch, cl
|
|
||||||
test ch, 1
|
|
||||||
mov ch, 0
|
|
||||||
jnz @b
|
|
||||||
jmp .LzmaLiteralDecodeMatch.1
|
|
||||||
|
|
||||||
.LzmaLenDecode:
|
|
||||||
; in: eax->prob, edx=posState
|
|
||||||
; out: ecx=len
|
|
||||||
push eax
|
|
||||||
add eax, .LenChoice*4
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
pop eax
|
|
||||||
jnc .0
|
|
||||||
push eax
|
|
||||||
add eax, .LenChoice2*4
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
pop eax
|
|
||||||
jc @f
|
|
||||||
mov ecx, .kLenNumMidBits
|
|
||||||
shl edx, cl
|
|
||||||
lea eax, [eax + .LenMid*4 + edx*4]
|
|
||||||
call .RangeDecoderBitTreeDecode
|
|
||||||
add ecx, .kLenNumLowSymbols
|
|
||||||
ret
|
|
||||||
@@:
|
|
||||||
add eax, .LenHigh*4
|
|
||||||
mov ecx, .kLenNumHighBits
|
|
||||||
call .RangeDecoderBitTreeDecode
|
|
||||||
add ecx, .kLenNumLowSymbols + .kLenNumMidSymbols
|
|
||||||
ret
|
|
||||||
.0:
|
|
||||||
mov ecx, .kLenNumLowBits
|
|
||||||
shl edx, cl
|
|
||||||
lea eax, [eax + .LenLow*4 + edx*4]
|
|
||||||
.RangeDecoderBitTreeDecode:
|
|
||||||
; in: eax->probs,ecx=numLevels
|
|
||||||
; out: ecx=length; destroys edx
|
|
||||||
push ebx
|
|
||||||
mov edx, 1
|
|
||||||
mov ebx, edx
|
|
||||||
@@:
|
|
||||||
push eax
|
|
||||||
lea eax, [eax+edx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
pop eax
|
|
||||||
adc dl, dl
|
|
||||||
add bl, bl
|
|
||||||
loop @b
|
|
||||||
sub dl, bl
|
|
||||||
pop ebx
|
|
||||||
mov ecx, edx
|
|
||||||
ret
|
|
||||||
.RangeDecoderReverseBitTreeDecode:
|
|
||||||
; in: eax->probs,ecx=numLevels
|
|
||||||
; out: ecx=length; destroys edx
|
|
||||||
push ebx ecx
|
|
||||||
mov edx, 1
|
|
||||||
xor ebx, ebx
|
|
||||||
@@:
|
|
||||||
push eax
|
|
||||||
lea eax, [eax+edx*4]
|
|
||||||
call .RangeDecoderBitDecode
|
|
||||||
lahf
|
|
||||||
adc edx, edx
|
|
||||||
sahf
|
|
||||||
rcr ebx, 1
|
|
||||||
pop eax
|
|
||||||
loop @b
|
|
||||||
pop ecx
|
|
||||||
rol ebx, cl
|
|
||||||
mov ecx, ebx
|
|
||||||
pop ebx
|
|
||||||
ret
|
|
Loading…
Reference in New Issue
Block a user