diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 0ea848b7e8..599570bb9a 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -25,6 +25,7 @@ img_files = { {"LANG.INC", build_type .. "/lang.inc"}, {"NOTIFY3.PNG", "common/notify3.png"}, {"TOOLBAR.PNG", PROGS .. "/cmm/txtread/toolbar.png"}, + {"UNIMG", PROGS .. "/fs/unimg/unimg"}, {"VMODE", "common/vmode"}, {"3D/HOUSE.3DS", "common/3d/house.3ds"}, {"DEVELOP/T_EDIT.INI", PROGS .. "/other/t_edit/t_edit.ini"}, @@ -177,15 +178,14 @@ extra_files = { {"kolibrios/develop/TinyBasic/", "common/develop/TinyBasic/*"}, {"kolibrios/utils/cnc_editor/cnc_editor", PROGS .. "/other/cnc_editor/cnc_editor"}, {"kolibrios/utils/cnc_editor/kolibri.NC", PROGS .. "/other/cnc_editor/kolibri.NC"}, + {"kolibrios/emul/", "common/emul/*"}, {"kolibrios/emul/dosbox/", "common/emul/DosBox/*"}, {"kolibrios/emul/e80/readme.txt", PROGS .. "/emulator/e80/trunk/readme.txt"}, {"kolibrios/emul/e80/keyboard.png", PROGS .. "/emulator/e80/trunk/keyboard.png"}, {"kolibrios/emul/fceu/fceu", PROGS .. "/emulator/fceu/fceu"}, {"kolibrios/emul/fceu/FCEU ReadMe.txt", PROGS .. "/emulator/fceu/FCEU ReadMe.txt"}, - {"kolibrios/emul/", "common/emul/gameboy"}, - {"kolibrios/emul/", "common/emul/pokemini"}, - {"kolibrios/emul/", "common/emul/scummvm"}, - {"kolibrios/emul/", "common/emul/zsnes"}, + {"kolibrios/emul/kwine/kwine", PROGS .. "/emulator/kwine/bin/kwine"}, + {"kolibrios/emul/kwine/lib/", PROGS .. "/emulator/kwine/bin/kwine/lib/*"}, {"kolibrios/demos/ak47.lif", "common/demos/ak47.lif"}, {"kolibrios/demos/life2", "common/demos/life2"}, {"kolibrios/demos/life3tb.png", PROGS .. "/games/life3/trunk/life3tb.png"}, diff --git a/data/rus/settings/menu.dat b/data/rus/settings/menu.dat index 9a4345ddaf..702f2c1423 100644 --- a/data/rus/settings/menu.dat +++ b/data/rus/settings/menu.dat @@ -2,13 +2,13 @@ Игровой центр /sys/allgames Демки > /@1 Графика > /@3 -Мультимедиа > /@4 -Эмуляторы > /@18 +Звук и видео > /@4 Разработка > /@5 +Эмуляторы > /@6 Система > /@7 -Обработка данных > /@13 -Сеть > /@14 -Разное > /@17 +Офис > /@10 +Сеть > /@11 +Разное > /@14 Документация /sys/docpack Запуск программы /sys/run Завершение работы /sys/end @@ -42,84 +42,62 @@ FlatWave /sys/3d/flatwav Редактор Animage /sys/media/animage Наложение фильтров /sys/media/imgf/imgf Палитра /sys/media/palitra -#4 **** Мультимедиа **** +Пипетка /sys/pipetka +#4 **** Звук и видео **** Аудиоплеер Pixie /sys/media/pixie Аудиоплеер AC97SND /sys/media/ac97snd Видеоплеер Fplay /kolibrios/media/fplay Midi-плеер /sys/media/midamp #5 **** Разработка **** -Примеры > /@6 Упаковщик KPack /sys/kpack Flat Assembler /sys/develop/fasm Доска отладки /sys/develop/board +HEX-редактор /sys/develop/heed Diff tool /sys/develop/diff Отладчик /sys/develop/mtdbg -Пипетка /sys/pipetka Hex2Dec2Bin /sys/develop/h2d2b Таблица символов /sys/ASCIIVju ASCII-коды /sys/develop/keyascii SCAN-коды /sys/develop/scancode -#6 **** Разработка -> Примеры **** -Потоки /sys/develop/thread -Color Slider /sys/demos/cslide -Консольный пример 1 /sys/develop/testcon2 -Консольный пример 2 /sys/develop/test_gets -Окна сообщений /sys/demos/use_mb +#6 **** Эмуляторы **** +DOSBox DOS Emulator /kolibrios/emul/DosBox/dosbox +e80 (ZX Spectrum) /kolibrios/emul/e80/e80 +FCE Ultra - NES /kolibrios/emul/fceu/fceu +PokeMini /kolibrios/emul/pokemini +ScummVM /kolibrios/emul/scummvm +ZSNES Super Nintendo /kolibrios/emul/zsnes #7 **** Система **** -Настройки > /@8 -Системные сенсоры > /@9 -Работа с файлами > /@10 -Тестирование > /@11 -Спец. возможности > /@12 +Системная панель /sys/syspanel +Файловые менеджеры > /@8 +Спец. возможности > /@9 Календарь /sys/calendar -Доска отладки /sys/develop/board -Буфер обмена /sys/develop/clipview Терминал /sys/terminal -#8 **** Система -> Настройки **** -Устройства /sys/setup -Установить фон /sys/media/palitra -Стиль окон /sys/skincfg -Горячие клавиши /sys/mykey -Видеорежим для ATI /sys/vmode -#9 **** Система -> Сенсоры **** -Диспетчер процессов /sys/cpu -PCI-устройства /sys/pcidev -CPUID /sys/cpuid -GHOST Monitor /sys/gmon -K. Bus disconnected /sys/kbd -HDD информер /sys/hdd_info -#10 **** Система -> Работа с файлами **** +Виртуальные диски /sys/tmpdisk +Консоль SHELL /sys/shell +Сохранение образа /sys/rdsave +#8 **** Система -> Файловые менеджеры **** KFAR /sys/File Managers/kfar fNav /sys/File Managers/fNav/fNav KFM /sys/File Managers/kfm Eolite /sys/File Managers/Eolite -Виртуальные диски /sys/tmpdisk -Консоль SHELL /sys/shell -Сохранение образа /sys/rdsave -#11 **** Система -> Тестирование **** -Тест защиты /sys/test -Тест монитора /sys/disptest -Графический бенчмарк /sys/mgb -FSPEED скорость ФС /sys/fspeed -#12 **** Система -> Спец.возможности **** +#9 **** Система -> Спец.возможности **** Экранная лупа /sys/magnify Экранная клавиатура /sys/zkey -#13 **** Обработка данных **** +#10 **** Офис **** Калькулятор /sys/calc Редактор Tinypad /sys/tinypad Редактор TextEdit /sys/develop/t_edit Табличный процессор /sys/table Построение графиков /sys/graph -HEX-редактор /sys/develop/heed -Разархиватор Unz /sys/unz -#14 **** Сеть **** -Серверы > /@15 -Клиенты > /@16 +Просмотр RTF /sys/rtfread +#11 **** Сеть **** +Серверы > /@12 +Клиенты > /@13 Настройки сети /sys/network/netcfg Статус подключения /sys/network/netstat -#15 **** Сеть -> Серверы **** +#12 **** Сеть -> Серверы **** FTP daemon /sys/network/ftpd -#16 **** Сеть -> Клиенты **** +#13 **** Сеть -> Клиенты **** IRC клиент /sys/network/ircc FTP клиент /sys/network/ftpc TFTP клиент /sys/network/tftpc @@ -130,19 +108,12 @@ DNS lookup /sys/network/nslookup VNC Клиент /sys/network/vncc Интернет загрузчик /sys/network/downloader Текстовый браузер /sys/network/webview -#17 **** Разное **** +#14 **** Разное **** Создание скриншотов /sys/scrshoot Аналоговые часы /sys/demos/aclock -Просмотр RTF /sys/rtfread Таблица Менделеева /sys/period Тренажёр KJ|ABuIIIA /sys/games/klavisha Бинарные часы /sys/demos/bcdclk Таймер /sys/demos/timer -#18 **** Эмуляторы **** -DOSBox DOS Emulator /kolibrios/emul/DosBox/dosbox -e80 (ZX Spectrum) /kolibrios/emul/e80/e80 -FCE Ultra - NES /kolibrios/emul/fceu/fceu -Gameboy Color /kolibrios/emul/gameboy -ScummVM (adventure) /kolibrios/emul/scummvm -ZSNES Super Nintendo /kolibrios/emul/zsnes +Разархиватор Unz /sys/unz ## diff --git a/programs/emulator/kwine/bin/kwine b/programs/emulator/kwine/bin/kwine new file mode 100644 index 0000000000..00afa7c990 Binary files /dev/null and b/programs/emulator/kwine/bin/kwine differ diff --git a/programs/emulator/kwine/bin/lib/kernel32.dll b/programs/emulator/kwine/bin/lib/kernel32.dll new file mode 100644 index 0000000000..ccf2ebffab Binary files /dev/null and b/programs/emulator/kwine/bin/lib/kernel32.dll differ diff --git a/programs/emulator/kwine/bin/lib/msvcrt.dll b/programs/emulator/kwine/bin/lib/msvcrt.dll new file mode 100644 index 0000000000..fdda07a5fd Binary files /dev/null and b/programs/emulator/kwine/bin/lib/msvcrt.dll differ diff --git a/programs/emulator/kwine/bin/samples.zip b/programs/emulator/kwine/bin/samples.zip new file mode 100644 index 0000000000..06b6840964 Binary files /dev/null and b/programs/emulator/kwine/bin/samples.zip differ diff --git a/programs/emulator/kwine/kwine.asm b/programs/emulator/kwine/kwine.asm new file mode 100644 index 0000000000..f65d6b4937 --- /dev/null +++ b/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 diff --git a/programs/emulator/kwine/lib/kernel32.dll.asm b/programs/emulator/kwine/lib/kernel32.dll.asm new file mode 100644 index 0000000000..a0b9ac1768 --- /dev/null +++ b/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" + + diff --git a/programs/emulator/kwine/lib/msvcrt.dll.asm b/programs/emulator/kwine/lib/msvcrt.dll.asm new file mode 100644 index 0000000000..0499bd1e65 --- /dev/null +++ b/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 \ No newline at end of file diff --git a/programs/emulator/kwine/make.bat b/programs/emulator/kwine/make.bat new file mode 100644 index 0000000000..b38ab0eba0 --- /dev/null +++ b/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 \ No newline at end of file diff --git a/programs/emulator/kwine/make_old.txt b/programs/emulator/kwine/make_old.txt new file mode 100644 index 0000000000..3b31901f13 --- /dev/null +++ b/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 \ No newline at end of file diff --git a/programs/emulator/kwine/readme.txt b/programs/emulator/kwine/readme.txt new file mode 100644 index 0000000000..c9cb9f5015 --- /dev/null +++ b/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 \ No newline at end of file diff --git a/programs/fs/unimg/unimg b/programs/fs/unimg/unimg new file mode 100644 index 0000000000..2380f4069d Binary files /dev/null and b/programs/fs/unimg/unimg differ