KlbrInWin src uploaded

git-svn-id: svn://kolibrios.org@2292 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Kirill Lipatov (Leency) 2011-10-15 10:20:45 +00:00
parent a29fff6025
commit 6cfca28b78
9 changed files with 16533 additions and 0 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,80 @@
[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

View File

@ -0,0 +1,21 @@
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

View File

@ -0,0 +1,238 @@
; 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 ?

View File

@ -0,0 +1,492 @@
; 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