Created
May 12, 2013 23:23
-
-
Save wanabe/5565338 to your computer and use it in GitHub Desktop.
patch for Wine to work CRuby on.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/dlls/msvcr100/msvcr100.c b/dlls/msvcr100/msvcr100.c | |
index 149f132..a7cf2ac 100644 | |
--- a/dlls/msvcr100/msvcr100.c | |
+++ b/dlls/msvcr100/msvcr100.c | |
@@ -497,6 +497,7 @@ BOOL WINAPI DllMain(HINSTANCE hdll, DWORD reason, LPVOID reserved) | |
case DLL_PROCESS_ATTACH: | |
DisableThreadLibraryCalls(hdll); | |
_set_printf_count_output(0); | |
+ ((char**)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "__pioinfo"))[2048/32] = (char*)-1; | |
} | |
return TRUE; | |
} | |
diff --git a/dlls/msvcr110/msvcr110.c b/dlls/msvcr110/msvcr110.c | |
index 04a0dc2..428d465 100644 | |
--- a/dlls/msvcr110/msvcr110.c | |
+++ b/dlls/msvcr110/msvcr110.c | |
@@ -39,6 +39,7 @@ BOOL WINAPI DllMain(HINSTANCE hdll, DWORD reason, LPVOID reserved) | |
case DLL_PROCESS_ATTACH: | |
DisableThreadLibraryCalls(hdll); | |
+ ((char**)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "__pioinfo"))[2048/32] = (char*)-1; | |
} | |
return TRUE; | |
} | |
diff --git a/dlls/msvcr80/msvcr80.c b/dlls/msvcr80/msvcr80.c | |
index 89a665b..b466fa2 100644 | |
--- a/dlls/msvcr80/msvcr80.c | |
+++ b/dlls/msvcr80/msvcr80.c | |
@@ -34,6 +34,7 @@ BOOL WINAPI DllMain(HINSTANCE hdll, DWORD reason, LPVOID reserved) | |
case DLL_PROCESS_ATTACH: | |
DisableThreadLibraryCalls(hdll); | |
_set_printf_count_output(0); | |
+ ((char**)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "__pioinfo"))[2048/32] = (char*)-1; | |
} | |
return TRUE; | |
} | |
diff --git a/dlls/msvcr90/msvcr90.c b/dlls/msvcr90/msvcr90.c | |
index 4787867..3c75f91 100644 | |
--- a/dlls/msvcr90/msvcr90.c | |
+++ b/dlls/msvcr90/msvcr90.c | |
@@ -61,6 +61,7 @@ BOOL WINAPI DllMain(HINSTANCE hdll, DWORD reason, LPVOID reserved) | |
DisableThreadLibraryCalls(hdll); | |
init_cxx_funcs(); | |
_set_printf_count_output(0); | |
+ ((char**)GetProcAddress(GetModuleHandleA("msvcrt.dll"), "__pioinfo"))[2048/32] = (char*)-1; | |
} | |
return TRUE; | |
} | |
diff --git a/dlls/msvcrt/file.c b/dlls/msvcrt/file.c | |
index c0c7124..6778cf2 100644 | |
--- a/dlls/msvcrt/file.c | |
+++ b/dlls/msvcrt/file.c | |
@@ -84,16 +84,28 @@ static char utf16_bom[2] = { 0xff, 0xfe }; | |
typedef struct { | |
HANDLE handle; | |
unsigned char wxflag; | |
- char lookahead[3]; | |
+ char lookahead0; | |
int exflag; | |
CRITICAL_SECTION crit; | |
+ char unk1; | |
+ char lookahead1; | |
+ char lookahead2; | |
} ioinfo; | |
+typedef struct { | |
+ HANDLE handle; | |
+ unsigned char wxflag; | |
+ char lookahead0; | |
+ int init_flag; | |
+ CRITICAL_SECTION crit; | |
+} ioinfo_old; | |
+ | |
/********************************************************************* | |
* __pioinfo (MSVCRT.@) | |
* array of pointers to ioinfo arrays [32] | |
*/ | |
-ioinfo * MSVCRT___pioinfo[MSVCRT_MAX_FILES/MSVCRT_FD_BLOCK_SIZE] = { 0 }; | |
+ioinfo * MSVCRT___pioinfo[MSVCRT_MAX_FILES/MSVCRT_FD_BLOCK_SIZE + 1] = { 0 }; | |
+#define MSVCRT_is_ioinfo_new (int)MSVCRT___pioinfo[MSVCRT_MAX_FILES/MSVCRT_FD_BLOCK_SIZE] | |
/********************************************************************* | |
* __badioinfo (MSVCRT.@) | |
@@ -217,15 +229,20 @@ static void time_to_filetime( MSVCRT___time64_t time, FILETIME *ft ) | |
ft->dwLowDateTime = ticks; | |
} | |
+static inline int msvcrt_get_ioinfo_size() | |
+{ | |
+ return MSVCRT_is_ioinfo_new ? sizeof(ioinfo) : sizeof(ioinfo_old); | |
+} | |
+ | |
static inline ioinfo* msvcrt_get_ioinfo(int fd) | |
{ | |
- ioinfo *ret = NULL; | |
+ char *ret = NULL; | |
if(fd < MSVCRT_MAX_FILES) | |
- ret = MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE]; | |
+ ret = (char*) MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE]; | |
if(!ret) | |
return &MSVCRT___badioinfo; | |
- return ret + (fd%MSVCRT_FD_BLOCK_SIZE); | |
+ return (ioinfo*)(ret + (fd%MSVCRT_FD_BLOCK_SIZE) * msvcrt_get_ioinfo_size()); | |
} | |
static inline MSVCRT_FILE* msvcrt_get_file(int i) | |
@@ -333,25 +350,33 @@ static int msvcrt_set_fd(HANDLE hand, int flag, int fd) | |
if(fdinfo == &MSVCRT___badioinfo) { | |
int i; | |
- MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE] = MSVCRT_calloc(MSVCRT_FD_BLOCK_SIZE, sizeof(ioinfo)); | |
+ MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE] = MSVCRT_calloc(MSVCRT_FD_BLOCK_SIZE, msvcrt_get_ioinfo_size()); | |
if(!MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE]) { | |
WARN(":out of memory!\n"); | |
*MSVCRT__errno() = MSVCRT_ENOMEM; | |
return -1; | |
} | |
- for(i=0; i<MSVCRT_FD_BLOCK_SIZE; i++) | |
- MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE][i].handle = INVALID_HANDLE_VALUE; | |
+ if (MSVCRT_is_ioinfo_new) { | |
+ for(i=0; i<MSVCRT_FD_BLOCK_SIZE; i++) | |
+ MSVCRT___pioinfo[fd/MSVCRT_FD_BLOCK_SIZE][i].handle = INVALID_HANDLE_VALUE; | |
+ } else { | |
+ for(i=0; i<MSVCRT_FD_BLOCK_SIZE; i++) | |
+ ((ioinfo_old**)MSVCRT___pioinfo)[fd/MSVCRT_FD_BLOCK_SIZE][i].handle = INVALID_HANDLE_VALUE; | |
+ } | |
fdinfo = msvcrt_get_ioinfo(fd); | |
} | |
fdinfo->handle = hand; | |
fdinfo->wxflag = WX_OPEN | (flag & (WX_DONTINHERIT | WX_APPEND | WX_TEXT | WX_PIPE)); | |
- fdinfo->lookahead[0] = '\n'; | |
- fdinfo->lookahead[1] = '\n'; | |
- fdinfo->lookahead[2] = '\n'; | |
- fdinfo->exflag = 0; | |
+ fdinfo->lookahead0 = '\n'; | |
+ InitializeCriticalSection(&fdinfo->crit); | |
+ fdinfo->exflag = EF_CRIT_INIT; | |
+ if (MSVCRT_is_ioinfo_new) { | |
+ fdinfo->lookahead1 = '\n'; | |
+ fdinfo->lookahead2 = '\n'; | |
+ } | |
/* locate next free slot */ | |
if (fd == MSVCRT_fdstart && fd == MSVCRT_fdend) | |
@@ -1055,7 +1080,7 @@ void msvcrt_free_io(void) | |
MSVCRT_fclose(&MSVCRT__iob[1]); | |
MSVCRT_fclose(&MSVCRT__iob[2]); | |
- for(i=0; i<sizeof(MSVCRT___pioinfo)/sizeof(MSVCRT___pioinfo[0]); i++) | |
+ for(i=0; i<sizeof(MSVCRT___pioinfo)/sizeof(MSVCRT___pioinfo[0])-1; i++) | |
MSVCRT_free(MSVCRT___pioinfo[i]); | |
for(j=0; j<MSVCRT_stream_idx; j++) | |
@@ -1999,12 +2024,14 @@ int CDECL MSVCRT__wsopen_s( int *fd, const MSVCRT_wchar_t* path, int oflags, int | |
if (*fd == -1) | |
return *MSVCRT__errno(); | |
- if (oflags & MSVCRT__O_WTEXT) | |
- msvcrt_get_ioinfo(*fd)->exflag |= EF_UTF16|EF_UNK_UNICODE; | |
- else if (oflags & MSVCRT__O_U16TEXT) | |
- msvcrt_get_ioinfo(*fd)->exflag |= EF_UTF16; | |
- else if (oflags & MSVCRT__O_U8TEXT) | |
- msvcrt_get_ioinfo(*fd)->exflag |= EF_UTF8; | |
+ if (MSVCRT_is_ioinfo_new) { | |
+ if (oflags & MSVCRT__O_WTEXT) | |
+ msvcrt_get_ioinfo(*fd)->exflag |= EF_UTF16|EF_UNK_UNICODE; | |
+ else if (oflags & MSVCRT__O_U16TEXT) | |
+ msvcrt_get_ioinfo(*fd)->exflag |= EF_UTF16; | |
+ else if (oflags & MSVCRT__O_U8TEXT) | |
+ msvcrt_get_ioinfo(*fd)->exflag |= EF_UTF8; | |
+ } | |
TRACE(":fd (%d) handle (%p)\n", *fd, hand); | |
return 0; | |
@@ -2204,17 +2231,17 @@ static int read_utf8(int fd, MSVCRT_wchar_t *buf, unsigned int count) | |
readbuf = min_buf; | |
} | |
- if(fdinfo->lookahead[0] != '\n') { | |
- readbuf[pos++] = fdinfo->lookahead[0]; | |
- fdinfo->lookahead[0] = '\n'; | |
+ if(fdinfo->lookahead0 != '\n') { | |
+ readbuf[pos++] = fdinfo->lookahead0; | |
+ fdinfo->lookahead0 = '\n'; | |
- if(fdinfo->lookahead[1] != '\n') { | |
- readbuf[pos++] = fdinfo->lookahead[1]; | |
- fdinfo->lookahead[1] = '\n'; | |
+ if(MSVCRT_is_ioinfo_new && fdinfo->lookahead1 != '\n') { | |
+ readbuf[pos++] = fdinfo->lookahead1; | |
+ fdinfo->lookahead1 = '\n'; | |
- if(fdinfo->lookahead[2] != '\n') { | |
- readbuf[pos++] = fdinfo->lookahead[2]; | |
- fdinfo->lookahead[2] = '\n'; | |
+ if(fdinfo->lookahead2 != '\n') { | |
+ readbuf[pos++] = fdinfo->lookahead2; | |
+ fdinfo->lookahead2 = '\n'; | |
} | |
} | |
} | |
@@ -2262,7 +2289,7 @@ static int read_utf8(int fd, MSVCRT_wchar_t *buf, unsigned int count) | |
else { | |
buf[0] = '\r'; | |
if(fdinfo->wxflag & WX_PIPE) | |
- fdinfo->lookahead[0] = lookahead; | |
+ fdinfo->lookahead0 = lookahead; | |
else | |
SetFilePointer(fdinfo->handle, -1, NULL, FILE_CURRENT); | |
} | |
@@ -2311,11 +2338,13 @@ static int read_utf8(int fd, MSVCRT_wchar_t *buf, unsigned int count) | |
if(fdinfo->wxflag & WX_PIPE) { | |
if(i < pos) | |
- fdinfo->lookahead[0] = readbuf[i]; | |
- if(i+1 < pos) | |
- fdinfo->lookahead[1] = readbuf[i+1]; | |
- if(i+2 < pos) | |
- fdinfo->lookahead[2] = readbuf[i+2]; | |
+ fdinfo->lookahead0 = readbuf[i]; | |
+ if (MSVCRT_is_ioinfo_new) { | |
+ if (i+1 < pos) | |
+ fdinfo->lookahead1 = readbuf[i+1]; | |
+ if(i+2 < pos) | |
+ fdinfo->lookahead2 = readbuf[i+2]; | |
+ } | |
}else if(i < pos) { | |
SetFilePointer(fdinfo->handle, i-pos, NULL, FILE_CURRENT); | |
} | |
@@ -2329,7 +2358,7 @@ static int read_utf8(int fd, MSVCRT_wchar_t *buf, unsigned int count) | |
/* strip '\r' if followed by '\n' */ | |
if(readbuf[i] == '\r' && i+1==pos) { | |
- if(fdinfo->lookahead[0] != '\n' || !ReadFile(hand, &lookahead, 1, &num_read, NULL) || !num_read) { | |
+ if(fdinfo->lookahead0 != '\n' || !ReadFile(hand, &lookahead, 1, &num_read, NULL) || !num_read) { | |
readbuf[j++] = '\r'; | |
}else if(lookahead == '\n' && j==0) { | |
readbuf[j++] = '\n'; | |
@@ -2338,7 +2367,7 @@ static int read_utf8(int fd, MSVCRT_wchar_t *buf, unsigned int count) | |
readbuf[j++] = '\r'; | |
if(fdinfo->wxflag & WX_PIPE) | |
- fdinfo->lookahead[0] = lookahead; | |
+ fdinfo->lookahead0 = lookahead; | |
else | |
SetFilePointer(fdinfo->handle, -1, NULL, FILE_CURRENT); | |
} | |
@@ -2367,7 +2396,7 @@ static int read_utf8(int fd, MSVCRT_wchar_t *buf, unsigned int count) | |
*/ | |
static int read_i(int fd, void *buf, unsigned int count) | |
{ | |
- DWORD num_read, utf16; | |
+ DWORD num_read, utf16 = 0; | |
char *bufstart = buf; | |
HANDLE hand = msvcrt_fdtoh(fd); | |
ioinfo *fdinfo = msvcrt_get_ioinfo(fd); | |
@@ -2388,27 +2417,29 @@ static int read_i(int fd, void *buf, unsigned int count) | |
return -1; | |
} | |
- utf16 = (fdinfo->exflag & EF_UTF16) != 0; | |
- if (((fdinfo->exflag&EF_UTF8) || utf16) && count&1) | |
- { | |
- *MSVCRT__errno() = MSVCRT_EINVAL; | |
- return -1; | |
- } | |
+ if (MSVCRT_is_ioinfo_new) { | |
+ utf16 = (fdinfo->exflag & EF_UTF16) != 0; | |
+ if (((fdinfo->exflag&EF_UTF8) || utf16) && count&1) | |
+ { | |
+ *MSVCRT__errno() = MSVCRT_EINVAL; | |
+ return -1; | |
+ } | |
- if((fdinfo->wxflag&WX_TEXT) && (fdinfo->exflag&EF_UTF8)) | |
- return read_utf8(fd, buf, count); | |
+ if((fdinfo->wxflag&WX_TEXT) && (fdinfo->exflag&EF_UTF8)) | |
+ return read_utf8(fd, buf, count); | |
+ } | |
- if (fdinfo->lookahead[0]!='\n' || ReadFile(hand, bufstart, count, &num_read, NULL)) | |
+ if (fdinfo->lookahead0!='\n' || ReadFile(hand, bufstart, count, &num_read, NULL)) | |
{ | |
- if (fdinfo->lookahead[0] != '\n') | |
+ if (fdinfo->lookahead0 != '\n') | |
{ | |
- bufstart[0] = fdinfo->lookahead[0]; | |
- fdinfo->lookahead[0] = '\n'; | |
+ bufstart[0] = fdinfo->lookahead0; | |
+ fdinfo->lookahead0 = '\n'; | |
if (utf16) | |
{ | |
- bufstart[1] = fdinfo->lookahead[1]; | |
- fdinfo->lookahead[1] = '\n'; | |
+ bufstart[1] = fdinfo->lookahead1; | |
+ fdinfo->lookahead1 = '\n'; | |
} | |
if(count>1+utf16 && ReadFile(hand, bufstart+1+utf16, count-1-utf16, &num_read, NULL)) | |
@@ -2473,8 +2504,8 @@ static int read_i(int fd, void *buf, unsigned int count) | |
if (fdinfo->wxflag & WX_PIPE) | |
{ | |
- fdinfo->lookahead[0] = lookahead[0]; | |
- fdinfo->lookahead[1] = lookahead[1]; | |
+ fdinfo->lookahead0 = lookahead[0]; | |
+ fdinfo->lookahead1 = lookahead[1]; | |
} | |
else | |
SetFilePointer(fdinfo->handle, -1-utf16, NULL, FILE_CURRENT); | |
@@ -2532,22 +2563,26 @@ int CDECL MSVCRT__read(int fd, void *buf, unsigned int count) | |
int CDECL MSVCRT__setmode(int fd,int mode) | |
{ | |
int ret = msvcrt_get_ioinfo(fd)->wxflag & WX_TEXT ? MSVCRT__O_TEXT : MSVCRT__O_BINARY; | |
- if(ret==MSVCRT__O_TEXT && (msvcrt_get_ioinfo(fd)->exflag & (EF_UTF8|EF_UTF16))) | |
+ if(MSVCRT_is_ioinfo_new && ret==MSVCRT__O_TEXT && (msvcrt_get_ioinfo(fd)->exflag & (EF_UTF8|EF_UTF16))) | |
ret = MSVCRT__O_WTEXT; | |
if(mode!=MSVCRT__O_TEXT && mode!=MSVCRT__O_BINARY && mode!=MSVCRT__O_WTEXT | |
- && mode!=MSVCRT__O_U16TEXT && mode!=MSVCRT__O_U8TEXT) { | |
+ && (MSVCRT_is_ioinfo_new || (mode!=MSVCRT__O_U16TEXT && mode!=MSVCRT__O_U8TEXT))) { | |
*MSVCRT__errno() = MSVCRT_EINVAL; | |
return -1; | |
} | |
if(mode == MSVCRT__O_BINARY) { | |
msvcrt_get_ioinfo(fd)->wxflag &= ~WX_TEXT; | |
- msvcrt_get_ioinfo(fd)->exflag &= ~(EF_UTF8|EF_UTF16); | |
+ if(MSVCRT_is_ioinfo_new) | |
+ msvcrt_get_ioinfo(fd)->exflag &= ~(EF_UTF8|EF_UTF16); | |
return ret; | |
} | |
msvcrt_get_ioinfo(fd)->wxflag |= WX_TEXT; | |
+ if(!MSVCRT_is_ioinfo_new) | |
+ return ret; | |
+ | |
if(mode == MSVCRT__O_TEXT) | |
msvcrt_get_ioinfo(fd)->exflag &= ~(EF_UTF8|EF_UTF16); | |
else if(mode == MSVCRT__O_U8TEXT) | |
@@ -2938,7 +2973,7 @@ int CDECL MSVCRT__write(int fd, const void* buf, unsigned int count) | |
return -1; | |
} | |
- if (((info->exflag&EF_UTF8) || (info->exflag&EF_UTF16)) && count&1) | |
+ if (MSVCRT_is_ioinfo_new && ((info->exflag&EF_UTF8) || (info->exflag&EF_UTF16)) && count&1) | |
{ | |
*MSVCRT__errno() = MSVCRT_EINVAL; | |
return -1; | |
@@ -2964,7 +2999,7 @@ int CDECL MSVCRT__write(int fd, const void* buf, unsigned int count) | |
const char *q; | |
const char *s = buf, *buf_start = buf; | |
- if (!(info->exflag & (EF_UTF8|EF_UTF16))) | |
+ if (!(info->exflag & MSVCRT_is_ioinfo_new & (EF_UTF8|EF_UTF16))) | |
{ | |
/* find number of \n */ | |
for (nr_lf=0, i=0; i<count; i++) | |
@@ -3267,7 +3302,7 @@ MSVCRT_wint_t CDECL MSVCRT_fgetwc(MSVCRT_FILE* file) | |
MSVCRT__lock_file(file); | |
- if((msvcrt_get_ioinfo(file->_file)->exflag & (EF_UTF8 | EF_UTF16)) | |
+ if((msvcrt_get_ioinfo(file->_file)->exflag & MSVCRT_is_ioinfo_new & (EF_UTF8 | EF_UTF16)) | |
|| !(msvcrt_get_ioinfo(file->_file)->wxflag & WX_TEXT)) { | |
char *p; | |
@@ -3448,7 +3483,7 @@ MSVCRT_wint_t CDECL MSVCRT_fputwc(MSVCRT_wint_t wc, MSVCRT_FILE* file) | |
MSVCRT__lock_file(file); | |
fdinfo = msvcrt_get_ioinfo(file->_file); | |
- if((fdinfo->wxflag&WX_TEXT) && !(fdinfo->exflag&(EF_UTF8|EF_UTF16))) { | |
+ if((fdinfo->wxflag&WX_TEXT) && !(fdinfo->exflag&MSVCRT_is_ioinfo_new&(EF_UTF8|EF_UTF16))) { | |
char buf[MSVCRT_MB_LEN_MAX]; | |
int char_len; | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment