MENU.DAT: general update of Russian version

UNIMG: upload binnary, add to IMG
KWINE: upload to SVN, add to ISO

git-svn-id: svn://kolibrios.org@7864 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
2020-05-05 00:40:51 +00:00
parent dad5229ccd
commit 7d89f2686a
13 changed files with 1846 additions and 65 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,664 @@
; ------------------------------------------------------------- ;
; KWINE is a fork of program PELoad written by 0CodErr
; author - rgimad
; ------------------------------------------------------------- ;
ORG 0
BITS 32
; ------------------------------------------------------------- ;
PATH_SIZE equ 4096
PARAMS_SIZE equ 4096
STACK_SIZE equ 4096
END_ equ IMAGE_BASE - (PATH_SIZE + PARAMS_SIZE + STACK_SIZE)
; ------------------------------------------------------------- ;
IMAGE_BASE equ 400000H
; ------------------------------------------------------------- ;
MENUET01 db 'MENUET01'
version dd 1
program.start dd start_
program.end dd END_
program.memory dd END_ + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
program.stack dd END_ + PATH_SIZE + PARAMS_SIZE + STACK_SIZE
program.params dd END_ + PATH_SIZE
program.path dd END_
; ------------------------------------------------------------- ;
load.library:
mov eax, 68
mov ebx, 19
mov ecx, [esp + 4]
int 64
ret 4
; ------------------------------------------------------------- ;
getprocaddress:
mov edx, [esp + 8]
xor eax, eax
test edx, edx
jz .end
.next:
xor eax, eax
cmp [edx], dword 0
jz .end
mov esi, [edx]
mov edi, [esp + 4]
.next_:
lodsb
scasb
jne .fail
or al, al
jnz .next_
jmp .ok
.fail:
add edx, 8
jmp .next
.ok:
mov eax, [edx + 4]
.end:
ret 8
; ------------------------------------------------------------- ;
realloc.app.mem:
mov eax, 64
mov ebx, 1
mov ecx, [esp + 4]
int 64
ret 4
; ------------------------------------------------------------- ;
set.current.directory:
mov eax, 30
mov ebx, 1
mov ecx, [esp + 4]
int 64
ret 4
; ------------------------------------------------------------- ;
%if 0 ; comment
int2str:
%define number [esp + 8 + 8 * 4]
%define buffer [esp + 4 + 8 * 4]
pushad
mov edi, buffer
mov eax, " " ; 4 spaces
stosd
stosd
stosw
xor al, al
stosb
dec edi
dec edi
mov ecx, 10
mov eax, number
.next:
xor edx, edx
div ecx ; ecx = 10
add edx, 48 ; edx = (eax MOD ecx) + 48
mov [edi], dl
dec edi
test eax, eax
jnz .next
popad
ret 8
%undef number
%undef buffer
%endif ; endcomment
; ------------------------------------------------------------- ;
; test_file_path db "/hd3/1/mntest.exe",0
; complex
; address
; data
; hello
; numbers +-
; proc
; sptrim
; se
; clear
; locals +-
; tokenise -
; mntest
file_path dd 0
lib_name dd 0
lib dd 0
func dd 0
func_name dd 0
; ------------------------------------------------------------- ;
sz_pe_load db "PELoad",0
; ------------------------------------------------------------- ;
con_init dd 0
con_write_asciiz dd 0
con_exit dd 0
console dd 0
sz_con_init db "con_init",0
sz_con_write_asciiz db "con_write_asciiz",0
sz_con_exit db "con_exit",0
sz_console db "/sys/lib/console.obj",0
; ------------------------------------------------------------- ;
MZ dw 0
PE dw 0
lfa_new dd 0
NumberOfSections dd 0
SizeOfOptionalHeader dd 0
EntryPoint dd 0
SizeOfImage dd 0
SizeOfHeaders dd 0
DataDirectories dd 0
SectionsTable dd 0
Import dd 0
; ------------------------------------------------------------- ;
ERROR_MESSAGE dd 0
err_params db "Parameters error",0
err_file_path db "No input file path",0
err_read_file db "Read file error",0
err_mz_not_found db "No DOS signature found",0
err_pe_not_found db "No PE signature found",0
err_load_library db "Error load library: ",0
err_func_not_found db "Not found function: ",0
; ------------------------------------------------------------- ;
%if 0 ; comment
msg_buffer resb 256
sz_new_line db 10,0
sz_space db " ",0
sz_space_colon_space db " : ",0
%endif ; endcomment
sz_empty db "",0
start_:
; ------------------------------------------------------------- ;
; find params and file path
; mov eax, test_file_path
mov eax, [program.params]
cmp [eax], byte 34 ; quote
jne .no_quote
inc eax
mov edi, eax
.find_quote_or_zero:
cmp [edi], byte 0
je .found
cmp [edi], byte 34 ; quote
je .found
inc edi
jmp .find_quote_or_zero
.no_quote:
mov edi, eax
.find_space_or_zero:
cmp [edi], byte 0
je .found
cmp [edi], byte 32 ; space
je .found
inc edi
jmp .find_space_or_zero
.found:
mov [edi], byte 0
mov [file_path], eax
; check file path
mov eax, [file_path]
mov al, [eax]
test al, al
jne file_path_ok
mov [ERROR_MESSAGE], dword err_file_path
jmp ERROR
file_path_ok:
; check MZ signature (IMAGE_DOS_HEADER.e_magic)
push dword [file_path];filepath
dec esp
mov [esp], byte 0
push dword MZ;buffer
push dword 2;count
push dword 0
push dword 0;position
push dword 0
mov ebx, esp
mov eax, 70
int 64
test eax, eax
je read_ok
mov [ERROR_MESSAGE], dword err_read_file
jmp ERROR
read_ok:
cmp word [MZ], "MZ"
je MZ_exists
mov [ERROR_MESSAGE], dword err_mz_not_found
jmp ERROR
MZ_exists:
; get lfa_new (IMAGE_DOS_HEADER.e_lfanew)
push dword [file_path];filepath
dec esp
mov [esp], byte 0
push dword lfa_new;buffer
push dword 4;count
push dword 0
push dword 60;position
push dword 0
mov ebx, esp
mov eax, 70
int 64
; check PE signature (IMAGE_OPTIONAL_HEADER.Magic)
push dword [file_path];filepath
dec esp
mov [esp], byte 0
push dword PE;buffer
push dword 2;count
push dword 0
push dword [lfa_new];position
push dword 0
mov ebx, esp
mov eax, 70
int 64
cmp word [PE], "PE"
je PE_exists
mov [ERROR_MESSAGE], dword err_pe_not_found
jmp ERROR
PE_exists:
; get size of headers (IMAGE_OPTIONAL_HEADER.SizeOfHeaders)
push dword [file_path];filepath
dec esp
mov [esp], byte 0
push dword SizeOfHeaders;buffer
push dword 4;count
push dword 0
mov eax, [lfa_new]
add eax, 84
push eax;position
push dword 0
mov ebx, esp
mov eax, 70
int 64
; resize app memory and load headers
mov eax, IMAGE_BASE
add eax, [SizeOfHeaders]
push eax
call realloc.app.mem
push dword [file_path];filepath
dec esp
mov [esp], byte 0
push dword IMAGE_BASE;buffer
push dword [SizeOfHeaders];count
push dword 0
push dword 0;position
push dword 0
mov ebx, esp
mov eax, 70
int 64
add esp, (25 * 5) ; restore our stack top
mov edx, [lfa_new]
; get SizeOfImage (IMAGE_OPTIONAL_HEADER.SizeOfImage)
mov eax, [IMAGE_BASE + edx + 80]
mov [SizeOfImage], eax
; get EntryPoint (IMAGE_OPTIONAL_HEADER.AddressOfEntryPoint)
mov eax, [IMAGE_BASE + edx + 40]
mov [EntryPoint], eax
; get DataDirectories (IMAGE_OPTIONAL_HEADER.DataDirectory)
lea eax, [edx + 120]
mov [DataDirectories], eax
; get SizeOfOptionalHeader (IMAGE_FILE_HEADER.SizeOfOptionalHeader)
movzx eax, word [IMAGE_BASE + edx + 20]
mov [SizeOfOptionalHeader], ax
; get SectionsTable
lea eax, [edx + 24]
add ax, [SizeOfOptionalHeader]
mov [SectionsTable], eax
; get Import
mov eax, IMAGE_BASE
add eax, [DataDirectories]
add eax, 1 * 8
mov eax, [eax]
mov [Import], eax
; get NumberOfSections (IMAGE_FILE_HEADER.NumberOfSections)
movzx eax, word [IMAGE_BASE + edx + 6]
mov [NumberOfSections], eax
; resize app memory and load sections to their virtual address
mov eax, IMAGE_BASE
add eax, [SizeOfImage]
push eax
call realloc.app.mem
mov ecx, [NumberOfSections]
next_section:
lea eax, [ecx - 1]
lea eax, [eax * 4 + eax]
lea eax, [eax * 8]
add eax, IMAGE_BASE
add eax, [SectionsTable]
push dword [file_path] ; filepath
dec esp
mov [esp], byte 0
mov edx, [eax + 12]
add edx, IMAGE_BASE
push edx ; buffer (IMAGE_SECTION_HEADER.VirtualAddress)
push dword [eax + 16] ; count (IMAGE_SECTION_HEADER.SizeOfRawData)
push dword 0
push dword [eax + 20] ; position (IMAGE_SECTION_HEADER.PointerToRawData)
push dword 0
mov ebx, esp
mov eax, 70
int 64
dec ecx
jnz next_section
mov eax, [NumberOfSections]
lea eax, [eax * 4 + eax]
lea eax, [eax * 4 + eax]
add esp, eax ; restore our stack top
; ==========================================================
%if 0 ; comment
push sz_console
call load.library
; mov [console], eax
mov ecx, eax
mov ebx, getprocaddress
push ecx
push sz_con_init
call ebx
mov [con_init], eax
push ecx
push sz_con_write_asciiz
call ebx
mov [con_write_asciiz], eax
push ecx
push sz_con_exit
call ebx
mov [con_exit], eax
push sz_pe_load
push -1
push -1
push -1
push -1
call [con_init]
mov ecx, [NumberOfSections]
next_sect:
lea eax, [ecx - 1]
lea eax, [eax * 4 + eax]
lea eax, [eax * 8]
add eax, IMAGE_BASE
add eax, [SectionsTable]
push eax
push eax
call [con_write_asciiz]
push sz_space_colon_space
call [con_write_asciiz]
pop eax
add eax, 20
mov eax, [eax]
push eax
push msg_buffer
call int2str
push msg_buffer
call [con_write_asciiz]
push sz_new_line
call [con_write_asciiz]
dec ecx
jnz next_sect
%endif ; endcomment
; ==============================================
; program.path = program.path_without_filename & "lib/"
mov edi, [program.path]
xor al, al
xor ecx, ecx
dec ecx
repne scasb
std
mov al, "/"
repne scasb
cld
inc edi
inc edi
mov eax, "lib/"
stosd
;
mov [lib_name], edi
xor ecx, ecx
next_descriptor:
lea eax, [ecx * 4 + ecx]
lea eax, [eax * 4]
add eax, IMAGE_BASE
add eax, [Import]
mov edx, [eax + 12]
add edx, IMAGE_BASE
%if 0 ; comment
pushad
push edx
call [con_write_asciiz]
push sz_new_line
call [con_write_asciiz]
popad
%endif ; endcomment
pushad
; concatenate (program.path_without_filename & "lib/") & lib_name
mov esi, edx
mov edi, [lib_name]
.copy_lib_name:
lodsb
stosb
test al, al
jnz .copy_lib_name
; try to load library
push dword [program.path]
call load.library
test eax, eax
jnz .lib_loaded
; concatenate "Error load library: " & lib_name
sub edi, [lib_name]
mov esi, edi
mov edi, err_load_library
xor al, al
xor ecx, ecx
dec ecx
repne scasb
dec edi
mov ecx, esi
mov esi, edx
rep movsb
;
popad
mov [ERROR_MESSAGE], dword err_load_library
jmp ERROR
.lib_loaded:
mov [lib], eax
popad
xor ebx, ebx
next_function:
mov edx, [eax + 16]
lea esi, [edx + ebx * 4 + IMAGE_BASE]
mov [func], esi
mov edx, [esi]
test edx, edx
jz .done
inc edx
inc edx
add edx, IMAGE_BASE
%if 0 ; comment
pushad
push edx
call [con_write_asciiz]
push sz_new_line
call [con_write_asciiz]
popad
%endif ; endcomment
pushad
mov [func_name], edx
; look for address of imported function
push dword [lib]
push edx
call getprocaddress
test eax, eax
jnz .func_found
popad
; concatenate "Not found function: " & name of function
mov edi, err_func_not_found
xor al, al
xor ecx, ecx
dec ecx
repne scasb
dec edi
mov esi, edx
.copy_func_name:
lodsb
stosb
test al, al
jnz .copy_func_name
;
dec edi
mov eax, " in "
stosd
mov esi, [lib_name]
.copy_lib_name:
lodsb
stosb
test al, al
jnz .copy_lib_name
mov [ERROR_MESSAGE], dword err_func_not_found
jmp ERROR
.func_found:
mov edx, [func]
mov [edx], eax
popad
inc ebx
jmp next_function
.done:
inc ecx
lea eax, [ecx * 4 + ecx]
lea eax, [eax * 4]
add eax, IMAGE_BASE
add eax, [Import]
mov eax, [eax + 12]
cmp eax, dword 0
jnz next_descriptor
; set.current.directory
mov edi, [file_path]
xor al, al
xor ecx, ecx
dec ecx
repne scasb
std
mov al, "/"
repne scasb
cld
mov [edi + 1], byte 0
push dword [file_path]
call set.current.directory
mov [edi + 1], byte "/" ; restore full file_path
; ---------------------- ;
; call load_console_lib ;
; ---------------------- ;
; go to EntryPoint
mov eax, [EntryPoint]
add eax, IMAGE_BASE
jmp eax
; push dword [EntryPoint]
; push msg_buffer
; call int2str
; push msg_buffer
; call [con_write_asciiz]
%if 0 ; comment
push 0
call [con_exit]
%endif ; endcomment
%if 0 ; comment
; dump ---------------------------------------
push dword dump_path;filepath
dec esp
mov [esp], byte 0
push dword 0 ;buffer
mov eax, IMAGE_BASE
add eax, [SizeOfImage]
push eax;count
push dword 0
push dword 0;position
push dword 2
mov ebx, esp
mov eax, 70
int 64
xor eax, eax
dec eax
int 64
dump_path db "/hd3/1/dump.bin",0
%endif ; endcomment
; ==========================================================
ERROR:
push sz_console
call load.library
; mov [console], eax
mov ecx, eax
mov ebx, getprocaddress
push ecx
push sz_con_init
call ebx
mov [con_init], eax
push ecx
push sz_con_write_asciiz
call ebx
mov [con_write_asciiz], eax
push ecx
push sz_con_exit
call ebx
mov [con_exit], eax
push sz_pe_load
push -1
push -1
push -1
push -1
call [con_init]
push dword [ERROR_MESSAGE]
call [con_write_asciiz]
push 0
call [con_exit]
xor eax, eax
dec eax
int 64
; load_console_lib:
; push sz_console
; call load.library
; push eax
; push sz_con_init
; call getprocaddress
; mov [con_init], eax
; push sz_empty
; push -1
; push -1
; push -1
; push -1
; call [con_init]
; ret

