From 81120905e2e33d772e861c935a9669a32cc187d3 Mon Sep 17 00:00:00 2001 From: "Rustem Gimadutdinov (rgimad)" Date: Tue, 5 May 2020 22:40:04 +0000 Subject: [PATCH] kwine v0.0.2 git-svn-id: svn://kolibrios.org@7873 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/emulator/kwine/bin/lib/msvcrt.dll | Bin 2288 -> 8813 bytes programs/emulator/kwine/bin/samples.zip | Bin 10881 -> 15928 bytes programs/emulator/kwine/kwine.asm | 2 +- programs/emulator/kwine/lib/conio.c | 159 +++++++++++++++++ programs/emulator/kwine/lib/msvcrt.dll.asm | 2 +- programs/emulator/kwine/lib/msvcrt.dll.c | 67 +++++++ programs/emulator/kwine/lib/msvcrt.dll.h | 36 ++++ programs/emulator/kwine/lib/stddef.h | 27 +++ programs/emulator/kwine/lib/stdio.c | 124 +++++++++++++ programs/emulator/kwine/lib/stdlib.c | 32 ++++ programs/emulator/kwine/lib/string.c | 194 +++++++++++++++++++++ programs/emulator/kwine/make.bat | 10 +- programs/emulator/kwine/readme.txt | 17 +- 13 files changed, 661 insertions(+), 9 deletions(-) create mode 100644 programs/emulator/kwine/lib/conio.c create mode 100644 programs/emulator/kwine/lib/msvcrt.dll.c create mode 100644 programs/emulator/kwine/lib/msvcrt.dll.h create mode 100644 programs/emulator/kwine/lib/stddef.h create mode 100644 programs/emulator/kwine/lib/stdio.c create mode 100644 programs/emulator/kwine/lib/stdlib.c create mode 100644 programs/emulator/kwine/lib/string.c diff --git a/programs/emulator/kwine/bin/lib/msvcrt.dll b/programs/emulator/kwine/bin/lib/msvcrt.dll index fdda07a5fd806cb16fc5e9afdf0d61af11a85651..45f1a6945565d47d60a284ea0b65dcb68934ecbf 100644 GIT binary patch literal 8813 zcmai34{%h)9p1Yf;nag%C1`9jdO*ZrAwbJ(4&~b+-O_fCK4hK{9a=+PNy15PM)Zp!=Hvnf%ozK8z1~PiUiLp8ZBr8%@@_ z9Y>Rzr_&kNMjarQXx_-jhe&_znBDw3(|j~p?Q!(w^$1(GcPGrYAgQ_Ydb}tD_GL$- zlMjvI$rjt`&65wI4^Stw8r#$3{EbkplG;c@8_l|;UF|5mIQrpuXR7_vZd9E&y~_A47{~@@-Eo-4H4hq(dcsi*b+y(w_D`kc z_4KPo@x*9Q|oAPuAE&5U;d{n*0Sd`FQ@l#uU_RXH4&EOE;9ye>l&YT=ei{xmIKs!)>Bp zA8<6MTJ{|EQQpfbM}It1iXOdq={SH28lB`lREcHg@HAR$s@;h*Z&c9KLayUpqiO}z zwsyV90i$>&fy;ZQ450$_;Iy zO)Dp@!qCcWnvb+1Lo2swF4Bq(t-_{dzJfN_&?;@(Dbi>{$$GA|Y0s0k($K1G+HTUS z46VkdZ6ys~D#i|7wjWr;M;ykK+`6A;1_^#e7-v{F7E9V`ZWLOU-`KDp$CHV9LZy&7xy z;Wtj5IyL-0)|yO?+yvZ*NgHlIkGDEEzT^BATmDYYw4v;GlhuP=%dnJVGafRmX!YDV zD*tTKlvzt$n7Ywa@RM4imzQa#o`IGOZ{ldj*=- zn{iFpS$SLD*EDnP7ZmdfsE*l)<&D3e6Zp0odJLiCS7} zY2!anHTwyQIrk`;Syb?=z-ODrkzwkIwd2S&L@pmkK0?{&jU(?T%L02%sSY2E5}&>1 zV&yd`<65^fmA7jIj*PzP!dtDOONPvMJCinad^PABA}u%*Z-}N1jzpKUc}Z?O)gF8g zPO!7OGcRG+eC=3wH+8(AGB5SafN&GSd<0q`?nJl;feuS82-^{Ugs>ao*9gxbynt{7 zp&#KRgi!=K?_G;M*IoVFC%teA;dAnZz7yT@FJW> z=z*hm5YLDGyNFjKK8tvZr9mrNTcWK^Azz@aP0WvOi_UKfZ=4@gWJ&AB2gK?%%kEku zHish7aBGWz;t#ikV-jqMgkvFpAQ}vZAG8qBSR~xiAc;1hSiOXyt$MD8P|RQ76ljP_ zI%-R8+Sq7X1skOW?1PO945)H}i!$Y}Z*7VB8$;oSMpZ8=A=n;?wnnThm2@#1Y+{dw z+SY1TP0wJZV&Pa*NCX2dH^qESt${ipdhAM3x>bn#t`Z`GkRBHv8;@s3CDJ~<69n=s}pmj5F7>CjcJaHWmDa|oXe+7 z+Vm_#;QB3qyhQfjzBvSy*KRNc{l5OLFc0`ORf4trvD@0 zS3_TD)!R({AK)K@US-vtE7|`j_%qOpt$LlAzYyA&2((*q{lcbRPI;Y|?w|G0*Fs-` znDgf>b&!WbP}{*ji34iT>fh;?1^B@2h5i-v-&^&{c#iY8$CepBQm}az#=6tX4QWvWm*1C=)Z(6=b|ysYE1nA^ymJMejNHS=-;;bZ!q(ph5i}z>#h1d zrtU%?d$5+yw(1*Ay$JdO=qao2JR%LKe=4E>3;LzzVIB0@S7L3p<$r_o?}R=Ky%1w% z_HO~tlLOGFVeR%=^RHL+Bknl#TcKZSjLC*BLe^f!#)EnE5NvLQJ=X(sWxZvtl)`2o zY-q1#n>$rqUc?-^1$3@B15_;0=Zvn(HMpA?tzhJ5^bn&b82ypan~buICS&fY(q=JQ z%IIE3TNwS6(Q}MmXY>xEb3n6YI~a^^7(!s$1Mbt&C`&QT{p@?PNr|y;2`%)Xiu&qdkmhUs5^tG4koH%oi1mHZba7w2x7W(EuZ% z`^y(TMiq=UFzR5mkI`{P^sP(v%NK5}{0h-Nt* zj5--T&8UyjAS18K@VAgrNqrdKndAsKus*27e1=;IMzjdWtLFtDMsgoS~hRW_ytuH!a_zD4OIV#(DQ z5yLhn5^RhVp*M9Ke>m0}z&D)9L_&1p2>l#Aq}wPH@gI{3#9G6s@9)rK%7$8wzpupg z*lSFt5X^ELGZ)M+Y|LUXr?JMHx$XwD(QPn({S%x{VtRe_uW>q)=?uQegN=d6D>jDy zh@*3wZX-X~)rrl_)s90_3D$g*0U4s5AP}fKG&pL3KqF!d_;q|4w2MMULYcXtT(WAL~Dp7)00%;8%Vxn>LnzB{7Jw zsbS3k)_){1tgsnGk@P>L`B?vr#2~_kM)=}qvrgqA&T-Ixkuxqb>d+agGX>n>AyCQm zDCS9(5L9Qy(9S?MX0BeHF>PK4gJHMidK)QpoP{}yl-I^wKq}wHxY7Os80QnF|;?7*_bE5l-rp7U@DlA2TdHaE13Zh z2Vt|)#-zYh*_gM$_`sO`{2rJC2uAMj6eFIpN`6OUt%)!8q&>) znahbn=nlnXrhuW_6q6|cL-#5sGYbseuqcMgqF0RWT1=Y~*w9X-+i2@*R^7E`b%(88 zi(#W4A6k1SQYE2A_zEM-yxCj=b_l$5J9)4Fm&iF}m@w-V+GFpB+;kx;}`;0|vix-2|8%uLY*Qs8Xo1*b0(Cv}r!p&{15!~3&L@_RP2;M1& literal 2288 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 F{{WQndP4vJ literal 10881 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 h`#%xVq{(@|2R0 +#include "msvcrt.dll.h" + +#include "string.c" +//#include "dlfcn.c" +#include "conio.c" +#include "stdio.c" +#include "stdlib.c" + + +typedef struct +{ + char *name; + void *f; +} export_t; + +// conio +const char sz__getch[] = "_getch"; +const char sz__kbhit[] = "_kbhit"; + +// stdio +const char sz_printf[] = "printf"; +const char sz_puts[] = "puts"; +const char sz_gets[] = "gets"; + +//string +const char sz_strlen[] = "strlen"; +const char sz_strcmp[] = "strcmp"; +const char sz_strcat[] = "strcat"; + +// stdlib +const char sz_malloc[] = "malloc"; +const char sz_free[] = "free"; +const char sz_realloc[] = "realloc"; +//const char sz_[] = ""; + + +//uint32_t EXPORTS[] __asm__("EXPORTS") = +export_t EXPORTS[] = +{ + {sz__getch, (void*)_getch}, + {sz__kbhit, (void*)_kbhit}, + + {sz_printf, (void*)printf}, + {sz_puts, (void*)puts}, + {sz_gets, (void*)gets}, + + {sz_strlen, (void*)strlen}, + {sz_strcmp, (void*)strcmp}, + {sz_strcat, (void*)strcat}, + + {sz_malloc, (void*)malloc}, + {sz_free, (void*)free}, + {sz_realloc, (void*)realloc}, + {NULL, NULL}, +}; + + +int lib_init() +{ + con_init_console_dll(); +} diff --git a/programs/emulator/kwine/lib/msvcrt.dll.h b/programs/emulator/kwine/lib/msvcrt.dll.h new file mode 100644 index 0000000000..1242da7058 --- /dev/null +++ b/programs/emulator/kwine/lib/msvcrt.dll.h @@ -0,0 +1,36 @@ +// ------------------------------------------------------------- +// KWINE is a fork of program PELoad written by 0CodErr +// author of fork - rgimad +//------------------------------------------------------------- +#ifndef MSVCRT_DLL_H +#define MSVCRT_DLL_H + +#define NULL ((void*)0) + +#define cdecl __attribute__ ((cdecl)) +#define stdcall __attribute__ ((stdcall)) + +//#define cdecl __cdecl +//#define stdcall __stdcall + + +static inline void debug_board_write_byte(const char ch){ + __asm__ __volatile__( + "int $0x40" + : + :"a"(63), "b"(1), "c"(ch)); +} + +static inline void debug_board_write_string(char *str){ + char ch; + while (ch = *(str++)) + { + __asm__ __volatile__( + "int $0x40" + : + :"a"(63), "b"(1), "c"(ch)); + } +} +// + +#endif \ No newline at end of file diff --git a/programs/emulator/kwine/lib/stddef.h b/programs/emulator/kwine/lib/stddef.h new file mode 100644 index 0000000000..85bf16f2d4 --- /dev/null +++ b/programs/emulator/kwine/lib/stddef.h @@ -0,0 +1,27 @@ +#ifndef _STDDEF_H +#define _STDDEF_H + +typedef __SIZE_TYPE__ size_t; +typedef __PTRDIFF_TYPE__ ssize_t; +typedef __WCHAR_TYPE__ wchar_t; +typedef __PTRDIFF_TYPE__ ptrdiff_t; +typedef __PTRDIFF_TYPE__ intptr_t; +typedef __SIZE_TYPE__ uintptr_t; + +#ifndef __int8_t_defined +#define __int8_t_defined +typedef signed char int8_t; +typedef signed short int int16_t; +typedef signed int int32_t; +typedef signed long long int int64_t; +typedef unsigned char uint8_t; +typedef unsigned short int uint16_t; +typedef unsigned int uint32_t; +typedef unsigned long long int uint64_t; +#endif + +#ifndef NULL +#define NULL ((void*)0) +#endif + +#endif // \ No newline at end of file diff --git a/programs/emulator/kwine/lib/stdio.c b/programs/emulator/kwine/lib/stdio.c new file mode 100644 index 0000000000..c0ce829d52 --- /dev/null +++ b/programs/emulator/kwine/lib/stdio.c @@ -0,0 +1,124 @@ + + +int putchar(int ch) +{ + con_init_console_dll(); + char str[2]; + str[0] = ch; + str[1] = 0; + con_write_asciiz(str); + return ch; +} + +void cdecl puts(const char *str) +{ + con_init_console_dll(); + con_write_asciiz(str); +} + +char* cdecl gets(char* str) +{ + con_init_console_dll(); + return con_gets(str, 256); +} + + +void putuint(int i) +{ + unsigned int n, d = 1000000000; + char str[255]; + unsigned int dec_index = 0; + while( ( i/d == 0 ) && ( d >= 10 ) ) d /= 10; + n = i; + while(d >= 10) + { + str[dec_index++] = ((char)((int)'0' + n/d)); + n = n % d; + d /= 10; + } + str[dec_index++] = ((char)((int)'0' + n)); + str[dec_index] = 0; + puts(str); +} + +void putint(int i) +{ + if(i >= 0) + { + putuint(i); + } else { + putchar('-'); + putuint(-i); + } +} + + +void puthex(uint32_t i) +{ + const unsigned char hex[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + unsigned int n, d = 0x10000000; + + puts("0x"); + while((i / d == 0) && (d >= 0x10)) d /= 0x10; + n = i; + while( d >= 0xF ) + { + putchar(hex[n/d]); + n = n % d; + d /= 0x10; + } + putchar(hex[n]); +} + + +void print(char *format, va_list args) +{ + int i = 0; + char *string; + + while (format[i]) + { + if (format[i] == '%') + { + i++; + switch (format[i]) + { + case 's': + string = va_arg(args, char*); + puts(string); + break; + case 'c': + // To-Do: fix this! "warning: cast to pointer from integer of different size" + putchar(va_arg(args, int)); + break; + case 'd': + putint(va_arg(args, int)); + break; + case 'i': + putint(va_arg(args, int)); + break; + case 'u': + putuint(va_arg(args, unsigned int)); + break; + case 'x': + puthex(va_arg(args, uint32_t)); + break; + default: + putchar(format[i]); + } + } else { + putchar(format[i]); + } + i++; + }//endwhile +} + + +void printf(char *text, ... ) +{ + va_list args; + // find the first argument + va_start(args, text); + // pass print the output handle the format text and the first argument + print(text, args); +} \ No newline at end of file diff --git a/programs/emulator/kwine/lib/stdlib.c b/programs/emulator/kwine/lib/stdlib.c new file mode 100644 index 0000000000..f86e1ce356 --- /dev/null +++ b/programs/emulator/kwine/lib/stdlib.c @@ -0,0 +1,32 @@ + +void *malloc(size_t size) +{ + void *val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(12),"c"(size)); + return val; +} + +int free(void *mem) +{ + int val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(13),"c"(mem)); + return val; +} + +void* realloc(void *mem, size_t size) +{ + void *val; + __asm__ __volatile__( + "int $0x40" + :"=a"(val) + :"a"(68),"b"(20),"c"(size),"d"(mem) + :"memory"); + + return val; +}; \ No newline at end of file diff --git a/programs/emulator/kwine/lib/string.c b/programs/emulator/kwine/lib/string.c new file mode 100644 index 0000000000..2a0ba3419b --- /dev/null +++ b/programs/emulator/kwine/lib/string.c @@ -0,0 +1,194 @@ + +#ifndef NULL +#define NULL ((void*)0) +#endif + +void* memset(void *mem, int c, unsigned size) +{ + unsigned i; + for ( i = 0; i < size; i++ ) + *((char *)mem+i) = (char) c; + return NULL; +} + + +void* memcpy(void *dst, const void *src, unsigned size) +{ + unsigned i; + for ( i = 0; i < size; i++) + *(char *)(dst+i) = *(char *)(src+i); + return NULL; +} + + +int memcmp(const void* buf1, const void* buf2, int count) +{ + int i; + for (i=0;i*(unsigned char*)buf2) + return 1; + } + return 0; +} + +char *strcat(char strDest[], char strSource[]) +{ + int i, j; + i = j = 0; + while (strDest[i] != '\0') i++; + while ((strDest[i++] = strSource[j++]) != '\0'); + return strDest; +} + + +/*int strcmp(char* string1,char* string2) +{ + + while (1) + { + if (*string1<*string2) + return -1; + if (*string1>*string2) + return 1; + if (*string1=='\0') + return 0; + string1++; + string2++; + } +}*/ + +int strcmp(const char* s1, const char* s2) +{ + while(*s1 && (*s1==*s2)) + s1++,s2++; + return *(const unsigned char*)s1-*(const unsigned char*)s2; +} + +char *strcpy(char strDest[], const char strSource[]) +{ + unsigned i; + i = 0; + while ((strDest[i] = strSource[i]) != '\0') i++; + return strDest; +} + + +char* strncpy(char *strDest, const char *strSource, unsigned n) +{ + unsigned i; + if (! n ) + return strDest; + i = 0; + while ((strDest[i] = strSource[i]) != '\0') + if ( (n-1) == i ) + break; + else + i++; + return strDest; +} + + +int strlen(const char* string) +{ + int i; + i=0; + while (*string++) i++; + return i; +} + + + +char* strchr(const char* string, int c) +{ + while (*string) + { + if (*string==c) + return (char*)string; + string++; + } + return (char*)0; +} + + +char* strrchr(const char* string, int c) +{ + char* last_found; + while (*string) + { + if (*string==c) + { + last_found = (char*)string; + } + string++; + } + return last_found; +} + + + +void _itoa(int i, char *s) +{ + int a, b, c, d; + a = (i - i%1000)/1000; + b = (i - i%100)/100 - a*10; + c = (i - i%10)/10 - a*100 - b*10; + d = i%10; + s[0] = a + '0'; + s[1] = b + '0'; + s[2] = c + '0'; + s[3] = d + '0'; + s[4] = 0; +} + + + /* reverse: переворачиваем строку s на месте */ +void reverse(char s[]) + { + int i, j; + char c; + + for (i = 0, j = strlen(s)-1; i 0); + if (sign < 0) + s[i++] = '-'; + s[i] = '\0'; + reverse(s); + } + + + +int atoi ( char *s ) +{ + int i, n; + + n = 0; + for ( i = 0; s[i]!= '\0'; ++i) + if ((s[i]<'0') || (s[i]>'9')) + return 0; + else + n = 10 * n + s[i] - '0'; + + return n; +} + + diff --git a/programs/emulator/kwine/make.bat b/programs/emulator/kwine/make.bat index b38ab0eba0..a1d9c709a7 100644 --- a/programs/emulator/kwine/make.bat +++ b/programs/emulator/kwine/make.bat @@ -1,7 +1,13 @@ @echo off set NASM="nasm\nasm.exe" -%NASM% -f coff "lib\msvcrt.dll.asm" -o "..\lib\msvcrt.dll" -strip --strip-debug "../lib/msvcrt.dll" +rem set GCC="D:\MinGW_32_bit\bin\gcc.exe" +set GCC="C:\MinGW\msys\1.0\home\autobuild\tools\win32\bin\kos32-gcc.exe" + +rem %NASM% -f coff "lib\msvcrt.dll.asm" -o "..\lib\msvcrt.dll" +rem strip --strip-debug "../lib/msvcrt.dll" + +rem %GCC% -fno-ident -nostdlib -fno-builtin -c -std=gnu99 -o ..\lib\msvcrt.dll lib\msvcrt.dll.c +%GCC% -fno-ident -fno-builtin -O0 -c -o ..\lib\msvcrt.dll lib\msvcrt.dll.c %NASM% -f coff "lib/kernel32.dll.asm" -o "../lib/kernel32.dll" strip --strip-debug "../lib/kernel32.dll" diff --git a/programs/emulator/kwine/readme.txt b/programs/emulator/kwine/readme.txt index c9cb9f5015..c8cc192220 100644 --- a/programs/emulator/kwine/readme.txt +++ b/programs/emulator/kwine/readme.txt @@ -1,8 +1,15 @@ -kwine - kolibri wine. +KWINE v0.0.2 Developers: - - 0CodErr founder of project (PEload) - - rgimad some improvements + - 0CodErr founder of project PEload + - rgimad author of KWINE - fork of PEload -Topic: -http://board.kolibrios.org/viewtopic.php?f=9&t=2318&p=74314#p74308 \ No newline at end of file +How to use: + - in bin folder there is all neccesary files: + kwine, lib/kernel32.dll, lib/msvcrt.dll + - usage: + kwine mysuperexefile.exe + +Changelog: + - msvcrt.dll rewritten in c + - added malloc, free, realloc, strcmp, strcat, strlen, printf to msvcrt.dll \ No newline at end of file