diff --git a/dlls/msvcp100/locale.c b/dlls/msvcp100/locale.c
index 65749d16eb072caeec55cad742a5932356b8296c..198cc337c90bce68fc5717efe19fb25ce97fb40c 100644
--- a/dlls/msvcp100/locale.c
+++ b/dlls/msvcp100/locale.c
@@ -26,6 +26,7 @@
 #include "limits.h"
 #include "math.h"
 #include "stdio.h"
+#include "wctype.h"
 
 #include "wine/list.h"
 
@@ -7778,6 +7779,27 @@ locale* __cdecl locale_global(locale *ret, const locale *loc)
     return ret;
 }
 
+/* wctrans */
+wctrans_t __cdecl wctrans(const char *property)
+{
+    static const char str_tolower[] = "tolower";
+    static const char str_toupper[] = "toupper";
+
+    if(!strcmp(property, str_tolower))
+        return 2;
+    if(!strcmp(property, str_toupper))
+        return 1;
+    return 0;
+}
+
+/* towctrans */
+wint_t __cdecl towctrans(wint_t c, wctrans_t category)
+{
+    if(category == 1)
+        return towupper(c);
+    return towlower(c);
+}
+
 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@");
 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@");
 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@");
diff --git a/dlls/msvcp100/msvcp100.spec b/dlls/msvcp100/msvcp100.spec
index d6cb46cf9395f44e836f0a8a6f952c903b7810c8..85e6107e3d123cd2c4b5a4de9883e651ef7e83f2 100644
--- a/dlls/msvcp100/msvcp100.spec
+++ b/dlls/msvcp100/msvcp100.spec
@@ -2865,6 +2865,6 @@
 @ stub _Wcsxfrm
 # extern _Xbig
 @ stub __Wcrtomb_lk
-@ stub towctrans
-@ stub wctrans
+@ cdecl towctrans(long long)
+@ cdecl wctrans(str)
 @ cdecl wctype(str)
diff --git a/dlls/msvcp60/locale.c b/dlls/msvcp60/locale.c
index a2a50df162b6a26bd5e62b29d8bcae6d5de3ca78..1ad21ae92695491e070f543f6009100c076e6c80 100644
--- a/dlls/msvcp60/locale.c
+++ b/dlls/msvcp60/locale.c
@@ -26,6 +26,7 @@
 #include "limits.h"
 #include "math.h"
 #include "stdio.h"
+#include "wctype.h"
 
 #include "wine/list.h"
 
@@ -7652,6 +7653,27 @@ locale* __cdecl locale_global(locale *ret, const locale *loc)
     return ret;
 }
 
+/* wctrans */
+wctrans_t __cdecl wctrans(const char *property)
+{
+    static const char str_tolower[] = "tolower";
+    static const char str_toupper[] = "toupper";
+
+    if(!strcmp(property, str_tolower))
+        return 2;
+    if(!strcmp(property, str_toupper))
+        return 1;
+    return 0;
+}
+
+/* towctrans */
+wint_t __cdecl towctrans(wint_t c, wctrans_t category)
+{
+    if(category == 1)
+        return towupper(c);
+    return towlower(c);
+}
+
 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@");
 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@");
 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@");
diff --git a/dlls/msvcp60/msvcp60.spec b/dlls/msvcp60/msvcp60.spec
index 9a6401318fd78df71e9f06033cf7ba862021e3f2..8dcf3742138bbee54973f010923cb153ca516234 100644
--- a/dlls/msvcp60/msvcp60.spec
+++ b/dlls/msvcp60/msvcp60.spec
@@ -4312,9 +4312,9 @@
 @ stub mbrlen # msvcrt.mbrlen
 @ stub mbrtowc # msvcrt.mbrtowc
 @ stub mbsrtowcs # msvcrt.mbsrtowcs
-@ stub towctrans
+@ cdecl towctrans(long long)
 @ stub wcrtomb # msvcrt.wcrtomb
 @ cdecl wcsrtombs(ptr ptr long ptr) msvcrt.wcsrtombs
 @ cdecl wctob(long) msvcrt.wctob
-@ stub wctrans
+@ cdecl wctrans(str)
 @ cdecl wctype(str)
diff --git a/dlls/msvcp70/msvcp70.spec b/dlls/msvcp70/msvcp70.spec
index 3d836b248a8557ff09659ce982f96792081ebe56..aa6aa17b5a311e24df61ff5df0698ad5da70ab0f 100644
--- a/dlls/msvcp70/msvcp70.spec
+++ b/dlls/msvcp70/msvcp70.spec
@@ -5101,9 +5101,9 @@
 @ stub mbrlen
 @ stub mbrtowc
 @ stub mbsrtowcs
-@ stub towctrans
+@ cdecl towctrans(long long) msvcp90.towctrans
 @ stub wcrtomb
 @ cdecl wcsrtombs(ptr ptr long ptr) msvcrt.wcsrtombs
 @ cdecl wctob(long) msvcrt.wctob
-@ stub wctrans
+@ cdecl wctrans(str) msvcp90.wctrans
 @ cdecl wctype(str) msvcp90.wctype
diff --git a/dlls/msvcp71/locale.c b/dlls/msvcp71/locale.c
index de5f7faa222d35662b05f69c2765956d0d3d529c..381c21ed2b377e1c16e57f9a460ad1d23df8de23 100644
--- a/dlls/msvcp71/locale.c
+++ b/dlls/msvcp71/locale.c
@@ -26,6 +26,7 @@
 #include "limits.h"
 #include "math.h"
 #include "stdio.h"
+#include "wctype.h"
 
 #include "wine/list.h"
 
@@ -8275,6 +8276,27 @@ locale* __cdecl locale_global(locale *ret, const locale *loc)
     return ret;
 }
 
+/* wctrans */
+wctrans_t __cdecl wctrans(const char *property)
+{
+    static const char str_tolower[] = "tolower";
+    static const char str_toupper[] = "toupper";
+
+    if(!strcmp(property, str_tolower))
+        return 2;
+    if(!strcmp(property, str_toupper))
+        return 1;
+    return 0;
+}
+
+/* towctrans */
+wint_t __cdecl towctrans(wint_t c, wctrans_t category)
+{
+    if(category == 1)
+        return towupper(c);
+    return towlower(c);
+}
+
 DEFINE_RTTI_DATA0(locale_facet, 0, ".?AVfacet@locale@std@@");
 DEFINE_RTTI_DATA1(collate_char, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@D@std@@");
 DEFINE_RTTI_DATA1(collate_wchar, 0, &locale_facet_rtti_base_descriptor, ".?AV?$collate@_W@std@@");
diff --git a/dlls/msvcp71/msvcp71.spec b/dlls/msvcp71/msvcp71.spec
index c351c441643c53567f0031f8f0656aef69f1ca02..7ac0eb3c96d157eb72bf7f55f59bf05a98e6744f 100644
--- a/dlls/msvcp71/msvcp71.spec
+++ b/dlls/msvcp71/msvcp71.spec
@@ -5161,9 +5161,9 @@
 @ stub mbrlen
 @ stub mbrtowc
 @ stub mbsrtowcs
-@ stub towctrans
+@ cdecl towctrans(long long)
 @ stub wcrtomb
 @ cdecl wcsrtombs(ptr ptr long ptr) msvcrt.wcsrtombs
 @ cdecl wctob(long) msvcrt.wctob
-@ stub wctrans
+@ cdecl wctrans(str)
 @ cdecl wctype(str)
diff --git a/dlls/msvcp71/string.c b/dlls/msvcp71/string.c
index fd3bffa7c72c29a013c3a7fe6cd4287dcc392521..415e514d28ca48fb3329491ba35fe92abb5f99bf 100644
--- a/dlls/msvcp71/string.c
+++ b/dlls/msvcp71/string.c
@@ -565,7 +565,7 @@ MSVCP_bool __thiscall basic_string_char_inside(
 {
     char *cstr = basic_string_char_ptr(this);
 
-    return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
+    return ptr>=cstr && ptr<cstr+this->size;
 }
 
 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEX_NI@Z */
@@ -2256,7 +2256,7 @@ MSVCP_bool __thiscall basic_string_wchar_inside(
 {
     wchar_t *cstr = basic_string_wchar_ptr(this);
 
-    return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
+    return ptr>=cstr && ptr<cstr+this->size;
 }
 
 /* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEX_NI@Z */
diff --git a/dlls/msvcp80/msvcp80.spec b/dlls/msvcp80/msvcp80.spec
index 7946f0c2f686856e7abf434f0a9977602daf1041..902b636b798baa38b452c7cb581431b3cd5b6714 100644
--- a/dlls/msvcp80/msvcp80.spec
+++ b/dlls/msvcp80/msvcp80.spec
@@ -5785,6 +5785,6 @@
 @ stub __Stofx
 @ stub __Stoldx
 @ stub __Wcrtomb_lk
-@ stub towctrans
-@ stub wctrans
+@ cdecl towctrans(long long) msvcp90.towctrans
+@ cdecl wctrans(str) msvcp90.wctrans
 @ cdecl wctype(str) msvcp90.wctype
diff --git a/dlls/msvcp90/string.c b/dlls/msvcp90/string.c
index 838d1b01f930d0a72fe883b6f7eac29dfdc84222..a0359a18fc86760a4aa7e4d0328c72f2c915f9a7 100644
--- a/dlls/msvcp90/string.c
+++ b/dlls/msvcp90/string.c
@@ -563,7 +563,7 @@ MSVCP_bool __thiscall basic_string_char_inside(
 {
     char *cstr = basic_string_char_ptr(this);
 
-    return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
+    return ptr>=cstr && ptr<cstr+this->size;
 }
 
 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEX_NI@Z */
@@ -2377,7 +2377,7 @@ MSVCP_bool __thiscall basic_string_wchar_inside(
 {
     wchar_t *cstr = basic_string_wchar_ptr(this);
 
-    return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
+    return ptr>=cstr && ptr<cstr+this->size;
 }
 
 /* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEX_NI@Z */