View File

@@ -0,0 +1,868 @@
; ------------------------------------------------------------- ;
; KWINE is a fork of program PELoad written by 0CodErr
; author - rgimad
; ------------------------------------------------------------- ;
; standard device (Winbase.h)
%define STD_INPUT_HANDLE -10
%define STD_OUTPUT_HANDLE -11
%define STD_ERROR_HANDLE -12
; starting point for file pointer move (Winbase.h)
%define FILE_BEGIN 0 ; zero or beginning of file
%define FILE_CURRENT 1 ; current value of file pointer
%define FILE_END 2 ; current end-of-file position
; file system operation codes (kernel/trunk/fs/fs_lfn.inc)
%define F70_READ_F 0 ; read file
%define F70_READ_D 1 ; read folder
%define F70_CREATE_F 2 ; create/rewrite file
%define F70_WRITE_F 3 ; write/append to file
%define F70_SETSIZE_F 4 ; set end of file
%define F70_GETATTR_FD 5 ; get file/directory attributes structure
%define F70_SETATTR_FD 6 ; set file/directory attributes structure
%define F70_START_F 7 ; start application
%define F70_DELETE_FD 8 ; delete file
%define F70_CREATE_D 9 ; create directory
; action to take on file that exists or does not exist (Winbase.h)
%define CREATE_NEW 1 ; creates a new file, only if it does not already exist
%define CREATE_ALWAYS 2 ; creates new file, always
%define OPEN_EXISTING 3 ; opens file, only if it exists
%define OPEN_ALWAYS 4 ; opens file, always
%define TRUNCATE_EXISTING 5 ; opens file and truncates it so that its size is zero bytes, only if it exists
%define INVALID_HANDLE_VALUE -1
%define INVALID_FILE_SIZE -1
GLOBAL EXPORTS
section '.exprt' align 16
;**********************************************************************************
EXPORTS: ;/////////////////////////////////////////////////////////////////////////
;**********************************************************************************
dd sz_ExitProcess, ExitProcess
dd sz_GetStdHandle, GetStdHandle
dd sz_SetConsoleMode, SetConsoleMode
dd sz_WriteFile, WriteFile
dd sz_ReadFile, ReadFile
dd sz_GetCommandLineA, GetCommandLineA
dd sz_GlobalAlloc, GlobalAlloc
dd sz_GlobalFree, GlobalFree
dd sz_GlobalReAlloc, GlobalReAlloc
dd sz_Sleep, Sleep
dd sz_FlushConsoleInputBuffer, FlushConsoleInputBuffer
dd sz_CloseHandle, CloseHandle
dd sz_GetFileSize, GetFileSize
dd sz_CreateFileA, CreateFileA
dd sz_SetFilePointer, SetFilePointer
dd sz_VirtualAlloc, VirtualAlloc
dd sz_VirtualFree, VirtualFree
dd sz_SetConsoleCursorPosition, SetConsoleCursorPosition
dd sz_DeleteFileA, DeleteFileA
dd sz_FindClose, FindClose
dd sz_FindFirstFileA, FindFirstFileA
dd sz_GetLocalTime, GetLocalTime
dd sz_GetLastError, GetLastError
dd sz_GetProcessHeap, GetProcessHeap
dd sz_HeapAlloc, HeapAlloc
dd sz_HeapFree, HeapFree
dd sz_HeapReAlloc, HeapReAlloc
dd 0
sz_ExitProcess db "ExitProcess",0
sz_GetStdHandle db "GetStdHandle",0
sz_SetConsoleMode db "SetConsoleMode",0
sz_WriteFile db "WriteFile",0
sz_ReadFile db "ReadFile",0
sz_GetCommandLineA db "GetCommandLineA",0
sz_GlobalAlloc db "GlobalAlloc",0
sz_GlobalFree db "GlobalFree",0
sz_GlobalReAlloc db "GlobalReAlloc",0
sz_Sleep db "Sleep",0
sz_FlushConsoleInputBuffer db "FlushConsoleInputBuffer",0
sz_CloseHandle db "CloseHandle",0
sz_GetFileSize db "GetFileSize",0
sz_CreateFileA db "CreateFileA",0
sz_SetFilePointer db "SetFilePointer",0
sz_VirtualAlloc db "VirtualAlloc",0
sz_VirtualFree db "VirtualFree",0
sz_SetConsoleCursorPosition db "SetConsoleCursorPosition",0
sz_DeleteFileA db "DeleteFileA",0
sz_FindClose db "FindClose",0
sz_FindFirstFileA db "FindFirstFileA",0
sz_GetLocalTime db "GetLocalTime",0
sz_GetLastError db "GetLastError",0
sz_GetProcessHeap db "GetProcessHeap",0
sz_HeapAlloc db "HeapAlloc",0
sz_HeapFree db "HeapFree",0
sz_HeapReAlloc db "HeapReAlloc",0
section '.code' align 16
align 16
;**********************************************************************************
ExitProcess: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
xor eax, eax
dec eax
int 64
; ret not need
align 16
;**********************************************************************************
GetStdHandle: ;////////////////////////////////////////////////////////////////////
;**********************************************************************************
push ebx
push esi
push edi
; if already loaded then do nothing
cmp [console], dword 0
jne .do_nothing
push sz_console
call load.library
mov [console], eax
mov ecx, eax
mov ebx, getprocaddress
push ecx
push sz_con_init
call ebx
mov [con_init], eax
push ecx
push sz_con_write_asciiz
call ebx
mov [con_write_asciiz], eax
push ecx
push sz_con_exit
call ebx
mov [con_exit], eax
push ecx
push sz_con_gets
call ebx
mov [con_gets], eax
push ecx
push sz_con_write_string
call ebx
mov [con_write_string], eax
push ecx
push sz_con_set_flags
call ebx
mov [con_set_flags], eax
push ecx
push sz_con_set_cursor_pos
call ebx
mov [con_set_cursor_pos], eax
push ecx
push sz_con_printf
call ebx
mov [con_printf], eax
mov eax, [28]
cmp [eax], byte 34 ; quote
jne .no_quote
inc eax
.no_quote:
push eax
push -1
push -1
push -1
push -1
call [con_init]
.do_nothing:
mov eax, con_handle ; return pointer to console descriptor
pop edi
pop esi
pop ebx
ret 4
align 16
;**********************************************************************************
WriteFile: ;///////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hFile [ebp + 8] ; handle to the file
%define lpBuffer [ebp + 12] ; pointer to buffer containing data
%define nNumberOfBytesToWrite [ebp + 16] ; number of bytes to be written
%define lpNumberOfBytesWritten [ebp + 20] ; pointer to variable that receives number of bytes written
%define lpOverlapped [ebp + 24] ; pointer to OVERLAPPED structure
push ebp
mov ebp, esp
push ebx
push esi
push edi
;---------
mov eax, hFile
cmp [eax + 8], dword "CON"
je .con
lea edx, [eax + 8]
push edx ;filepath
dec esp
mov [esp], byte 0
push dword lpBuffer ;buffer
push dword nNumberOfBytesToWrite;count
push dword 0
push dword [eax + 4];position ; in InternalFileInfo in libio
push dword F70_WRITE_F
mov ebx, esp
mov eax, 70
int 64
add esp, 25 ; restore stack
mov edx, lpNumberOfBytesWritten
mov [edx], ebx
mov edx, hFile
add [edx + 4], ebx
jmp .exit
.con:
; push dword lpBuffer
; call [con_printf]
; add esp, 4
push dword nNumberOfBytesToWrite
push dword lpBuffer
call [con_write_string]
; push dword lpBuffer
; call [con_write_asciiz]
.exit:
;---------
pop edi
pop esi
pop ebx
pop ebp
ret 20
%undef hFile
%undef lpBuffer
%undef nNumberOfBytesToWrite
%undef lpNumberOfBytesWritten
%undef lpOverlapped
align 16
;**********************************************************************************
ReadFile: ;////////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hFile [ebp + 8] ; handle to the file
%define lpBuffer [ebp + 12] ; pointer to buffer that receives data
%define nNumberOfBytesToRead [ebp + 16] ; maximum number of bytes to read
%define lpNumberOfBytesRead [ebp + 20] ; pointer to variable that receives number of bytes read
%define lpOverlapped [ebp + 24] ; pointer to OVERLAPPED structure
push ebp
mov ebp, esp
push ebx
push esi
push edi
; push dword 0
; call GetStdHandle
;---------
mov eax, hFile
cmp [eax + 8], dword "CON"
je .con
; lea eax, [eax + 8]
; push eax
; call [con_write_asciiz]
lea edx, [eax + 8]
push edx ;filepath
dec esp
mov [esp], byte 0
push dword lpBuffer ;buffer
push dword nNumberOfBytesToRead;count
push dword 0
push dword [eax + 4];position ; in InternalFileInfo in libio
push dword F70_READ_F
mov ebx, esp
mov eax, 70
int 64
add esp, 25 ; restore stack
mov edx, lpNumberOfBytesRead
mov [edx], ebx
mov edx, hFile
add [edx + 4], ebx
jmp .exit
.con:
push dword nNumberOfBytesToRead
push dword lpBuffer
call [con_gets]
.exit:
;---------
pop edi
pop esi
pop ebx
pop ebp
ret 20
%undef hFile
%undef lpBuffer
%undef nNumberOfBytesToRead
%undef lpNumberOfBytesRead
%undef lpOverlapped
align 16
;**********************************************************************************
SetConsoleMode: ;//////////////////////////////////////////////////////////////////
;**********************************************************************************
; ignore input parameters
xor eax, eax
dec eax
ret 8
align 16
;**********************************************************************************
GetCommandLineA: ;/////////////////////////////////////////////////////////////////
;**********************************************************************************
push edi
mov edi, [28]
xor al, al
xor ecx, ecx
dec ecx
repne scasb
mov eax, edi
pop edi
ret
align 16
;**********************************************************************************
GlobalAlloc: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define uFlags [esp + 4 +1*4] ; memory allocation attributes
%define dwBytes [esp + 8 +1*4] ; number of bytes to allocate
push ebx
; uFlags ignored
mov eax, 68
mov ebx, 12
mov ecx, dwBytes
int 64
pop ebx
ret 8
%undef uFlags
%undef dwBytes
align 16
;**********************************************************************************
GlobalFree: ;//////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hMem [esp + 4 +1*4] ; handle to global memory object
push ebx
mov eax, 68
mov ebx, 13
mov ecx, hMem
int 64
pop ebx
ret 4
%undef hMem
align 16
;**********************************************************************************
GlobalReAlloc: ;///////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hMem [esp + 4 +1*4] ; handle to global memory object
%define dwBytes [esp + 8 +1*4] ; new size of memory block in bytes
%define uFlags [esp + 12 +1*4] ; reallocation options
push ebx
; uFlags ignored
mov eax, 68
mov ebx, 20
mov ecx, dwBytes
mov edx, hMem
int 64
pop ebx
ret 12
%undef hMem
%undef dwBytes
%undef uFlags
align 16
;**********************************************************************************
Sleep: ;///////////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define dwMilliseconds [esp + 4 +1*4] ; time interval
push ebx
mov eax, dwMilliseconds
mov ebx, 10
cmp eax, ebx
jae .ae
add eax, 10 ; avoid zero result if dwMilliseconds < 10
.ae:
xor edx, edx
div ebx
mov ebx, eax
mov eax, 5
int 64
pop ebx
ret 4
%undef dwMilliseconds
align 16
;**********************************************************************************
FlushConsoleInputBuffer: ;/////////////////////////////////////////////////////////
;**********************************************************************************
; not implemented correctly
xor eax, eax
dec eax
ret 4
align 16
;**********************************************************************************
CloseHandle: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hObject [esp + 4 +1*4]
push ebx
mov eax, 68
mov ebx, 13
mov ecx, hObject
int 64
pop ebx
ret 4
%undef hObject
align 16
;**********************************************************************************
GetFileSize: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hFile [esp + 4 +3*4]
%define lpFileSizeHigh [esp + 8 +3*4]
push ebx
push esi
push edi
; lpFileSizeHigh ignored
mov [esp - (25 + 40) + 0], dword F70_GETATTR_FD
mov [esp - (25 + 40) + 8], dword 0
mov [esp - (25 + 40) + 20], byte 0
lea eax, [esp - 40]
mov [esp - (25 + 40) + 16], eax
lea ebx, [esp - (25 + 40)]
mov eax, hFile
lea eax, [eax + 8] ; as in InternalFileInfo in libio
mov [esp - (25 + 40) + 21], eax
mov eax, 70
int 64
test eax, eax
jz .no_error
mov eax, INVALID_FILE_SIZE
jmp .exit
.no_error:
mov eax, [esp - (25 + 40) + 25 + 32] ; file.size
.exit:
pop edi
pop esi
pop ebx
ret 8
%undef hFile
%undef lpFileSizeHigh
align 16
;**********************************************************************************
CreateFileA: ;//////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpFileName [esp + 4 +3*4]
%define dwDesiredAccess [esp + 8 +3*4]
%define dwShareMode [esp + 12 +3*4]
%define lpSecurityAttributes [esp + 16 +3*4]
%define dwCreationDisposition [esp + 20 +3*4]
%define dwFlagsAndAttributes [esp + 24 +3*4]
%define hTemplateFile [esp + 28 +3*4]
push ebx
push esi
push edi
;---------
; push dword 0
; call GetStdHandle
; push dword lpFileName
; call [con_write_asciiz]
mov eax, 68
mov ebx, 12
mov ecx, 4096
int 64
mov edx, eax
lea edi, [eax + 8] ; as in InternalFileInfo in libio
mov esi, lpFileName
.copy_name:
lodsb
stosb
test al, al
jnz .copy_name
mov eax, dwCreationDisposition
cmp eax, CREATE_ALWAYS
je .create_always
cmp eax, OPEN_EXISTING
je .open_existing
mov eax, INVALID_HANDLE_VALUE
jmp .exit
.open_existing:
lea eax, [edx + 8]
push eax ;filepath
dec esp
mov [esp], byte 0
push dword 0 ; buffer
push dword 0 ; count
push dword 0
push dword 0
push dword F70_READ_F
mov ebx, esp
mov eax, 70
int 64
add esp, 25 ; restore stack
test eax, eax
jz .no_error
mov eax, INVALID_HANDLE_VALUE
jmp .exit
.no_error:
mov eax, edx ; return pointer to file descriptor
jmp .exit
.create_always:
lea eax, [edx + 8]
push eax ;filepath
dec esp
mov [esp], byte 0
push dword 0 ; buffer
push dword 0 ; count
push dword 0
push dword 0
push dword F70_CREATE_F
mov ebx, esp
mov eax, 70
int 64
add esp, 25 ; restore stack
mov eax, edx ; return pointer to file descriptor
jmp .exit
.exit:
;---------
pop edi
pop esi
pop ebx
ret 28
%undef lpFileName
%undef dwDesiredAccess
%undef dwShareMode
%undef lpSecurityAttributes
%undef dwCreationDisposition
%undef dwFlagsAndAttributes
%undef hTemplateFile
align 16
;**********************************************************************************
SetFilePointer: ;//////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hFile [esp + 4 +3*4]
%define lDistanceToMove [esp + 8 +3*4]
%define lpDistanceToMoveHigh [esp + 12 +3*4]
%define dwMoveMethod [esp + 16 +3*4]
push ebx
push esi
push edi
;---------
mov eax, hFile
cmp dwMoveMethod, dword FILE_BEGIN
je .FILE_BEGIN
cmp dwMoveMethod, dword FILE_CURRENT
je .FILE_CURRENT
jmp .FILE_END
.FILE_BEGIN:
mov edx, lDistanceToMove
mov [eax + 4], edx
jmp .exit
.FILE_CURRENT:
mov edx, lDistanceToMove
add [eax + 4], edx
jmp .exit
.FILE_END:
push dword 0
push eax
call GetFileSize
mov edx, eax
mov eax, hFile
mov [eax + 4], edx
mov edx, lDistanceToMove
add [eax + 4], edx
.exit:
mov eax, [eax + 4]
;---------
pop edi
pop esi
pop ebx
ret 16
%undef hFile
%undef lDistanceToMove
%undef lpDistanceToMoveHigh
%undef dwMoveMethod
align 16
;**********************************************************************************
VirtualAlloc: ;////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpAddress [esp + 4 +1*4]
%define dwSize [esp + 8 +1*4]
%define flAllocationType [esp + 12 +1*4]
%define flProtect [esp + 16 +1*4]
push ebx
mov eax, 68
mov ebx, 12
mov ecx, dwSize
int 64
pop ebx
ret 16
%undef lpAddress
%undef dwSize
%undef flAllocationType
%undef flProtect
align 16
;**********************************************************************************
VirtualFree: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpAddress [esp + 4 +1*4]
%define dwSize [esp + 8 +1*4]
%define dwFreeType [esp + 12 +1*4]
push ebx
mov eax, 68
mov ebx, 13
mov ecx, lpAddress
int 64
pop ebx
ret 12
%undef lpAddress
%undef dwSize
%undef dwFreeType
align 16
;**********************************************************************************
SetConsoleCursorPosition: ;////////////////////////////////////////////////////////
;**********************************************************************************
%define hConsoleOutput [esp + 4 +3*4]
%define dwCursorPosition [esp + 8 +3*4]
push ebx
push esi
push edi
mov edx, dwCursorPosition
shld eax, edx, 16
shr edx, 16
push eax
push edx
call [con_set_cursor_pos]
pop edi
pop esi
pop ebx
ret 8
%undef hConsoleOutput
%undef dwCursorPosition
align 16
;**********************************************************************************
DeleteFileA: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpFileName [esp + 4 +1*4] ; name of file
push ebx
mov [esp - (25 + 40) + 0], dword F70_DELETE_FD
mov [esp - (25 + 40) + 8], dword 0
mov [esp - (25 + 40) + 20], byte 0
lea eax, [esp - 40]
mov [esp - (25 + 40) + 16], eax
lea ebx, [esp - (25 + 40)]
mov eax, lpFileName
mov [esp - (25 + 40) + 21], eax
mov eax, 70
int 64
pop ebx
ret 4
%undef lpFileName
align 16
;**********************************************************************************
FindClose: ;///////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hFindFile [esp + 4 +1*4] ; file search handle
ret 4
%undef hFindFile
align 16
;**********************************************************************************
FindFirstFileA: ;//////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpFileName [esp + 4 +3*4] ; name of file
%define lpFindFileData [esp + 8 +3*4] ; pointer to WIN32_FIND_DATA structure
push ebx
push esi
push edi
pop edi
pop esi
pop ebx
ret 8
%undef lpFileName
%undef lpFindFileData
align 16
;**********************************************************************************
GetLocalTime: ;///////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define lpSystemTime [esp + 4] ; pointer to SYSTEMTIME structure
; yet not implemented
; mov eax, lpSystemTime
; mov [eax + 0], dword 12345678H
; mov [eax + 4], dword 12345678H
; mov [eax + 8], dword 12345678H
; mov [eax + 12], dword 12345678H
; MSDN: This function does not return a value.
ret 4
%undef lpSystemTime
align 16
;**********************************************************************************
GetLastError: ;////////////////////////////////////////////////////////////////////
;**********************************************************************************
xor eax, eax
ret
align 16
;**********************************************************************************
GetProcessHeap: ;////////////////////////////////////////////////////////////////////
;**********************************************************************************
xor eax, eax
dec eax
ret
align 16
;**********************************************************************************
HeapAlloc: ;///////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hHeap [esp + 4 +1*4]
%define dwFlags [esp + 8 +1*4]
%define dwBytes [esp + 12 +1*4]
push ebx
mov eax, 68
mov ebx, 12
mov ecx, dwBytes
int 64
pop ebx
ret 12
%undef hHeap
%undef dwFlags
%undef dwBytes
align 16
;**********************************************************************************
HeapFree: ;////////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hHeap [esp + 4 +1*4]
%define dwFlags [esp + 8 +1*4]
%define lpMem [esp + 12 +1*4]
push ebx
mov eax, 68
mov ebx, 13
mov ecx, lpMem
int 64
pop ebx
ret 12
%undef hHeap
%undef dwFlags
%undef lpMem
align 16
;**********************************************************************************
HeapReAlloc: ;/////////////////////////////////////////////////////////////////////
;**********************************************************************************
%define hHeap [esp + 4 +1*4]
%define dwFlags [esp + 8 +1*4]
%define lpMem [esp + 12 +1*4]
%define dwBytes [esp + 16 +1*4]
push ebx
mov eax, 68
mov ebx, 20
mov ecx, dwBytes
mov edx, lpMem
int 64
pop ebx
ret 16
%undef hHeap
%undef dwFlags
%undef lpMem
%undef dwBytes
; ------------------------------------------------------------- ;
load.library:
mov eax, 68
mov ebx, 19
mov ecx, [esp + 4]
int 64
ret 4
; ------------------------------------------------------------- ;
getprocaddress:
mov edx, [esp + 8]
xor eax, eax
test edx, edx
jz .end
.next:
xor eax, eax
cmp [edx], dword 0
jz .end
mov esi, [edx]
mov edi, [esp + 4]
.next_:
lodsb
scasb
jne .fail
or al, al
jnz .next_
jmp .ok
.fail:
add edx, 8
jmp .next
.ok:
mov eax, [edx + 4]
.end:
ret 8
; ------------------------------------------------------------- ;
section '.data' align 16
con_init dd 0
con_write_asciiz dd 0
con_exit dd 0
con_gets dd 0
con_write_string dd 0
con_set_flags dd 0
con_set_cursor_pos dd 0
con_printf dd 0
console dd 0
sz_con_init db "con_init",0
sz_con_write_asciiz db "con_write_asciiz",0
sz_con_exit db "con_exit",0
sz_con_gets db "con_gets",0
sz_con_write_string db "con_write_string",0
sz_console db "/sys/lib/console.obj",0
sz_con_set_flags db "con_set_flags",0
sz_con_set_cursor_pos db "con_set_cursor_pos",0
sz_con_printf db "con_printf",0
con_handle:
dd 0
dd 0
dd "CON"

View File

@@ -0,0 +1,243 @@
; ------------------------------------------------------------- ;
; KWINE is a fork of program PELoad written by 0CodErr
; author - rgimad
; ------------------------------------------------------------- ;
GLOBAL EXPORTS
section '.exprt' align 16
;**********************************************************************************
EXPORTS: ;/////////////////////////////////////////////////////////////////////////
;**********************************************************************************
dd sz__getch, _getch
dd sz__kbhit, _kbhit
dd sz_printf, printf
dd sz_puts, puts
dd sz_gets, gets
dd sz_strlen, strlen
dd 0
sz__getch db "_getch",0
sz__kbhit db "_kbhit",0
sz_printf db "printf",0
sz_puts db "puts",0
sz_gets db "gets",0
sz_strlen db "strlen",0
section '.code' align 16
align 16
;**********************************************************************************
_getch: ;//////////////////////////////////////////////////////////////////////////
;**********************************************************************************
push ebx
push esi
push edi
call load_console_lib
pop ecx
call [con_getch]
push ecx
pop edi
pop esi
pop ebx
ret
align 16
;**********************************************************************************
_kbhit: ;//////////////////////////////////////////////////////////////////////////
;**********************************************************************************
push ebx
push esi
push edi
call load_console_lib
pop ecx
call [con_kbhit]
push ecx
pop edi
pop esi
pop ebx
ret
align 16
;**********************************************************************************
printf: ;//////////////////////////////////////////////////////////////////////////
;**********************************************************************************
;pushad
;push ebx
;push esi
;push edi
call load_console_lib
;popad
pop ecx
call [con_printf]
push ecx
;pop edi
;pop esi
;pop ebx
ret
align 16
;**********************************************************************************
puts: ;////////////////////////////////////////////////////////////////////////// cdecl
;**********************************************************************************
;push ebx
;push esi
;push edi
call load_console_lib
pop ecx ; pop return address
call [con_write_asciiz]
push ecx ; push return address again
;pop edi
;pop esi
;pop ebx
ret
align 16
;**********************************************************************************
gets: ;////////////////////////////////////////////////////////////////////////// cdecl
;**********************************************************************************
;push ebx
;push esi
;push edi
call load_console_lib
pop ecx
pop edx
push 25 ;; second arg of con_gets assume by default
push edx
call [con_gets]
push ecx
;pop edi
;pop esi
;pop ebx
ret
align 16
;**********************************************************************************
strlen: ;//////////////////////////////////////////////////////////////////////////
;**********************************************************************************
push ebx
push esi
push edi
call load_console_lib
xor eax,eax
mov edi, dword [esp + 4 + 4 + 4 + 4]
.while1:
inc eax
cmp byte [eax + edi], 0
jnz .while1
pop edi
pop esi
pop ebx
ret
load_console_lib: ;; stdcall ?
; if already loaded then do nothing
cmp [console], dword 0
jne .do_nothing
push sz_console
call load.library
mov [console], eax
mov ecx, eax
mov ebx, getprocaddress
;;
push ecx
push sz_con_init
call ebx
mov [con_init], eax
;;
push ecx
push sz_con_getch
call ebx
mov [con_getch], eax
;;
push ecx
push sz_con_kbhit
call ebx
mov [con_kbhit], eax
;;
push ecx
push sz_con_printf
call ebx
mov [con_printf], eax
;;
push ecx
push sz_con_write_asciiz
call ebx
mov [con_write_asciiz], eax
;;
push ecx
push sz_con_gets
call ebx
mov [con_gets], eax
push ecx
push sz_con_init
call ebx
mov [con_init], eax
push con_caption
push -1
push -1
push -1
push -1
call [con_init]
.do_nothing:
ret
; ------------------------------------------------------------- ; stdcall
load.library:
mov eax, 68
mov ebx, 19
mov ecx, [esp + 4]
int 64
ret 4
; ------------------------------------------------------------- ;
getprocaddress:
mov edx, [esp + 8]
xor eax, eax
test edx, edx
jz .end
.next:
xor eax, eax
cmp [edx], dword 0
jz .end
mov esi, [edx]
mov edi, [esp + 4]
.next_:
lodsb
scasb
jne .fail
or al, al
jnz .next_
jmp .ok
.fail:
add edx, 8
jmp .next
.ok:
mov eax, [edx + 4]
.end:
ret 8
; ------------------------------------------------------------- ;
section '.data' align 16
con_caption db "test!",0
con_init dd 0
con_getch dd 0
con_kbhit dd 0
con_printf dd 0
con_write_asciiz dd 0
con_gets dd 0
console dd 0
sz_con_init db "con_init",0
sz_con_getch db "con_getch",0
sz_con_kbhit db "con_kbhit",0
sz_con_printf db "con_printf",0
sz_con_write_asciiz db "con_write_asciiz",0
sz_con_gets db "con_gets",0
sz_console db "/sys/lib/console.obj",0

