Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 7670 → Rev 7864

/programs/emulator/kwine/bin/kwine
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/kwine/bin/lib/kernel32.dll
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/kwine/bin/lib/msvcrt.dll
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/kwine/bin/samples.zip
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/kwine/kwine.asm
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
/programs/emulator/kwine/lib/kernel32.dll.asm
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"
 
 
/programs/emulator/kwine/lib/msvcrt.dll.asm
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
/programs/emulator/kwine/make.bat
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
/programs/emulator/kwine/make_old.txt
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
/programs/emulator/kwine/readme.txt
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