Skip to content

Instantly share code, notes, and snippets.

@wanabe
Created May 12, 2013 23:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wanabe/5565338 to your computer and use it in GitHub Desktop.
Save wanabe/5565338 to your computer and use it in GitHub Desktop.
patch for Wine to work CRuby on.
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