View File

@@ -0,0 +1,22 @@
@echo off
set NASM="nasm\nasm.exe"
%NASM% -f coff "lib\msvcrt.dll.asm" -o "..\lib\msvcrt.dll"
strip --strip-debug "../lib/msvcrt.dll"
%NASM% -f coff "lib/kernel32.dll.asm" -o "../lib/kernel32.dll"
strip --strip-debug "../lib/kernel32.dll"
%NASM% -f bin "kwine.asm" -o "../kwine"
if %errorlevel% == 0 (
echo compiled succesfully.
ubuntu1804 run "mcopy -D o -i ../kolibri.img ../lib/msvcrt.dll ::kwine/lib/msvcrt.dll"
ubuntu1804 run "mcopy -D o -i ../kolibri.img ../lib/kernel32.dll ::kwine/lib/kernel32.dll"
ubuntu1804 run "mcopy -D o -i ../kolibri.img ../kwine ::kwine/kwine"
qemu-system-x86_64 -fda ../kolibri.img -m 256
) else (
echo compilation failed.
)
pause

View File

@@ -0,0 +1,5 @@
@echo off
fasm lib\kernel32.dll.asm ..\lib\kernel32.dll
fasm lib\msvcrt.dll.asm ..\lib\msvcrt.dll
fasm kwine.asm ..\kwine
pause

View File

@@ -0,0 +1,8 @@
kwine - kolibri wine.
Developers:
- 0CodErr founder of project (PEload)
- rgimad some improvements
Topic:
http://board.kolibrios.org/viewtopic.php?f=9&t=2318&p=74314#p74308