From 2f01c45248f150a229723aeb44f96ff82ad76822 Mon Sep 17 00:00:00 2001
From: Piotr Caban <piotr@codeweavers.com>
Date: Fri, 14 Sep 2012 12:45:01 +0200
Subject: [PATCH] msvcp100: Remove unused thiscall functions.

---
 dlls/msvcp100/exception.c |    24 +-
 dlls/msvcp100/ios.c       | 11199 +++++++++++-------------------------
 dlls/msvcp100/locale.c    |   691 +--
 dlls/msvcp100/math.c      |    12 -
 dlls/msvcp100/memory.c    |   275 +-
 dlls/msvcp100/msvcp.h     |    52 +-
 dlls/msvcp100/string.c    |  3474 +----------
 7 files changed, 3705 insertions(+), 12022 deletions(-)

diff --git a/dlls/msvcp100/exception.c b/dlls/msvcp100/exception.c
index 55b7cd2ea25..f6e3f50d99f 100644
--- a/dlls/msvcp100/exception.c
+++ b/dlls/msvcp100/exception.c
@@ -98,8 +98,7 @@ void * __thiscall MSVCP_type_info_vector_dtor(type_info * _this, unsigned int fl
 
 DEFINE_RTTI_DATA0( type_info, 0, ".?AVtype_info@@" );
 
-DEFINE_THISCALL_WRAPPER(MSVCP_exception_ctor, 8)
-exception* __thiscall MSVCP_exception_ctor(exception *this, const char **name)
+static exception* MSVCP_exception_ctor(exception *this, const char **name)
 {
     TRACE("(%p %s)\n", this, *name);
 
@@ -189,8 +188,7 @@ static const cxx_exception_type exception_cxx_type = {
 /* bad_alloc class data */
 typedef exception bad_alloc;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_bad_alloc_ctor, 8)
-bad_alloc* __thiscall MSVCP_bad_alloc_ctor(bad_alloc *this, const char **name)
+bad_alloc* MSVCP_bad_alloc_ctor(bad_alloc *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
     MSVCP_exception_ctor(this, name);
@@ -273,8 +271,7 @@ typedef struct _logic_error {
     basic_string_char str;
 } logic_error;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_logic_error_ctor, 8)
-logic_error* __thiscall MSVCP_logic_error_ctor(
+static logic_error* MSVCP_logic_error_ctor(
         logic_error *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
@@ -361,8 +358,7 @@ static const cxx_exception_type logic_error_cxx_type = {
 /* length_error class data */
 typedef logic_error length_error;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_length_error_ctor, 8)
-length_error* __thiscall MSVCP_length_error_ctor(
+static length_error* MSVCP_length_error_ctor(
         length_error *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
@@ -410,8 +406,7 @@ static const cxx_exception_type length_error_cxx_type = {
 /* out_of_range class data */
 typedef logic_error out_of_range;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_out_of_range_ctor, 8)
-out_of_range* __thiscall MSVCP_out_of_range_ctor(
+static out_of_range* MSVCP_out_of_range_ctor(
         out_of_range *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
@@ -459,8 +454,7 @@ static const cxx_exception_type out_of_range_cxx_type = {
 /* invalid_argument class data */
 typedef logic_error invalid_argument;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_invalid_argument_ctor, 8)
-invalid_argument* __thiscall MSVCP_invalid_argument_ctor(
+static invalid_argument* MSVCP_invalid_argument_ctor(
         invalid_argument *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
@@ -511,8 +505,7 @@ typedef struct {
     basic_string_char str;
 } runtime_error;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_runtime_error_ctor, 8)
-runtime_error* __thiscall MSVCP_runtime_error_ctor(
+static runtime_error* MSVCP_runtime_error_ctor(
         runtime_error *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
@@ -599,8 +592,7 @@ static const cxx_exception_type runtime_error_cxx_type = {
 /* failure class data */
 typedef runtime_error failure;
 
-DEFINE_THISCALL_WRAPPER(MSVCP_failure_ctor, 8)
-failure* __thiscall MSVCP_failure_ctor(
+static failure* MSVCP_failure_ctor(
         failure *this, const char **name)
 {
     TRACE("%p %s\n", this, *name);
diff --git a/dlls/msvcp100/ios.c b/dlls/msvcp100/ios.c
index 59a5f198d53..de67c933697 100644
--- a/dlls/msvcp100/ios.c
+++ b/dlls/msvcp100/ios.c
@@ -81,28 +81,6 @@ typedef struct {
     FILE *file;
 } basic_filebuf_wchar;
 
-typedef enum {
-    STRINGBUF_allocated = 1,
-    STRINGBUF_no_write = 2,
-    STRINGBUF_no_read = 4,
-    STRINGBUF_append = 8,
-    STRINGBUF_at_end = 16
-} basic_stringbuf_state;
-
-typedef struct {
-    basic_streambuf_char base;
-    char *seekhigh;
-    int state;
-    char allocator; /* empty struct */
-} basic_stringbuf_char;
-
-typedef struct {
-    basic_streambuf_wchar base;
-    wchar_t *seekhigh;
-    int state;
-    char allocator; /* empty struct */
-} basic_stringbuf_wchar;
-
 typedef struct {
     ios_base base;
     basic_streambuf_char *strbuf;
@@ -163,119 +141,6 @@ typedef struct {
      */
 } basic_iostream_wchar;
 
-typedef struct {
-    basic_ostream_char base;
-    basic_filebuf_char filebuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_ofstream_char;
-
-typedef struct {
-    basic_ostream_wchar base;
-    basic_filebuf_wchar filebuf;
-    /* virtual inheritance
-     * basic_ios_wchar basic_ios;
-     */
-} basic_ofstream_wchar;
-
-typedef struct {
-    basic_istream_char base;
-    basic_filebuf_char filebuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_ifstream_char;
-
-typedef struct {
-    basic_istream_wchar base;
-    basic_filebuf_wchar filebuf;
-    /* virtual inheritance
-     * basic_ios_wchar basic_ios;
-     */
-} basic_ifstream_wchar;
-
-typedef struct {
-    basic_iostream_char base;
-    basic_filebuf_char filebuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_fstream_char;
-
-typedef struct {
-    basic_iostream_wchar base;
-    basic_filebuf_wchar filebuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_fstream_wchar;
-
-typedef struct {
-    basic_ostream_char base;
-    basic_stringbuf_char strbuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_ostringstream_char;
-
-typedef struct {
-    basic_ostream_wchar base;
-    basic_stringbuf_wchar strbuf;
-    /* virtual inheritance
-     * basic_ios_wchar basic_ios;
-     */
-} basic_ostringstream_wchar;
-
-typedef struct {
-    basic_istream_char base;
-    basic_stringbuf_char strbuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_istringstream_char;
-
-typedef struct {
-    basic_istream_wchar base;
-    basic_stringbuf_wchar strbuf;
-    /* virtual inheritance
-     * basic_ios_wchar basic_ios;
-     */
-} basic_istringstream_wchar;
-
-typedef struct {
-    basic_iostream_char base;
-    basic_stringbuf_char strbuf;
-    /* virtual inheritance
-     * basic_ios_char basic_ios;
-     */
-} basic_stringstream_char;
-
-typedef struct {
-    basic_iostream_wchar base;
-    basic_stringbuf_wchar strbuf;
-    /* virtual inheritance
-     * basic_ios_wchar basic_ios;
-     */
-} basic_stringstream_wchar;
-
-typedef enum {
-    STRSTATE_Allocated = 1,
-    STRSTATE_Constant = 2,
-    STRSTATE_Dynamic = 4,
-    STRSTATE_Frozen = 8
-} strstreambuf__Strstate;
-
-typedef struct {
-    basic_streambuf_char base;
-    streamsize minsize;
-    char *endsave;
-    char *seekhigh;
-    int strmode;
-    void* (__cdecl *palloc)(MSVCP_size_t);
-    void (__cdecl *pfree)(void*);
-} strstreambuf;
-
 extern const vtable_ptr MSVCP_iosb_vtable;
 
 /* ??_7ios_base@std@@6B@ */
@@ -308,15 +173,6 @@ extern const vtable_ptr MSVCP_basic_filebuf_wchar_vtable;
 /* ??_7?$basic_filebuf@GU?$char_traits@G@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_filebuf_short_vtable;
 
-/* ??_7?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_stringbuf_char_vtable;
-
-/* ??_7?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_stringbuf_wchar_vtable;
-
-/* ??_7?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_stringbuf_short_vtable;
-
 /* ??_8?$basic_ostream@DU?$char_traits@D@std@@@std@@7B@ */
 const int basic_ostream_char_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ostream_char), 8)};
 /* ??_7?$basic_ostream@DU?$char_traits@D@std@@@std@@6B@ */
@@ -365,108 +221,6 @@ extern const vtable_ptr MSVCP_basic_iostream_wchar_vtable;
 /* ??_7?$basic_iostream@GU?$char_traits@G@std@@@std@@6B@ */
 extern const vtable_ptr MSVCP_basic_iostream_short_vtable;
 
-/* ??_8?$basic_ofstream@DU?$char_traits@D@std@@@std@@7B@ */
-const int basic_ofstream_char_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ofstream_char), 8)};
-/* ??_7?$basic_ofstream@DU?$char_traits@D@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ofstream_char_vtable;
-
-/* ??_8?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@7B@ */
-const int basic_ofstream_wchar_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ofstream_wchar), 8)};
-/* ??_7?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ofstream_wchar_vtable;
-
-/* ??_8?$basic_ofstream@GU?$char_traits@G@std@@@std@@7B@ */
-const int basic_ofstream_short_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ofstream_wchar), 8)};
-/* ??_7?$basic_ofstream@GU?$char_traits@G@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ofstream_short_vtable;
-
-/* ??_8?$basic_ifstream@DU?$char_traits@D@std@@@std@@7B@ */
-const int basic_ifstream_char_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ifstream_char), 8)};
-/* ??_7?$basic_ifstream@DU?$char_traits@D@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ifstream_char_vtable;
-
-/* ??_8?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@7B@ */
-const int basic_ifstream_wchar_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ifstream_wchar), 8)};
-/* ??_7?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ifstream_wchar_vtable;
-
-/* ??_8?$basic_ifstream@GU?$char_traits@G@std@@@std@@7B@ */
-const int basic_ifstream_short_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ifstream_wchar), 8)};
-/* ??_7?$basic_ifstream@GU?$char_traits@G@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ifstream_short_vtable;
-
-/* ??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
-const int basic_fstream_char_vbtable1[] = {0, ALIGNED_SIZE(sizeof(basic_fstream_char), 8)};
-/* ??_8?$basic_fstream@DU?$char_traits@D@std@@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
-const int basic_fstream_char_vbtable2[] = {0, ALIGNED_SIZE(sizeof(basic_fstream_char), 8)-FIELD_OFFSET(basic_fstream_char, base.base2)};
-/* ??_7?$basic_fstream@DU?$char_traits@D@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_fstream_char_vtable;
-
-/* ??_8?$basic_fstream@_WU?$char_traits@_W@std@@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
-/* ??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
-const int basic_fstream_wchar_vbtable1[] = {0, ALIGNED_SIZE(sizeof(basic_fstream_wchar), 8)};
-/* ??_8?$basic_fstream@_WU?$char_traits@_W@std@@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
-/* ??_8?$basic_fstream@GU?$char_traits@G@std@@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
-const int basic_fstream_wchar_vbtable2[] = {0, ALIGNED_SIZE(sizeof(basic_fstream_wchar), 8)-FIELD_OFFSET(basic_fstream_wchar, base.base2)};
-/* ??_7?$basic_fstream@_WU?$char_traits@_W@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_fstream_wchar_vtable;
-/* ??_7?$basic_fstream@GU?$char_traits@G@std@@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_fstream_short_vtable;
-
-/* ??_8?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ */
-const int basic_ostringstream_char_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ostringstream_char), 8)};
-/* ??_7?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ostringstream_char_vtable;
-
-/* ??_8?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B@ */
-const int basic_ostringstream_wchar_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ostringstream_wchar), 8)};
-/* ??_7?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ostringstream_wchar_vtable;
-
-/* ??_8?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B@ */
-const int basic_ostringstream_short_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_ostringstream_wchar), 8)};
-/* ??_7?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_ostringstream_short_vtable;
-
-/* ??_8?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B@ */
-const int basic_istringstream_char_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_istringstream_char), 8)};
-/* ??_7?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_istringstream_char_vtable;
-
-/* ??_8?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B@ */
-const int basic_istringstream_wchar_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_istringstream_wchar), 8)};
-/* ??_7?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_istringstream_wchar_vtable;
-
-/* ??_8?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B@ */
-const int basic_istringstream_short_vbtable[] = {0, ALIGNED_SIZE(sizeof(basic_istringstream_wchar), 8)};
-/* ??_7?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_istringstream_short_vtable;
-
-/* ??_8?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B?$basic_istream@DU?$char_traits@D@std@@@1@@ */
-const int basic_stringstream_char_vbtable1[] = {0, ALIGNED_SIZE(sizeof(basic_stringstream_char), 8)};
-/* ??_8?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@7B?$basic_ostream@DU?$char_traits@D@std@@@1@@ */
-const int basic_stringstream_char_vbtable2[] = {0, ALIGNED_SIZE(sizeof(basic_stringstream_char), 8)-FIELD_OFFSET(basic_stringstream_char, base.base2)};
-/* ??_7?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_stringstream_char_vtable;
-
-/* ??_8?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B?$basic_istream@_WU?$char_traits@_W@std@@@1@@ */
-const int basic_stringstream_wchar_vbtable1[] = {0, ALIGNED_SIZE(sizeof(basic_stringstream_wchar), 8)};
-/* ??_8?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@7B?$basic_ostream@_WU?$char_traits@_W@std@@@1@@ */
-const int basic_stringstream_wchar_vbtable2[] = {0, ALIGNED_SIZE(sizeof(basic_stringstream_wchar), 8)-FIELD_OFFSET(basic_stringstream_wchar, base.base2)};
-/* ??_7?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_stringstream_wchar_vtable;
-
-/* ??_8?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B?$basic_istream@GU?$char_traits@G@std@@@1@@ */
-const int basic_stringstream_short_vbtable1[] = {0, ALIGNED_SIZE(sizeof(basic_stringstream_wchar), 8)};
-/* ??_8?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@7B?$basic_ostream@GU?$char_traits@G@std@@@1@@ */
-const int basic_stringstream_short_vbtable2[] = {0, ALIGNED_SIZE(sizeof(basic_stringstream_wchar), 8)-FIELD_OFFSET(basic_stringstream_wchar, base.base2)};
-/* ??_7?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@6B@ */
-extern const vtable_ptr MSVCP_basic_stringstream_short_vtable;
-
-/* ??_7strstreambuf@std@@6B */
-extern const vtable_ptr MSVCP_strstreambuf_vtable;
-
 DEFINE_RTTI_DATA0(iosb, 0, ".?AV?$_Iosb@H@std@@");
 DEFINE_RTTI_DATA1(ios_base, 0, &iosb_rtti_base_descriptor, ".?AV?$_Iosb@H@std@@");
 DEFINE_RTTI_DATA2(basic_ios_char, 0, &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
@@ -487,12 +241,6 @@ DEFINE_RTTI_DATA1(basic_filebuf_wchar, 0, &basic_streambuf_wchar_rtti_base_descr
         ".?AV?$basic_filebuf@GU?$char_traits@G@std@@@std@@");
 DEFINE_RTTI_DATA1(basic_filebuf_short, 0, &basic_streambuf_short_rtti_base_descriptor,
         ".?AV?$basic_filebuf@DU?$char_traits@D@std@@@std@@");
-DEFINE_RTTI_DATA1(basic_stringbuf_char, 0, &basic_streambuf_char_rtti_base_descriptor,
-        ".?AV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
-DEFINE_RTTI_DATA1(basic_stringbuf_wchar, 0, &basic_streambuf_wchar_rtti_base_descriptor,
-        ".?AV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
-DEFINE_RTTI_DATA1(basic_stringbuf_short, 0, &basic_streambuf_short_rtti_base_descriptor,
-        ".?AV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
 DEFINE_RTTI_DATA3(basic_ostream_char, sizeof(basic_ostream_char), &basic_ios_char_rtti_base_descriptor,
         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
         ".?AV?$basic_ostream@DU?$char_traits@D@std@@@std@@");
@@ -529,92 +277,6 @@ DEFINE_RTTI_DATA8(basic_iostream_short, sizeof(basic_iostream_wchar),
         &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
         &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
         ".?AV?$basic_iostream@GU?$char_traits@G@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ofstream_char, sizeof(basic_ofstream_char),
-        &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ofstream@DU?$char_traits@D@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ofstream_wchar, sizeof(basic_ofstream_wchar),
-        &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ofstream_short, sizeof(basic_ofstream_wchar),
-        &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ofstream@GU?$char_traits@G@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ifstream_char, sizeof(basic_ifstream_char),
-        &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ifstream@DU?$char_traits@D@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ifstream_wchar, sizeof(basic_ifstream_wchar),
-        &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ifstream_short, sizeof(basic_ifstream_wchar),
-        &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ifstream@GU?$char_traits@G@std@@@std@@");
-DEFINE_RTTI_DATA8(basic_fstream_char, sizeof(basic_fstream_char),
-        &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_fstream@DU?$char_traits@D@std@@@std@@");
-DEFINE_RTTI_DATA8(basic_fstream_wchar, sizeof(basic_fstream_wchar),
-        &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_fstream@_WU?$char_traits@_W@std@@@std@@");
-DEFINE_RTTI_DATA8(basic_fstream_short, sizeof(basic_fstream_wchar),
-        &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_fstream@GU?$char_traits@G@std@@@std@@");
-DEFINE_RTTI_DATA4(basic_ostringstream_char, sizeof(basic_ostringstream_char),
-        &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
-DEFINE_RTTI_DATA4(basic_ostringstream_wchar, sizeof(basic_ostringstream_wchar),
-        &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
-DEFINE_RTTI_DATA4(basic_ostringstream_short, sizeof(basic_ostringstream_wchar),
-        &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
-DEFINE_RTTI_DATA4(basic_istringstream_char, sizeof(basic_istringstream_char),
-        &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
-DEFINE_RTTI_DATA4(basic_istringstream_wchar, sizeof(basic_istringstream_wchar),
-        &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
-DEFINE_RTTI_DATA4(basic_istringstream_short, sizeof(basic_istringstream_wchar),
-        &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
-DEFINE_RTTI_DATA8(basic_stringstream_char, sizeof(basic_stringstream_char),
-        &basic_istream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        &basic_ostream_char_rtti_base_descriptor, &basic_ios_char_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@");
-DEFINE_RTTI_DATA8(basic_stringstream_wchar, sizeof(basic_stringstream_wchar),
-        &basic_istream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        &basic_ostream_wchar_rtti_base_descriptor, &basic_ios_wchar_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@");
-DEFINE_RTTI_DATA8(basic_stringstream_short, sizeof(basic_stringstream_wchar),
-        &basic_istream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        &basic_ostream_short_rtti_base_descriptor, &basic_ios_short_rtti_base_descriptor,
-        &ios_base_rtti_base_descriptor, &iosb_rtti_base_descriptor,
-        ".?AV?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@");
-DEFINE_RTTI_DATA1(strstreambuf, sizeof(strstreambuf),
-        &basic_streambuf_char_rtti_base_descriptor, ".?AVstrstreambuf@std@@");
 
 #ifndef __GNUC__
 void __asm_dummy_vtables(void) {
@@ -725,54 +387,6 @@ void __asm_dummy_vtables(void) {
             VTABLE_ADD_FUNC(basic_filebuf_short_setbuf)
             VTABLE_ADD_FUNC(basic_filebuf_wchar_sync)
             VTABLE_ADD_FUNC(basic_filebuf_short_imbue));
-    __ASM_VTABLE(basic_stringbuf_char,
-            VTABLE_ADD_FUNC(basic_stringbuf_char_vector_dtor)
-            VTABLE_ADD_FUNC(basic_streambuf_char__Lock)
-            VTABLE_ADD_FUNC(basic_streambuf_char__Unlock)
-            VTABLE_ADD_FUNC(basic_stringbuf_char_overflow)
-            VTABLE_ADD_FUNC(basic_stringbuf_char_pbackfail)
-            VTABLE_ADD_FUNC(basic_streambuf_char_showmanyc)
-            VTABLE_ADD_FUNC(basic_stringbuf_char_underflow)
-            VTABLE_ADD_FUNC(basic_streambuf_char_uflow)
-            VTABLE_ADD_FUNC(basic_streambuf_char_xsgetn)
-            VTABLE_ADD_FUNC(basic_streambuf_char_xsputn)
-            VTABLE_ADD_FUNC(basic_stringbuf_char_seekoff)
-            VTABLE_ADD_FUNC(basic_stringbuf_char_seekpos)
-            VTABLE_ADD_FUNC(basic_streambuf_char_setbuf)
-            VTABLE_ADD_FUNC(basic_streambuf_char_sync)
-            VTABLE_ADD_FUNC(basic_streambuf_char_imbue));
-    __ASM_VTABLE(basic_stringbuf_wchar,
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_vector_dtor)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar__Lock)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar__Unlock)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_overflow)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_pbackfail)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_underflow)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekoff)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekpos)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_setbuf)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_sync)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_imbue));
-    __ASM_VTABLE(basic_stringbuf_short,
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_vector_dtor)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar__Lock)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar__Unlock)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_overflow)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_pbackfail)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_showmanyc)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_underflow)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_uflow)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_xsgetn)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_xsputn)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekoff)
-            VTABLE_ADD_FUNC(basic_stringbuf_wchar_seekpos)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_setbuf)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_sync)
-            VTABLE_ADD_FUNC(basic_streambuf_wchar_imbue));
     __ASM_VTABLE(basic_ostream_char,
             VTABLE_ADD_FUNC(basic_ostream_char_vector_dtor));
     __ASM_VTABLE(basic_ostream_wchar,
@@ -791,58 +405,6 @@ void __asm_dummy_vtables(void) {
             VTABLE_ADD_FUNC(basic_iostream_wchar_vector_dtor));
     __ASM_VTABLE(basic_iostream_short,
             VTABLE_ADD_FUNC(basic_iostream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_ofstream_char,
-            VTABLE_ADD_FUNC(basic_ofstream_char_vector_dtor));
-    __ASM_VTABLE(basic_ofstream_wchar,
-            VTABLE_ADD_FUNC(basic_ofstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_ofstream_short,
-            VTABLE_ADD_FUNC(basic_ofstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_ifstream_char,
-            VTABLE_ADD_FUNC(basic_ifstream_char_vector_dtor));
-    __ASM_VTABLE(basic_ifstream_wchar,
-            VTABLE_ADD_FUNC(basic_ifstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_ifstream_short,
-            VTABLE_ADD_FUNC(basic_ifstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_fstream_char,
-            VTABLE_ADD_FUNC(basic_fstream_char_vector_dtor));
-    __ASM_VTABLE(basic_fstream_wchar,
-            VTABLE_ADD_FUNC(basic_fstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_fstream_short,
-            VTABLE_ADD_FUNC(basic_fstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_ostringstream_char,
-            VTABLE_ADD_FUNC(basic_ostringstream_char_vector_dtor));
-    __ASM_VTABLE(basic_ostringstream_wchar,
-            VTABLE_ADD_FUNC(basic_ostringstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_ostringstream_short,
-            VTABLE_ADD_FUNC(basic_ostringstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_istringstream_char,
-            VTABLE_ADD_FUNC(basic_istringstream_char_vector_dtor));
-    __ASM_VTABLE(basic_istringstream_wchar,
-            VTABLE_ADD_FUNC(basic_istringstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_istringstream_short,
-            VTABLE_ADD_FUNC(basic_istringstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_stringstream_char,
-            VTABLE_ADD_FUNC(basic_stringstream_char_vector_dtor));
-    __ASM_VTABLE(basic_stringstream_wchar,
-            VTABLE_ADD_FUNC(basic_stringstream_wchar_vector_dtor));
-    __ASM_VTABLE(basic_stringstream_short,
-            VTABLE_ADD_FUNC(basic_stringstream_wchar_vector_dtor));
-    __ASM_VTABLE(strstreambuf,
-            VTABLE_ADD_FUNC(strstreambuf_vector_dtor)
-            VTABLE_ADD_FUNC(basic_streambuf_char__Lock)
-            VTABLE_ADD_FUNC(basic_streambuf_char__Unlock)
-            VTABLE_ADD_FUNC(strstreambuf_overflow)
-            VTABLE_ADD_FUNC(strstreambuf_pbackfail)
-            VTABLE_ADD_FUNC(basic_streambuf_char_showmanyc)
-            VTABLE_ADD_FUNC(strstreambuf_underflow)
-            VTABLE_ADD_FUNC(basic_streambuf_char_uflow)
-            VTABLE_ADD_FUNC(basic_streambuf_char_xsgetn)
-            VTABLE_ADD_FUNC(basic_streambuf_char_xsputn)
-            VTABLE_ADD_FUNC(strstreambuf_seekoff)
-            VTABLE_ADD_FUNC(strstreambuf_seekpos)
-            VTABLE_ADD_FUNC(basic_streambuf_char_setbuf)
-            VTABLE_ADD_FUNC(basic_streambuf_char_sync)
-            VTABLE_ADD_FUNC(basic_streambuf_char_imbue));
 #ifndef __GNUC__
 }
 #endif
@@ -1075,8 +637,7 @@ int __thiscall basic_streambuf_char_uflow(basic_streambuf_char *this)
 
 /* ?_Xsgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MAEHPADIH@Z */
 /* ?_Xsgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@MEAA_JPEAD_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Xsgetn_s, 20)
-streamsize __thiscall basic_streambuf_char__Xsgetn_s(basic_streambuf_char *this, char *ptr, MSVCP_size_t size, streamsize count)
+static streamsize basic_streambuf_char__Xsgetn_s(basic_streambuf_char *this, char *ptr, MSVCP_size_t size, streamsize count)
 {
     streamsize copied, chunk;
     int c;
@@ -1108,8 +669,7 @@ streamsize __thiscall basic_streambuf_char__Xsgetn_s(basic_streambuf_char *this,
 
 /* ?_Sgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPADIH@Z */
 /* ?_Sgetn_s@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_streambuf_char__Sgetn_s, 20)
-streamsize __thiscall basic_streambuf_char__Sgetn_s(basic_streambuf_char *this, char *ptr, MSVCP_size_t size, streamsize count)
+static streamsize basic_streambuf_char__Sgetn_s(basic_streambuf_char *this, char *ptr, MSVCP_size_t size, streamsize count)
 {
     TRACE("(%p %p %lu %s)\n", this, ptr, size, wine_dbgstr_longlong(count));
     return basic_streambuf_char__Xsgetn_s(this, ptr, size, count);
@@ -1813,8 +1373,7 @@ unsigned short __thiscall basic_streambuf_wchar_uflow(basic_streambuf_wchar *thi
 /* ?_Xsgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@MEAA_JPEA_W_K_J@Z */
 /* ?_Xsgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MAEHPAGIH@Z */
 /* ?_Xsgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@MEAA_JPEAG_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Xsgetn_s, 20)
-streamsize __thiscall basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count)
+static streamsize basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count)
 {
     streamsize copied, chunk;
     unsigned short c;
@@ -1848,8 +1407,7 @@ streamsize __thiscall basic_streambuf_wchar__Xsgetn_s(basic_streambuf_wchar *thi
 /* ?_Sgetn_s@?$basic_streambuf@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_K_J@Z */
 /* ?_Sgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QAEHPAGIH@Z */
 /* ?_Sgetn_s@?$basic_streambuf@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_streambuf_wchar__Sgetn_s, 20)
-streamsize __thiscall basic_streambuf_wchar__Sgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count)
+static streamsize basic_streambuf_wchar__Sgetn_s(basic_streambuf_wchar *this, wchar_t *ptr, MSVCP_size_t size, streamsize count)
 {
     TRACE("(%p %p %lu %s)\n", this, ptr, size, wine_dbgstr_longlong(count));
     return basic_streambuf_wchar__Xsgetn_s(this, ptr, size, count);
@@ -2351,8 +1909,7 @@ int basic_filebuf_char__Init__Stinit = 0;
 
 /* ?_Init@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@12@@Z */
 /* ?_Init@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char__Init, 12)
-void __thiscall basic_filebuf_char__Init(basic_filebuf_char *this, FILE *file, basic_filebuf__Initfl which)
+static void basic_filebuf_char__Init(basic_filebuf_char *this, FILE *file, basic_filebuf__Initfl which)
 {
     TRACE("(%p %p %d)\n", this, file, which);
 
@@ -2370,8 +1927,7 @@ void __thiscall basic_filebuf_char__Init(basic_filebuf_char *this, FILE *file, b
 
 /* ?_Initcvt@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAEXPAV?$codecvt@DDH@2@@Z */
 /* ?_Initcvt@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$codecvt@DDH@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char__Initcvt, 8)
-void __thiscall basic_filebuf_char__Initcvt(basic_filebuf_char *this, codecvt_char *cvt)
+static void basic_filebuf_char__Initcvt(basic_filebuf_char *this, codecvt_char *cvt)
 {
     TRACE("(%p %p)\n", this, cvt);
 
@@ -2385,8 +1941,7 @@ void __thiscall basic_filebuf_char__Initcvt(basic_filebuf_char *this, codecvt_ch
 
 /* ?_Endwrite@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IAE_NXZ */
 /* ?_Endwrite@?$basic_filebuf@DU?$char_traits@D@std@@@std@@IEAA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char__Endwrite, 4)
-MSVCP_bool __thiscall basic_filebuf_char__Endwrite(basic_filebuf_char *this)
+static MSVCP_bool basic_filebuf_char__Endwrite(basic_filebuf_char *this)
 {
     TRACE("(%p)\n", this);
 
@@ -2426,8 +1981,7 @@ MSVCP_bool __thiscall basic_filebuf_char__Endwrite(basic_filebuf_char *this)
 
 /* ?close@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@XZ */
 /* ?close@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@XZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_close, 4)
-basic_filebuf_char* __thiscall basic_filebuf_char_close(basic_filebuf_char *this)
+static basic_filebuf_char* basic_filebuf_char_close(basic_filebuf_char *this)
 {
     basic_filebuf_char *ret = this;
 
@@ -2448,8 +2002,7 @@ basic_filebuf_char* __thiscall basic_filebuf_char_close(basic_filebuf_char *this
 
 /* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
 /* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_ctor_file, 8)
-basic_filebuf_char* __thiscall basic_filebuf_char_ctor_file(basic_filebuf_char *this, FILE *file)
+static basic_filebuf_char* basic_filebuf_char_ctor_file(basic_filebuf_char *this, FILE *file)
 {
     TRACE("(%p %p)\n", this, file);
 
@@ -2460,30 +2013,9 @@ basic_filebuf_char* __thiscall basic_filebuf_char_ctor_file(basic_filebuf_char *
     return this;
 }
 
-/* ??_F?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_F?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_ctor, 4)
-basic_filebuf_char* __thiscall basic_filebuf_char_ctor(basic_filebuf_char *this)
-{
-    return basic_filebuf_char_ctor_file(this, NULL);
-}
-
-/* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_ctor_uninitialized, 8)
-basic_filebuf_char* __thiscall basic_filebuf_char_ctor_uninitialized(basic_filebuf_char *this, int uninitialized)
-{
-    TRACE("(%p %d)\n", this, uninitialized);
-
-    basic_streambuf_char_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_filebuf_char_vtable;
-    return this;
-}
-
 /* ??1?$basic_filebuf@DU?$char_traits@D@std@@@std@@UAE@XZ */
 /* ??1?$basic_filebuf@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_dtor, 4)
-void __thiscall basic_filebuf_char_dtor(basic_filebuf_char *this)
+static void basic_filebuf_char_dtor(basic_filebuf_char *this)
 {
     TRACE("(%p)\n", this);
 
@@ -2514,8 +2046,7 @@ basic_filebuf_char* __thiscall basic_filebuf_char_vector_dtor(basic_filebuf_char
 
 /* ?is_open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QBE_NXZ */
 /* ?is_open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_is_open, 4)
-MSVCP_bool __thiscall basic_filebuf_char_is_open(const basic_filebuf_char *this)
+static MSVCP_bool basic_filebuf_char_is_open(const basic_filebuf_char *this)
 {
     TRACE("(%p)\n", this);
     return this->file != NULL;
@@ -2591,60 +2122,6 @@ FILE* __cdecl _Fiopen(const char *name, int mode, int prot)
     return _Fiopen_wchar(nameW, mode, prot);
 }
 
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PB_WHH@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEB_WHH@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBGHH@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBGHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_open_wchar, 16)
-basic_filebuf_char* __thiscall basic_filebuf_char_open_wchar(basic_filebuf_char *this, const wchar_t *name, int mode, int prot)
-{
-    FILE *f = NULL;
-
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
-
-    if(basic_filebuf_char_is_open(this))
-        return NULL;
-
-    if(!(f = _Fiopen_wchar(name, mode, prot)))
-        return NULL;
-
-    basic_filebuf_char__Init(this, f, INITFL_open);
-    basic_filebuf_char__Initcvt(this, codecvt_char_use_facet(this->base.loc));
-    return this;
-}
-
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PB_WI@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEB_WI@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBGI@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBGI@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_open_wchar_mode, 12)
-basic_filebuf_char* __thiscall basic_filebuf_char_open_wchar_mode(basic_filebuf_char *this, const wchar_t *name, unsigned int mode)
-{
-    return basic_filebuf_char_open_wchar(this, name, mode, SH_DENYNO);
-}
-
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBDHH@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_open, 16)
-basic_filebuf_char* __thiscall basic_filebuf_char_open(basic_filebuf_char *this, const char *name, int mode, int prot)
-{
-    wchar_t nameW[FILENAME_MAX];
-
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
-
-    if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
-        return NULL;
-    return basic_filebuf_char_open_wchar(this, nameW, mode, prot);
-}
-
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QAEPAV12@PBDI@Z */
-/* ?open@?$basic_filebuf@DU?$char_traits@D@std@@@std@@QEAAPEAV12@PEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_char_open_mode, 12)
-basic_filebuf_char* __thiscall basic_filebuf_char_open_mode(basic_filebuf_char *this, const char *name, unsigned int mode)
-{
-    return basic_filebuf_char_open(this, name, mode, SH_DENYNO);
-}
-
 /* ?overflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MAEHH@Z */
 /* ?overflow@?$basic_filebuf@DU?$char_traits@D@std@@@std@@MEAAHH@Z */
 DEFINE_THISCALL_WRAPPER(basic_filebuf_char_overflow, 8)
@@ -2904,8 +2381,7 @@ int basic_filebuf_short__Init__Stinit = 0;
 
 /* ?_Init@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@12@@Z */
 /* ?_Init@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar__Init, 12)
-void __thiscall basic_filebuf_wchar__Init(basic_filebuf_wchar *this, FILE *file, basic_filebuf__Initfl which)
+static void basic_filebuf_wchar__Init(basic_filebuf_wchar *this, FILE *file, basic_filebuf__Initfl which)
 {
     TRACE("(%p %p %d)\n", this, file, which);
 
@@ -2920,8 +2396,7 @@ void __thiscall basic_filebuf_wchar__Init(basic_filebuf_wchar *this, FILE *file,
 
 /* ?_Init@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAEXPAU_iobuf@@W4_Initfl@12@@Z */
 /* ?_Init@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAAXPEAU_iobuf@@W4_Initfl@12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short__Init, 12)
-void __thiscall basic_filebuf_short__Init(basic_filebuf_wchar *this, FILE *file, basic_filebuf__Initfl which)
+static void basic_filebuf_short__Init(basic_filebuf_wchar *this, FILE *file, basic_filebuf__Initfl which)
 {
     TRACE("(%p %p %d)\n", this, file, which);
 
@@ -2938,8 +2413,7 @@ void __thiscall basic_filebuf_short__Init(basic_filebuf_wchar *this, FILE *file,
 /* ?_Initcvt@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$codecvt@_WDH@2@@Z */
 /* ?_Initcvt@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAEXPAV?$codecvt@GDH@2@@Z */
 /* ?_Initcvt@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$codecvt@GDH@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar__Initcvt, 8)
-void __thiscall basic_filebuf_wchar__Initcvt(basic_filebuf_wchar *this, codecvt_wchar *cvt)
+static void basic_filebuf_wchar__Initcvt(basic_filebuf_wchar *this, codecvt_wchar *cvt)
 {
     TRACE("(%p %p)\n", this, cvt);
 
@@ -2955,8 +2429,7 @@ void __thiscall basic_filebuf_wchar__Initcvt(basic_filebuf_wchar *this, codecvt_
 /* ?_Endwrite@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@IEAA_NXZ */
 /* ?_Endwrite@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IAE_NXZ */
 /* ?_Endwrite@?$basic_filebuf@GU?$char_traits@G@std@@@std@@IEAA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar__Endwrite, 4)
-MSVCP_bool __thiscall basic_filebuf_wchar__Endwrite(basic_filebuf_wchar *this)
+static MSVCP_bool basic_filebuf_wchar__Endwrite(basic_filebuf_wchar *this)
 {
     TRACE("(%p)\n", this);
 
@@ -2997,8 +2470,7 @@ MSVCP_bool __thiscall basic_filebuf_wchar__Endwrite(basic_filebuf_wchar *this)
 /* ?close@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@XZ */
 /* ?close@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@XZ */
 /* ?close@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@XZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_close, 4)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_close(basic_filebuf_wchar *this)
+static basic_filebuf_wchar* basic_filebuf_wchar_close(basic_filebuf_wchar *this)
 {
     basic_filebuf_wchar *ret = this;
 
@@ -3019,8 +2491,7 @@ basic_filebuf_wchar* __thiscall basic_filebuf_wchar_close(basic_filebuf_wchar *t
 
 /* ??0?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
 /* ??0?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_ctor_file, 8)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_ctor_file(basic_filebuf_wchar *this, FILE *file)
+static basic_filebuf_wchar* basic_filebuf_wchar_ctor_file(basic_filebuf_wchar *this, FILE *file)
 {
     TRACE("(%p %p)\n", this, file);
 
@@ -3033,8 +2504,7 @@ basic_filebuf_wchar* __thiscall basic_filebuf_wchar_ctor_file(basic_filebuf_wcha
 
 /* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
 /* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_ctor_file, 8)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor_file(basic_filebuf_wchar *this, FILE *file)
+static basic_filebuf_wchar* basic_filebuf_short_ctor_file(basic_filebuf_wchar *this, FILE *file)
 {
     TRACE("(%p %p)\n", this, file);
 
@@ -3045,52 +2515,11 @@ basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor_file(basic_filebuf_wcha
     return this;
 }
 
-/* ??_F?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_F?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_ctor, 4)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_ctor(basic_filebuf_wchar *this)
-{
-    return basic_filebuf_wchar_ctor_file(this, NULL);
-}
-
-/* ??_F?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_F?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_ctor, 4)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor(basic_filebuf_wchar *this)
-{
-    return basic_filebuf_short_ctor_file(this, NULL);
-}
-
-/* ??0?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_ctor_uninitialized, 8)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_ctor_uninitialized(basic_filebuf_wchar *this, int uninitialized)
-{
-    TRACE("(%p %d)\n", this, uninitialized);
-
-    basic_streambuf_wchar_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_filebuf_wchar_vtable;
-    return this;
-}
-
-/* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_ctor_uninitialized, 8)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_ctor_uninitialized(basic_filebuf_wchar *this, int uninitialized)
-{
-    TRACE("(%p %d)\n", this, uninitialized);
-
-    basic_streambuf_short_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_filebuf_short_vtable;
-    return this;
-}
-
 /* ??1?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
 /* ??1?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
 /* ??1?$basic_filebuf@GU?$char_traits@G@std@@@std@@UAE@XZ */
 /* ??1?$basic_filebuf@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_dtor, 4)
-void __thiscall basic_filebuf_wchar_dtor(basic_filebuf_wchar *this)
+static void basic_filebuf_wchar_dtor(basic_filebuf_wchar *this)
 {
     TRACE("(%p)\n", this);
 
@@ -3123,149 +2552,40 @@ basic_filebuf_wchar* __thiscall basic_filebuf_wchar_vector_dtor(basic_filebuf_wc
 /* ?is_open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
 /* ?is_open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QBE_NXZ */
 /* ?is_open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_is_open, 4)
-MSVCP_bool __thiscall basic_filebuf_wchar_is_open(const basic_filebuf_wchar *this)
+static MSVCP_bool basic_filebuf_wchar_is_open(const basic_filebuf_wchar *this)
 {
     TRACE("(%p)\n", this);
     return this->file != NULL;
 }
 
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PB_WHH@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEB_WHH@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PBGHH@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEBGHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_open_wchar, 16)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_open_wchar(basic_filebuf_wchar *this, const wchar_t *name, int mode, int prot)
+/* ?overflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z */
+/* ?overflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z */
+/* ?overflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEGG@Z */
+/* ?overflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z */
+DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_overflow, 8)
+unsigned short __thiscall basic_filebuf_wchar_overflow(basic_filebuf_wchar *this, unsigned short c)
 {
-    FILE *f = NULL;
-
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
-
-    if(basic_filebuf_wchar_is_open(this))
-        return NULL;
-
-    if(!(f = _Fiopen_wchar(name, mode, prot)))
-        return NULL;
+    char buf[8], *dyn_buf, *to_next;
+    wchar_t ch = c;
+    const wchar_t *from_next;
+    int max_size;
+    unsigned short ret;
 
-    basic_filebuf_wchar__Init(this, f, INITFL_open);
-    basic_filebuf_wchar__Initcvt(this, codecvt_wchar_use_facet(this->base.loc));
-    return this;
-}
 
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PB_WHH@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEB_WHH@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBGHH@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBGHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_open_wchar, 16)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_open_wchar(basic_filebuf_wchar *this, const wchar_t *name, int mode, int prot)
-{
-    FILE *f = NULL;
+    TRACE("(%p %d)\n", this, c);
 
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
+    if(!basic_filebuf_wchar_is_open(this))
+        return WEOF;
+    if(c == WEOF)
+        return !c;
 
-    if(basic_filebuf_wchar_is_open(this))
-        return NULL;
+    if(!this->cvt)
+        return fwrite(&ch, sizeof(wchar_t), 1, this->file) ? c : WEOF;
 
-    if(!(f = _Fiopen_wchar(name, mode, prot)))
-        return NULL;
-
-    basic_filebuf_short__Init(this, f, INITFL_open);
-    basic_filebuf_wchar__Initcvt(this, codecvt_short_use_facet(this->base.loc));
-    return this;
-}
-
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PB_WI@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEB_WI@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PBGI@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEBGI@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_open_wchar_mode, 12)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_open_wchar_mode(basic_filebuf_wchar *this, const wchar_t *name, unsigned int mode)
-{
-    return basic_filebuf_wchar_open_wchar(this, name, mode, SH_DENYNO);
-}
-
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PB_WI@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEB_WI@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBGI@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBGI@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_open_wchar_mode, 12)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_open_wchar_mode(basic_filebuf_wchar *this, const wchar_t *name, unsigned int mode)
-{
-    return basic_filebuf_short_open_wchar(this, name, mode, SH_DENYNO);
-}
-
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PBDHH@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_open, 16)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_open(basic_filebuf_wchar *this, const char *name, int mode, int prot)
-{
-    wchar_t nameW[FILENAME_MAX];
-
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
-
-    if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
-        return NULL;
-    return basic_filebuf_wchar_open_wchar(this, nameW, mode, prot);
-}
-
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBDHH@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_open, 16)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_open(basic_filebuf_wchar *this, const char *name, int mode, int prot)
-{
-    wchar_t nameW[FILENAME_MAX];
-
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
-
-    if(mbstowcs_s(NULL, nameW, FILENAME_MAX, name, FILENAME_MAX-1) != 0)
-        return NULL;
-    return basic_filebuf_short_open_wchar(this, nameW, mode, prot);
-}
-
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QAEPAV12@PBDI@Z */
-/* ?open@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@QEAAPEAV12@PEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_open_mode, 12)
-basic_filebuf_wchar* __thiscall basic_filebuf_wchar_open_mode(basic_filebuf_wchar *this, const char *name, unsigned int mode)
-{
-    return basic_filebuf_wchar_open(this, name, mode, SH_DENYNO);
-}
-
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QAEPAV12@PBDI@Z */
-/* ?open@?$basic_filebuf@GU?$char_traits@G@std@@@std@@QEAAPEAV12@PEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_short_open_mode, 12)
-basic_filebuf_wchar* __thiscall basic_filebuf_short_open_mode(basic_filebuf_wchar *this, const char *name, unsigned int mode)
-{
-    return basic_filebuf_short_open(this, name, mode, SH_DENYNO);
-}
-
-/* ?overflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MAEGG@Z */
-/* ?overflow@?$basic_filebuf@_WU?$char_traits@_W@std@@@std@@MEAAGG@Z */
-/* ?overflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MAEGG@Z */
-/* ?overflow@?$basic_filebuf@GU?$char_traits@G@std@@@std@@MEAAGG@Z */
-DEFINE_THISCALL_WRAPPER(basic_filebuf_wchar_overflow, 8)
-unsigned short __thiscall basic_filebuf_wchar_overflow(basic_filebuf_wchar *this, unsigned short c)
-{
-    char buf[8], *dyn_buf, *to_next;
-    wchar_t ch = c;
-    const wchar_t *from_next;
-    int max_size;
-    unsigned short ret;
-
-
-    TRACE("(%p %d)\n", this, c);
-
-    if(!basic_filebuf_wchar_is_open(this))
-        return WEOF;
-    if(c == WEOF)
-        return !c;
-
-    if(!this->cvt)
-        return fwrite(&ch, sizeof(wchar_t), 1, this->file) ? c : WEOF;
-
-    from_next = &ch;
-    do {
-        ret = codecvt_wchar_out(this->cvt, &this->state, from_next, &ch+1,
-                &from_next, buf, buf+sizeof(buf), &to_next);
+    from_next = &ch;
+    do {
+        ret = codecvt_wchar_out(this->cvt, &this->state, from_next, &ch+1,
+                &from_next, buf, buf+sizeof(buf), &to_next);
 
         switch(ret) {
         case CODECVT_partial:
@@ -3544,146 +2864,97 @@ void __thiscall basic_filebuf_short_imbue(basic_filebuf_wchar *this, const local
     basic_filebuf_wchar__Initcvt(this, codecvt_short_use_facet(loc));
 }
 
-/* ?_Getstate@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAEHH@Z */
-/* ?_Getstate@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char__Getstate, 8)
-int __thiscall basic_stringbuf_char__Getstate(basic_stringbuf_char *this, IOSB_openmode mode)
-{
-    int state = 0;
-
-    if(!(mode & OPENMODE_in))
-        state |= STRINGBUF_no_read;
-
-    if(!(mode & OPENMODE_out))
-        state |= STRINGBUF_no_write;
-
-    if(mode & OPENMODE_ate)
-        state |= STRINGBUF_at_end;
-
-    if(mode & OPENMODE_app)
-        state |= STRINGBUF_append;
-
-    return state;
-}
-
-/* ?_Init@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXPBDIH@Z */
-/* ?_Init@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXPEBD_KH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char__Init, 16)
-void __thiscall basic_stringbuf_char__Init(basic_stringbuf_char *this, const char *str, MSVCP_size_t count, int state)
+/* ??0ios_base@std@@IAE@XZ */
+/* ??0ios_base@std@@IEAA@XZ */
+DEFINE_THISCALL_WRAPPER(ios_base_ctor, 4)
+ios_base* __thiscall ios_base_ctor(ios_base *this)
 {
-    TRACE("(%p, %p, %lu, %d)\n", this, str, count, state);
-
-    basic_streambuf_char__Init_empty(&this->base);
-
-    this->state = state;
-    this->seekhigh = NULL;
-
-    if(count && str) {
-        char *buf = MSVCRT_operator_new(count);
-        if(!buf) {
-            ERR("Out of memory\n");
-            throw_exception(EXCEPTION_BAD_ALLOC, NULL);
-        }
-
-        memcpy(buf, str, count);
-        this->seekhigh = buf + count;
-
-        this->state |= STRINGBUF_allocated;
-
-        if(!(state & STRINGBUF_no_read))
-            basic_streambuf_char_setg(&this->base, buf, buf, buf + count);
-
-        if(!(state & STRINGBUF_no_write)) {
-            basic_streambuf_char_setp_next(&this->base, buf, (state & STRINGBUF_at_end) ? buf + count : buf, buf + count);
-
-            if(!basic_streambuf_char_gptr(&this->base))
-                basic_streambuf_char_setg(&this->base, buf, 0, buf);
-        }
-    }
+    TRACE("(%p)\n", this);
+    this->vtable = &MSVCP_ios_base_vtable;
+    return this;
 }
 
-/* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-/* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_ctor_str, 12)
-basic_stringbuf_char* __thiscall basic_stringbuf_char_ctor_str(basic_stringbuf_char *this,
-        const basic_string_char *str, IOSB_openmode mode)
+/* ??0ios_base@std@@QAE@ABV01@@Z */
+/* ??0ios_base@std@@QEAA@AEBV01@@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_copy_ctor, 8)
+ios_base* __thiscall ios_base_copy_ctor(ios_base *this, const ios_base *copy)
 {
-    TRACE("(%p %p %d)\n", this, str, mode);
-
-    basic_streambuf_char_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_stringbuf_char_vtable;
-
-    basic_stringbuf_char__Init(this, MSVCP_basic_string_char_c_str(str),
-            str->size, basic_stringbuf_char__Getstate(this, mode));
+    TRACE("(%p %p)\n", this, copy);
+    *this = *copy;
+    this->vtable = &MSVCP_ios_base_vtable;
     return this;
 }
 
-/* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
-/* ??0?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_ctor_mode, 8)
-basic_stringbuf_char* __thiscall basic_stringbuf_char_ctor_mode(
-        basic_stringbuf_char *this, IOSB_openmode mode)
+/* ?_Callfns@ios_base@std@@AAEXW4event@12@@Z */
+/* ?_Callfns@ios_base@std@@AEAAXW4event@12@@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_Callfns, 8)
+void __thiscall ios_base_Callfns(ios_base *this, IOS_BASE_event event)
 {
-    TRACE("(%p %d)\n", this, mode);
+    IOS_BASE_fnarray *cur;
 
-    basic_streambuf_char_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_stringbuf_char_vtable;
+    TRACE("(%p %x)\n", this, event);
 
-    basic_stringbuf_char__Init(this, NULL, 0, basic_stringbuf_char__Getstate(this, mode));
-    return this;
+    for(cur=this->calls; cur; cur=cur->next)
+        cur->event_handler(event, this, cur->index);
 }
 
-/* ??_F?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_F?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_ctor, 4)
-basic_stringbuf_char* __thiscall basic_stringbuf_char_ctor(basic_stringbuf_char *this)
+/* ?_Tidy@ios_base@std@@AAAXXZ */
+/* ?_Tidy@ios_base@std@@AEAAXXZ */
+void CDECL ios_base_Tidy(ios_base *this)
 {
-    return basic_stringbuf_char_ctor_mode(this, OPENMODE_in|OPENMODE_out);
-}
+    IOS_BASE_iosarray *arr_cur, *arr_next;
+    IOS_BASE_fnarray *event_cur, *event_next;
 
-/* ?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXXZ */
-/* ?_Tidy@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char__Tidy, 4)
-void __thiscall basic_stringbuf_char__Tidy(basic_stringbuf_char *this)
-{
     TRACE("(%p)\n", this);
 
-    if(this->state & STRINGBUF_allocated) {
-        MSVCRT_operator_delete(basic_streambuf_char_eback(&this->base));
-        this->seekhigh = NULL;
-        this->state &= ~STRINGBUF_allocated;
+    ios_base_Callfns(this, EVENT_erase_event);
+
+    for(arr_cur=this->arr; arr_cur; arr_cur=arr_next) {
+        arr_next = arr_cur->next;
+        MSVCRT_operator_delete(arr_cur);
     }
+    this->arr = NULL;
 
-    basic_streambuf_char__Init_empty(&this->base);
+    for(event_cur=this->calls; event_cur; event_cur=event_next) {
+        event_next = event_cur->next;
+        MSVCRT_operator_delete(event_cur);
+    }
+    this->calls = NULL;
 }
 
-/* ??1?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
-/* ??1?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_dtor, 4)
-void __thiscall basic_stringbuf_char_dtor(basic_stringbuf_char *this)
+/* ?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z */
+/* ?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z */
+void CDECL ios_base_Ios_base_dtor(ios_base *obj)
 {
-    TRACE("(%p)\n", this);
+    TRACE("(%p)\n", obj);
+    if(obj->loc) {
+        locale_dtor(obj->loc);
+        MSVCRT_operator_delete(obj->loc);
+    }
+    ios_base_Tidy(obj);
+}
 
-    basic_stringbuf_char__Tidy(this);
-    basic_streambuf_char_dtor(&this->base);
+/* ??1ios_base@std@@UAE@XZ */
+/* ??1ios_base@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(ios_base_dtor, 4)
+void __thiscall ios_base_dtor(ios_base *this)
+{
+    ios_base_Ios_base_dtor(this);
 }
 
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_vector_dtor, 8)
-basic_stringbuf_char* __thiscall basic_stringbuf_char_vector_dtor(basic_stringbuf_char *this, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(ios_base_vector_dtor, 8)
+ios_base* __thiscall ios_base_vector_dtor(ios_base *this, unsigned int flags)
 {
     TRACE("(%p %x)\n", this, flags);
-
     if(flags & 2) {
         /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *) this - 1;
-
-        for (i = *ptr - 1; i >= 0; i--)
-            basic_stringbuf_char_dtor(this+i);
+        INT_PTR i, *ptr = (INT_PTR *)this-1;
 
+        for(i=*ptr-1; i>=0; i--)
+            ios_base_dtor(this+i);
         MSVCRT_operator_delete(ptr);
-    }else {
-        basic_stringbuf_char_dtor(this);
-
+    } else {
+        ios_base_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -3691,719 +2962,515 @@ basic_stringbuf_char* __thiscall basic_stringbuf_char_vector_dtor(basic_stringbu
     return this;
 }
 
-/* ?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAEHH@Z */
-/* ?overflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_overflow, 8)
-int __thiscall basic_stringbuf_char_overflow(basic_stringbuf_char *this, int meta)
+DEFINE_THISCALL_WRAPPER(iosb_vector_dtor, 8)
+void* __thiscall iosb_vector_dtor(void *this, unsigned int flags)
 {
-    MSVCP_size_t oldsize, size;
-    char *ptr, *buf;
-
-    TRACE("(%p %x)\n", this, meta);
+    TRACE("(%p %x)\n", this, flags);
+    if(flags & 2) {
+        INT_PTR *ptr = (INT_PTR *)this-1;
+        MSVCRT_operator_delete(ptr);
+    } else {
+        if(flags & 1)
+            MSVCRT_operator_delete(this);
+    }
 
-    if(meta == EOF)
-        return !EOF;
-    if(this->state & STRINGBUF_no_write)
-        return EOF;
+    return this;
+}
 
-    ptr = basic_streambuf_char_pptr(&this->base);
-    if((this->state&STRINGBUF_append) && ptr<this->seekhigh)
-        basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base),
-                this->seekhigh, basic_streambuf_char_epptr(&this->base));
+/* ?_Findarr@ios_base@std@@AAEAAU_Iosarray@12@H@Z */
+/* ?_Findarr@ios_base@std@@AEAAAEAU_Iosarray@12@H@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_Findarr, 8)
+IOS_BASE_iosarray* __thiscall ios_base_Findarr(ios_base *this, int index)
+{
+    IOS_BASE_iosarray *p;
 
-    if(ptr && ptr<basic_streambuf_char_epptr(&this->base))
-        return (*basic_streambuf_char__Pninc(&this->base) = meta);
+    TRACE("(%p %d)\n", this, index);
 
-    oldsize = (ptr ? basic_streambuf_char_epptr(&this->base)-basic_streambuf_char_eback(&this->base): 0);
-    size = oldsize|0xf;
-    size += size/2;
-    buf = MSVCRT_operator_new(size);
-    if(!buf) {
-        ERR("Out of memory\n");
-        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+    for(p=this->arr; p; p=p->next) {
+        if(p->index == index)
+            return p;
     }
 
-    if(!oldsize) {
-        this->seekhigh = buf;
-        basic_streambuf_char_setp(&this->base, buf, buf+size);
-        if(this->state & STRINGBUF_no_read)
-            basic_streambuf_char_setg(&this->base, buf, NULL, buf);
-        else
-            basic_streambuf_char_setg(&this->base, buf, buf, buf+1);
-
-        this->state |= STRINGBUF_allocated;
-    }else {
-        ptr = basic_streambuf_char_eback(&this->base);
-        memcpy(buf, ptr, oldsize);
-
-        this->seekhigh = buf+(this->seekhigh-ptr);
-        basic_streambuf_char_setp_next(&this->base, buf,
-                buf+(basic_streambuf_char_pptr(&this->base)-ptr), buf+size);
-        if(this->state & STRINGBUF_no_read)
-            basic_streambuf_char_setg(&this->base, buf, NULL, buf);
-        else
-            basic_streambuf_char_setg(&this->base, buf,
-                    buf+(basic_streambuf_char_gptr(&this->base)-ptr),
-                    basic_streambuf_char_pptr(&this->base)+1);
-
-        MSVCRT_operator_delete(ptr);
+    for(p=this->arr; p; p=p->next) {
+        if(!p->long_val && !p->ptr_val) {
+            p->index = index;
+            return p;
+        }
     }
 
-    return (*basic_streambuf_char__Pninc(&this->base) = meta);
+    p = MSVCRT_operator_new(sizeof(IOS_BASE_iosarray));
+    p->next = this->arr;
+    p->index = index;
+    p->long_val = 0;
+    p->ptr_val = NULL;
+    this->arr = p;
+    return p;
 }
 
-/* ?pbackfail@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAEHH@Z */
-/* ?pbackfail@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_pbackfail, 8)
-int __thiscall basic_stringbuf_char_pbackfail(basic_stringbuf_char *this, int c)
+/* ?iword@ios_base@std@@QAEAAJH@Z */
+/* ?iword@ios_base@std@@QEAAAEAJH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_iword, 8)
+LONG* __thiscall ios_base_iword(ios_base *this, int index)
 {
-    char *cur;
-
-    TRACE("(%p %x)\n", this, c);
-
-    cur = basic_streambuf_char_gptr(&this->base);
-    if(!cur || cur==basic_streambuf_char_eback(&this->base)
-            || (c!=EOF && c!=cur[-1] && this->state&STRINGBUF_no_write))
-        return EOF;
+    TRACE("(%p %d)\n", this, index);
+    return &ios_base_Findarr(this, index)->long_val;
+}
 
-    if(c != EOF)
-        cur[-1] = c;
-    basic_streambuf_char_gbump(&this->base, -1);
-    return c==EOF ? !EOF : c;
+/* ?pword@ios_base@std@@QAEAAPAXH@Z */
+/* ?pword@ios_base@std@@QEAAAEAPEAXH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_pword, 8)
+void** __thiscall ios_base_pword(ios_base *this, int index)
+{
+    TRACE("(%p %d)\n", this, index);
+    return &ios_base_Findarr(this, index)->ptr_val;
 }
 
-/* ?underflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAEHXZ */
-/* ?underflow@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAAHXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_underflow, 4)
-int __thiscall basic_stringbuf_char_underflow(basic_stringbuf_char *this)
+/* ?register_callback@ios_base@std@@QAEXP6AXW4event@12@AAV12@H@ZH@Z */
+/* ?register_callback@ios_base@std@@QEAAXP6AXW4event@12@AEAV12@H@ZH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_register_callback, 12)
+void __thiscall ios_base_register_callback(ios_base *this, IOS_BASE_event_callback callback, int index)
 {
-    char *ptr, *cur;
+    IOS_BASE_fnarray *event;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %p %d)\n", this, callback, index);
 
-    cur = basic_streambuf_char_gptr(&this->base);
-    if(!cur || this->state&STRINGBUF_no_read)
-        return EOF;
+    event = MSVCRT_operator_new(sizeof(IOS_BASE_fnarray));
+    event->next = this->calls;
+    event->index = index;
+    event->event_handler = callback;
+    this->calls = event;
+}
 
-    ptr  = basic_streambuf_char_pptr(&this->base);
-    if(this->seekhigh < ptr)
-        this->seekhigh = ptr;
+/* ?clear@ios_base@std@@QAEXH_N@Z */
+/* ?clear@ios_base@std@@QEAAXH_N@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_clear_reraise, 12)
+void __thiscall ios_base_clear_reraise(ios_base *this, IOSB_iostate state, MSVCP_bool reraise)
+{
+    TRACE("(%p %x %x)\n", this, state, reraise);
 
-    ptr = basic_streambuf_char_egptr(&this->base);
-    if(this->seekhigh > ptr)
-        basic_streambuf_char_setg(&this->base, basic_streambuf_char_eback(&this->base), cur, this->seekhigh);
+    this->state = state & IOSTATE_mask;
+    if(!(this->state & this->except))
+        return;
 
-    if(cur < this->seekhigh)
-        return *cur;
-    return EOF;
+    if(reraise)
+        throw_exception(EXCEPTION_RERAISE, NULL);
+    else if(this->state & this->except & IOSTATE_eofbit)
+        throw_exception(EXCEPTION_FAILURE, "eofbit is set");
+    else if(this->state & this->except & IOSTATE_failbit)
+        throw_exception(EXCEPTION_FAILURE, "failbit is set");
+    else if(this->state & this->except & IOSTATE_badbit)
+        throw_exception(EXCEPTION_FAILURE, "badbit is set");
+    else if(this->state & this->except & IOSTATE__Hardfail)
+        throw_exception(EXCEPTION_FAILURE, "_Hardfail is set");
 }
 
-/* ?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAE?AV?$fpos@H@2@JHH@Z */
-/* ?seekoff@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_seekoff, 24)
-fpos_int* __thiscall basic_stringbuf_char_seekoff(basic_stringbuf_char *this,
-        fpos_int *ret, streamoff off, int way, int mode)
+/* ?clear@ios_base@std@@QAEXH@Z */
+/* ?clear@ios_base@std@@QEAAXH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_clear, 8)
+void __thiscall ios_base_clear(ios_base *this, IOSB_iostate state)
 {
-    char *beg, *cur_r, *cur_w;
-
-    TRACE("(%p %p %s %d %d)\n", this, ret, wine_dbgstr_longlong(off), way, mode);
+    ios_base_clear_reraise(this, state, FALSE);
+}
 
-    cur_w = basic_streambuf_char_pptr(&this->base);
-    if(cur_w > this->seekhigh)
-        this->seekhigh = cur_w;
-
-    ret->off = 0;
-    ret->state = 0;
-
-    beg = basic_streambuf_char_eback(&this->base);
-    cur_r = basic_streambuf_char_gptr(&this->base);
-    if((mode & OPENMODE_in) && cur_r) {
-        if(way==SEEKDIR_cur && !(mode & OPENMODE_out))
-            off += cur_r-beg;
-        else if(way == SEEKDIR_end)
-            off += this->seekhigh-beg;
-        else if(way != SEEKDIR_beg)
-            off = -1;
-
-        if(off<0 || off>this->seekhigh-beg) {
-            off = -1;
-        }else {
-            basic_streambuf_char_gbump(&this->base, beg-cur_r+off);
-            if((mode & OPENMODE_out) && cur_w) {
-                basic_streambuf_char_setp_next(&this->base, beg,
-                        basic_streambuf_char_gptr(&this->base),
-                        basic_streambuf_char_epptr(&this->base));
-            }
-        }
-    }else if((mode & OPENMODE_out) && cur_w) {
-        if(way == SEEKDIR_cur)
-            off += cur_w-beg;
-        else if(way == SEEKDIR_end)
-            off += this->seekhigh-beg;
-        else if(way != SEEKDIR_beg)
-            off = -1;
-
-        if(off<0 || off>this->seekhigh-beg)
-            off = -1;
-        else
-            basic_streambuf_char_pbump(&this->base, beg-cur_w+off);
-    }else {
-        off = -1;
-    }
-
-    ret->pos = off;
-    return ret;
-}
-
-/* ?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
-/* ?seekpos@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_seekpos, 36)
-fpos_int* __thiscall basic_stringbuf_char_seekpos(basic_stringbuf_char *this,
-        fpos_int *ret, fpos_int pos, int mode)
+/* ?clear@ios_base@std@@QAEXI@Z */
+/* ?clear@ios_base@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_clear_unsigned, 8)
+void __thiscall ios_base_clear_unsigned(ios_base *this, unsigned int state)
 {
-    TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
-
-    if(pos.off==0 && pos.pos==-1 && pos.state==0) {
-        *ret = pos;
-        return ret;
-    }
-
-    return basic_stringbuf_char_seekoff(this, ret, pos.off, SEEKDIR_beg, mode);
+    ios_base_clear_reraise(this, (IOSB_iostate)state, FALSE);
 }
 
-/* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-/* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_str_set, 8)
-void __thiscall basic_stringbuf_char_str_set(basic_stringbuf_char *this, const basic_string_char *str)
+/* ?exceptions@ios_base@std@@QAEXH@Z */
+/* ?exceptions@ios_base@std@@QEAAXH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_exceptions_set, 8)
+void __thiscall ios_base_exceptions_set(ios_base *this, IOSB_iostate state)
 {
-    TRACE("(%p %p)\n", this, str);
-
-    basic_stringbuf_char__Tidy(this);
-    basic_stringbuf_char__Init(this, MSVCP_basic_string_char_c_str(str), str->size, this->state);
+    TRACE("(%p %x)\n", this, state);
+    this->except = state & IOSTATE_mask;
+    ios_base_clear(this, this->state);
 }
 
-/* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?str@?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_char_str_get, 8)
-basic_string_char* __thiscall basic_stringbuf_char_str_get(const basic_stringbuf_char *this, basic_string_char *ret)
+/* ?exceptions@ios_base@std@@QAEXI@Z */
+/* ?exceptions@ios_base@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_exceptions_set_unsigned, 8)
+void __thiscall ios_base_exceptions_set_unsigned(ios_base *this, unsigned int state)
 {
-    char *ptr;
-
-    TRACE("(%p)\n", this);
-
-    if(!(this->state & STRINGBUF_no_write) && basic_streambuf_char_pptr(&this->base)) {
-        char *pptr;
-
-        ptr = basic_streambuf_char_pbase(&this->base);
-        pptr = basic_streambuf_char_pptr(&this->base);
-
-        return MSVCP_basic_string_char_ctor_cstr_len(ret, ptr, (this->seekhigh < pptr ? pptr : this->seekhigh) - ptr);
-    }
-
-    if(!(this->state & STRINGBUF_no_read) && basic_streambuf_char_gptr(&this->base)) {
-        ptr = basic_streambuf_char_eback(&this->base);
-        return MSVCP_basic_string_char_ctor_cstr_len(ret, ptr, basic_streambuf_char_egptr(&this->base) - ptr);
-    }
-
-    return MSVCP_basic_string_char_ctor(ret);
+    TRACE("(%p %x)\n", this, state);
+    ios_base_exceptions_set(this, state);
 }
 
-/* ?_Getstate@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@AAEHH@Z */
-/* ?_Getstate@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@AEAAHH@Z */
-/* ?_Getstate@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AAEHH@Z */
-/* ?_Getstate@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar__Getstate, 8)
-int __thiscall basic_stringbuf_wchar__Getstate(basic_stringbuf_wchar *this, IOSB_openmode mode)
+/* ?exceptions@ios_base@std@@QBEHXZ */
+/* ?exceptions@ios_base@std@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_exceptions_get, 4)
+IOSB_iostate __thiscall ios_base_exceptions_get(ios_base *this)
 {
-    int state = 0;
-
-    if(!(mode & OPENMODE_in))
-        state |= STRINGBUF_no_read;
-
-    if(!(mode & OPENMODE_out))
-        state |= STRINGBUF_no_write;
-
-    if(mode & OPENMODE_ate)
-        state |= STRINGBUF_at_end;
-
-    if(mode & OPENMODE_app)
-        state |= STRINGBUF_append;
-
-    return state;
+    TRACE("(%p)\n", this);
+    return this->except;
 }
 
-/* ?_Init@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXPB_WIH@Z */
-/* ?_Init@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAXPEB_W_KH@Z */
-/* ?_Init@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXPBGIH@Z */
-/* ?_Init@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAXPEBG_KH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar__Init, 16)
-void __thiscall basic_stringbuf_wchar__Init(basic_stringbuf_wchar *this, const wchar_t *str, MSVCP_size_t count, int state)
+/* ?copyfmt@ios_base@std@@QAEAAV12@ABV12@@Z */
+/* ?copyfmt@ios_base@std@@QEAAAEAV12@AEBV12@@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_copyfmt, 8)
+ios_base* __thiscall ios_base_copyfmt(ios_base *this, const ios_base *rhs)
 {
-    TRACE("(%p, %p, %lu, %d)\n", this, str, count, state);
+    TRACE("(%p %p)\n", this, rhs);
 
-    basic_streambuf_wchar__Init_empty(&this->base);
+    if(this != rhs) {
+        IOS_BASE_iosarray *arr_cur;
+        IOS_BASE_fnarray *event_cur;
 
-    this->state = state;
-    this->seekhigh = NULL;
+        ios_base_Tidy(this);
 
-    if(count && str) {
-        wchar_t *buf = MSVCRT_operator_new(count*sizeof(wchar_t));
-        if(!buf) {
-            ERR("Out of memory\n");
-            throw_exception(EXCEPTION_BAD_ALLOC, NULL);
+        for(arr_cur=rhs->arr; arr_cur; arr_cur=arr_cur->next) {
+            if(arr_cur->long_val)
+                *ios_base_iword(this, arr_cur->index) = arr_cur->long_val;
+            if(arr_cur->ptr_val)
+                *ios_base_pword(this, arr_cur->index) = arr_cur->ptr_val;
         }
+        this->stdstr = rhs->stdstr;
+        this->fmtfl = rhs->fmtfl;
+        this->prec = rhs->prec;
+        this->wide = rhs->wide;
+        locale_operator_assign(this->loc, rhs->loc);
 
-        memcpy(buf, str, count*sizeof(wchar_t));
-        this->seekhigh = buf + count;
-
-        this->state |= STRINGBUF_allocated;
-
-        if(!(state & STRINGBUF_no_read))
-            basic_streambuf_wchar_setg(&this->base, buf, buf, buf + count);
-
-        if(!(state & STRINGBUF_no_write)) {
-            basic_streambuf_wchar_setp_next(&this->base, buf, (state & STRINGBUF_at_end) ? buf + count : buf, buf + count);
+        for(event_cur=rhs->calls; event_cur; event_cur=event_cur->next)
+            ios_base_register_callback(this, event_cur->event_handler, event_cur->index);
 
-            if(!basic_streambuf_wchar_gptr(&this->base))
-                basic_streambuf_wchar_setg(&this->base, buf, 0, buf);
-        }
+        ios_base_Callfns(this, EVENT_copyfmt_event);
+        ios_base_exceptions_set(this, rhs->except);
     }
+
+    return this;
 }
 
-/* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-/* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_ctor_str, 12)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_wchar_ctor_str(basic_stringbuf_wchar *this,
-        const basic_string_wchar *str, IOSB_openmode mode)
+/* ??4ios_base@std@@QAEAAV01@ABV01@@Z */
+/* ??4ios_base@std@@QEAAAEAV01@AEBV01@@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_assign, 8)
+ios_base* __thiscall ios_base_assign(ios_base *this, const ios_base *right)
 {
-    TRACE("(%p %p %d)\n", this, str, mode);
+    TRACE("(%p %p)\n", this, right);
 
-    basic_streambuf_wchar_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_stringbuf_wchar_vtable;
+    if(this != right) {
+        this->state = right->state;
+        ios_base_copyfmt(this, right);
+    }
 
-    basic_stringbuf_wchar__Init(this, MSVCP_basic_string_wchar_c_str(str),
-            str->size, basic_stringbuf_wchar__Getstate(this, mode));
     return this;
 }
 
-/* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-/* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_short_ctor_str, 12)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_short_ctor_str(basic_stringbuf_wchar *this,
-        const basic_string_wchar *str, IOSB_openmode mode)
+/* ?fail@ios_base@std@@QBE_NXZ */
+/* ?fail@ios_base@std@@QEBA_NXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_fail, 4)
+MSVCP_bool __thiscall ios_base_fail(const ios_base *this)
 {
-    basic_stringbuf_wchar_ctor_str(this, str, mode);
-    this->base.vtable = &MSVCP_basic_stringbuf_short_vtable;
-    return this;
+    TRACE("(%p)\n", this);
+    return (this->state & (IOSTATE_failbit|IOSTATE_badbit)) != 0;
 }
 
-/* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
-/* ??0?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_ctor_mode, 8)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_wchar_ctor_mode(
-        basic_stringbuf_wchar *this, IOSB_openmode mode)
+/* ??7ios_base@std@@QBE_NXZ */
+/* ??7ios_base@std@@QEBA_NXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_op_succ, 4)
+MSVCP_bool __thiscall ios_base_op_succ(const ios_base *this)
 {
-    TRACE("(%p %d)\n", this, mode);
-
-    basic_streambuf_wchar_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_stringbuf_wchar_vtable;
-
-    basic_stringbuf_wchar__Init(this, NULL, 0, basic_stringbuf_wchar__Getstate(this, mode));
-    return this;
+    TRACE("(%p)\n", this);
+    return ios_base_fail(this);
 }
 
-/* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
-/* ??0?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_short_ctor_mode, 8)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_short_ctor_mode(
-        basic_stringbuf_wchar *this, IOSB_openmode mode)
+/* ??Bios_base@std@@QBEPAXXZ */
+/* ??Bios_base@std@@QEBAPEAXXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_op_fail, 4)
+void* __thiscall ios_base_op_fail(const ios_base *this)
 {
-    basic_stringbuf_wchar_ctor_mode(this, mode);
-    this->base.vtable = &MSVCP_basic_stringbuf_short_vtable;
-    return this;
+    TRACE("(%p)\n", this);
+    return ios_base_fail(this) ? NULL : (void*)this;
 }
 
-/* ??_F?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_F?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_ctor, 4)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_wchar_ctor(basic_stringbuf_wchar *this)
+/* ?_Addstd@ios_base@std@@SAXPAV12@@Z */
+/* ?_Addstd@ios_base@std@@SAXPEAV12@@Z */
+void CDECL ios_base_Addstd(ios_base *add)
 {
-    return basic_stringbuf_wchar_ctor_mode(this, OPENMODE_in|OPENMODE_out);
+    FIXME("(%p) stub\n", add);
 }
 
-/* ??_F?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_F?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_short_ctor, 4)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_short_ctor(basic_stringbuf_wchar *this)
+/* ?_Init@ios_base@std@@IAEXXZ */
+/* ?_Init@ios_base@std@@IEAAXXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_Init, 4)
+void __thiscall ios_base_Init(ios_base *this)
 {
-    return basic_stringbuf_short_ctor_mode(this, OPENMODE_in|OPENMODE_out);
+    TRACE("(%p)\n", this);
+
+    this->stdstr = 0;
+    this->state = this->except = IOSTATE_goodbit;
+    this->fmtfl = FMTFLAG_skipws | FMTFLAG_dec;
+    this->prec = 6;
+    this->wide = 0;
+    this->arr = NULL;
+    this->calls = NULL;
+    this->loc = MSVCRT_operator_new(sizeof(locale));
+    locale_ctor(this->loc);
 }
 
-/* ?_Tidy@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXXZ */
-/* ?_Tidy@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAXXZ */
-/* ?_Tidy@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXXZ */
-/* ?_Tidy@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar__Tidy, 4)
-void __thiscall basic_stringbuf_wchar__Tidy(basic_stringbuf_wchar *this)
+/* ?bad@ios_base@std@@QBE_NXZ */
+/* ?bad@ios_base@std@@QEBA_NXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_bad, 4)
+MSVCP_bool __thiscall ios_base_bad(const ios_base *this)
 {
     TRACE("(%p)\n", this);
-
-    if(this->state & STRINGBUF_allocated) {
-        MSVCRT_operator_delete(basic_streambuf_wchar_eback(&this->base));
-        this->seekhigh = NULL;
-        this->state &= ~STRINGBUF_allocated;
-    }
-
-    basic_streambuf_wchar__Init_empty(&this->base);
+    return (this->state & IOSTATE_badbit) != 0;
 }
 
-/* ??1?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
-/* ??1?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
-/* ??1?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
-/* ??1?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_dtor, 4)
-void __thiscall basic_stringbuf_wchar_dtor(basic_stringbuf_wchar *this)
+/* ?eof@ios_base@std@@QBE_NXZ */
+/* ?eof@ios_base@std@@QEBA_NXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_eof, 4)
+MSVCP_bool __thiscall ios_base_eof(const ios_base *this)
 {
     TRACE("(%p)\n", this);
-
-    basic_stringbuf_wchar__Tidy(this);
-    basic_streambuf_wchar_dtor(&this->base);
+    return (this->state & IOSTATE_eofbit) != 0;
 }
 
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_vector_dtor, 8)
-basic_stringbuf_wchar* __thiscall basic_stringbuf_wchar_vector_dtor(basic_stringbuf_wchar *this, unsigned int flags)
+/* ?flags@ios_base@std@@QAEHH@Z */
+/* ?flags@ios_base@std@@QEAAHH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_flags_set, 8)
+IOSB_fmtflags __thiscall ios_base_flags_set(ios_base *this, IOSB_fmtflags flags)
 {
-    TRACE("(%p %x)\n", this, flags);
-
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *) this - 1;
-
-        for (i = *ptr - 1; i >= 0; i--)
-            basic_stringbuf_wchar_dtor(this+i);
-
-        MSVCRT_operator_delete(ptr);
-    }else {
-        basic_stringbuf_wchar_dtor(this);
+    IOSB_fmtflags ret = this->fmtfl;
 
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
+    TRACE("(%p %x)\n", this, flags);
 
-    return this;
+    this->fmtfl = flags & FMTFLAG_mask;
+    return ret;
 }
 
-/* ?overflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAEGG@Z */
-/* ?overflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAAGG@Z */
-/* ?overflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAEGG@Z */
-/* ?overflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAAGG@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_overflow, 8)
-unsigned short __thiscall basic_stringbuf_wchar_overflow(basic_stringbuf_wchar *this, unsigned short meta)
+/* ?flags@ios_base@std@@QBEHXZ */
+/* ?flags@ios_base@std@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_flags_get, 4)
+IOSB_fmtflags __thiscall ios_base_flags_get(const ios_base *this)
 {
-    MSVCP_size_t oldsize, size;
-    wchar_t *ptr, *buf;
-
-    TRACE("(%p %x)\n", this, meta);
-
-    if(meta == WEOF)
-        return !WEOF;
-    if(this->state & STRINGBUF_no_write)
-        return WEOF;
-
-    ptr = basic_streambuf_wchar_pptr(&this->base);
-    if((this->state&STRINGBUF_append) && ptr<this->seekhigh)
-        basic_streambuf_wchar_setp_next(&this->base, basic_streambuf_wchar_pbase(&this->base),
-                this->seekhigh, basic_streambuf_wchar_epptr(&this->base));
-
-    if(ptr && ptr<basic_streambuf_wchar_epptr(&this->base))
-        return (*basic_streambuf_wchar__Pninc(&this->base) = meta);
-
-    oldsize = (ptr ? basic_streambuf_wchar_epptr(&this->base)-basic_streambuf_wchar_eback(&this->base): 0);
-    size = oldsize|0xf;
-    size += size/2;
-    buf = MSVCRT_operator_new(size*sizeof(wchar_t));
-    if(!buf) {
-        ERR("Out of memory\n");
-        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
-    }
-
-    if(!oldsize) {
-        this->seekhigh = buf;
-        basic_streambuf_wchar_setp(&this->base, buf, buf+size);
-        if(this->state & STRINGBUF_no_read)
-            basic_streambuf_wchar_setg(&this->base, buf, NULL, buf);
-        else
-            basic_streambuf_wchar_setg(&this->base, buf, buf, buf+1);
-
-        this->state |= STRINGBUF_allocated;
-    }else {
-        ptr = basic_streambuf_wchar_eback(&this->base);
-        memcpy(buf, ptr, oldsize*sizeof(wchar_t));
-
-        this->seekhigh = buf+(this->seekhigh-ptr);
-        basic_streambuf_wchar_setp_next(&this->base, buf,
-                buf+(basic_streambuf_wchar_pptr(&this->base)-ptr), buf+size);
-        if(this->state & STRINGBUF_no_read)
-            basic_streambuf_wchar_setg(&this->base, buf, NULL, buf);
-        else
-            basic_streambuf_wchar_setg(&this->base, buf,
-                    buf+(basic_streambuf_wchar_gptr(&this->base)-ptr),
-                    basic_streambuf_wchar_pptr(&this->base)+1);
-
-        MSVCRT_operator_delete(ptr);
-    }
-
-    return (*basic_streambuf_wchar__Pninc(&this->base) = meta);
+    TRACE("(%p)\n", this);
+    return this->fmtfl;
 }
 
-/* ?pbackfail@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAEGG@Z */
-/* ?pbackfail@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAAGG@Z */
-/* ?pbackfail@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAEGG@Z */
-/* ?pbackfail@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAAGG@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_pbackfail, 8)
-unsigned short __thiscall basic_stringbuf_wchar_pbackfail(basic_stringbuf_wchar *this, unsigned short c)
+/* ?getloc@ios_base@std@@QBE?AVlocale@2@XZ */
+/* ?getloc@ios_base@std@@QEBA?AVlocale@2@XZ */
+DEFINE_THISCALL_WRAPPER(ios_base_getloc, 8)
+locale* __thiscall ios_base_getloc(const ios_base *this, locale *ret)
 {
-    wchar_t *cur;
-
-    TRACE("(%p %x)\n", this, c);
-
-    cur = basic_streambuf_wchar_gptr(&this->base);
-    if(!cur || cur==basic_streambuf_wchar_eback(&this->base)
-            || (c!=WEOF && c!=cur[-1] && this->state&STRINGBUF_no_write))
-        return WEOF;
-
-    if(c != WEOF)
-        cur[-1] = c;
-    basic_streambuf_wchar_gbump(&this->base, -1);
-    return c==WEOF ? !WEOF : c;
+    TRACE("(%p)\n", this);
+    return locale_copy_ctor(ret, this->loc);
 }
 
-/* ?underflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAEGXZ */
-/* ?underflow@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAAGXZ */
-/* ?underflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAEGXZ */
-/* ?underflow@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAAGXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_underflow, 4)
-unsigned short __thiscall basic_stringbuf_wchar_underflow(basic_stringbuf_wchar *this)
+/* ?good@ios_base@std@@QBE_NXZ */
+/* ?good@ios_base@std@@QEBA_NXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_good, 4)
+MSVCP_bool __thiscall ios_base_good(const ios_base *this)
 {
-    wchar_t *ptr, *cur;
-
     TRACE("(%p)\n", this);
-
-    cur = basic_streambuf_wchar_gptr(&this->base);
-    if(!cur || this->state&STRINGBUF_no_read)
-        return WEOF;
-
-    ptr  = basic_streambuf_wchar_pptr(&this->base);
-    if(this->seekhigh < ptr)
-        this->seekhigh = ptr;
-
-    ptr = basic_streambuf_wchar_egptr(&this->base);
-    if(this->seekhigh > ptr)
-        basic_streambuf_wchar_setg(&this->base, basic_streambuf_wchar_eback(&this->base), cur, this->seekhigh);
-
-    if(cur < this->seekhigh)
-        return *cur;
-    return WEOF;
+    return this->state == IOSTATE_goodbit;
 }
 
-/* ?seekoff@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAE?AV?$fpos@H@2@JHH@Z */
-/* ?seekoff@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
-/* ?seekoff@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAE?AV?$fpos@H@2@JHH@Z */
-/* ?seekoff@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_seekoff, 24)
-fpos_int* __thiscall basic_stringbuf_wchar_seekoff(basic_stringbuf_wchar *this,
-        fpos_int *ret, streamoff off, int way, int mode)
+/* ?imbue@ios_base@std@@QAE?AVlocale@2@ABV32@@Z */
+/* ?imbue@ios_base@std@@QEAA?AVlocale@2@AEBV32@@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_imbue, 12)
+locale* __thiscall ios_base_imbue(ios_base *this, locale *ret, const locale *loc)
 {
-    wchar_t *beg, *cur_r, *cur_w;
-
-    TRACE("(%p %p %s %d %d)\n", this, ret, wine_dbgstr_longlong(off), way, mode);
-
-    cur_w = basic_streambuf_wchar_pptr(&this->base);
-    if(cur_w > this->seekhigh)
-        this->seekhigh = cur_w;
-
-    ret->off = 0;
-    ret->state = 0;
-
-    beg = basic_streambuf_wchar_eback(&this->base);
-    cur_r = basic_streambuf_wchar_gptr(&this->base);
-    if((mode & OPENMODE_in) && cur_r) {
-        if(way==SEEKDIR_cur && !(mode & OPENMODE_out))
-            off += cur_r-beg;
-        else if(way == SEEKDIR_end)
-            off += this->seekhigh-beg;
-        else if(way != SEEKDIR_beg)
-            off = -1;
-
-        if(off<0 || off>this->seekhigh-beg) {
-            off = -1;
-        }else {
-            basic_streambuf_wchar_gbump(&this->base, beg-cur_r+off);
-            if((mode & OPENMODE_out) && cur_w) {
-                basic_streambuf_wchar_setp_next(&this->base, beg,
-                        basic_streambuf_wchar_gptr(&this->base),
-                        basic_streambuf_wchar_epptr(&this->base));
-            }
-        }
-    }else if((mode & OPENMODE_out) && cur_w) {
-        if(way == SEEKDIR_cur)
-            off += cur_w-beg;
-        else if(way == SEEKDIR_end)
-            off += this->seekhigh-beg;
-        else if(way != SEEKDIR_beg)
-            off = -1;
-
-        if(off<0 || off>this->seekhigh-beg)
-            off = -1;
-        else
-            basic_streambuf_wchar_pbump(&this->base, beg-cur_w+off);
-    }else {
-        off = -1;
-    }
-
-    ret->pos = off;
+    TRACE("(%p %p)\n", this, loc);
+    *ret = *this->loc;
+    locale_copy_ctor(this->loc, loc);
     return ret;
 }
 
-/* ?seekpos@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
-/* ?seekpos@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
-/* ?seekpos@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MAE?AV?$fpos@H@2@V32@H@Z */
-/* ?seekpos@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_seekpos, 36)
-fpos_int* __thiscall basic_stringbuf_wchar_seekpos(basic_stringbuf_wchar *this,
-        fpos_int *ret, fpos_int pos, int mode)
+/* ?precision@ios_base@std@@QAEHH@Z */
+/* ?precision@ios_base@std@@QEAA_J_J@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_precision_set, 12)
+streamsize __thiscall ios_base_precision_set(ios_base *this, streamsize precision)
 {
-    TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
+    streamsize ret = this->prec;
 
-    if(pos.off==0 && pos.pos==-1 && pos.state==0) {
-        *ret = pos;
-        return ret;
-    }
+    TRACE("(%p %s)\n", this, wine_dbgstr_longlong(precision));
 
-    return basic_stringbuf_wchar_seekoff(this, ret, pos.off, SEEKDIR_beg, mode);
+    this->prec = precision;
+    return ret;
 }
 
-/* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-/* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_str_set, 8)
-void __thiscall basic_stringbuf_wchar_str_set(basic_stringbuf_wchar *this, const basic_string_wchar *str)
+/* ?precision@ios_base@std@@QBEHXZ */
+/* ?precision@ios_base@std@@QEBA_JXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_precision_get, 4)
+streamsize __thiscall ios_base_precision_get(const ios_base *this)
 {
-    TRACE("(%p %p)\n", this, str);
+    TRACE("(%p)\n", this);
+    return this->prec;
+}
 
-    basic_stringbuf_wchar__Tidy(this);
-    basic_stringbuf_wchar__Init(this, MSVCP_basic_string_wchar_c_str(str), str->size, this->state);
+/* ?rdstate@ios_base@std@@QBEHXZ */
+/* ?rdstate@ios_base@std@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_rdstate, 4)
+IOSB_iostate __thiscall ios_base_rdstate(const ios_base *this)
+{
+    TRACE("(%p)\n", this);
+    return this->state;
 }
 
-/* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?str@?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringbuf_wchar_str_get, 8)
-basic_string_wchar* __thiscall basic_stringbuf_wchar_str_get(const basic_stringbuf_wchar *this, basic_string_wchar *ret)
+/* ?setf@ios_base@std@@QAEHHH@Z */
+/* ?setf@ios_base@std@@QEAAHHH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_setf_mask, 12)
+IOSB_fmtflags __thiscall ios_base_setf_mask(ios_base *this, IOSB_fmtflags flags, IOSB_fmtflags mask)
 {
-    wchar_t *ptr;
+    IOSB_fmtflags ret = this->fmtfl;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %x %x)\n", this, flags, mask);
 
-    if(!(this->state & STRINGBUF_no_write) && basic_streambuf_wchar_pptr(&this->base)) {
-        wchar_t *pptr;
+    this->fmtfl = (this->fmtfl & (~mask)) | (flags & mask & FMTFLAG_mask);
+    return ret;
+}
 
-        ptr = basic_streambuf_wchar_pbase(&this->base);
-        pptr = basic_streambuf_wchar_pptr(&this->base);
+/* ?setf@ios_base@std@@QAEHH@Z */
+/* ?setf@ios_base@std@@QEAAHH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_setf, 8)
+IOSB_fmtflags __thiscall ios_base_setf(ios_base *this, IOSB_fmtflags flags)
+{
+    return ios_base_setf_mask(this, flags, ~0);
+}
 
-        return MSVCP_basic_string_wchar_ctor_cstr_len(ret, ptr, (this->seekhigh < pptr ? pptr : this->seekhigh) - ptr);
-    }
+/* ?setstate@ios_base@std@@QAEXH_N@Z */
+/* ?setstate@ios_base@std@@QEAAXH_N@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_setstate_reraise, 12)
+void __thiscall ios_base_setstate_reraise(ios_base *this, IOSB_iostate state, MSVCP_bool reraise)
+{
+    TRACE("(%p %x %x)\n", this, state, reraise);
 
-    if(!(this->state & STRINGBUF_no_read) && basic_streambuf_wchar_gptr(&this->base)) {
-        ptr = basic_streambuf_wchar_eback(&this->base);
-        return MSVCP_basic_string_wchar_ctor_cstr_len(ret, ptr, basic_streambuf_wchar_egptr(&this->base) - ptr);
-    }
+    if(state != IOSTATE_goodbit)
+        ios_base_clear_reraise(this, this->state | state, reraise);
+}
 
-    return MSVCP_basic_string_wchar_ctor(ret);
+/* ?setstate@ios_base@std@@QAEXH@Z */
+/* ?setstate@ios_base@std@@QEAAXH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_setstate, 8)
+void __thiscall ios_base_setstate(ios_base *this, IOSB_iostate state)
+{
+    ios_base_setstate_reraise(this, state, FALSE);
 }
 
-/* ??0ios_base@std@@IAE@XZ */
-/* ??0ios_base@std@@IEAA@XZ */
-DEFINE_THISCALL_WRAPPER(ios_base_ctor, 4)
-ios_base* __thiscall ios_base_ctor(ios_base *this)
+/* ?setstate@ios_base@std@@QAEXI@Z */
+/* ?setstate@ios_base@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_setstate_unsigned, 8)
+void __thiscall ios_base_setstate_unsigned(ios_base *this, unsigned int state)
 {
-    TRACE("(%p)\n", this);
-    this->vtable = &MSVCP_ios_base_vtable;
-    return this;
+    ios_base_setstate_reraise(this, (IOSB_iostate)state, FALSE);
 }
 
-/* ??0ios_base@std@@QAE@ABV01@@Z */
-/* ??0ios_base@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_copy_ctor, 8)
-ios_base* __thiscall ios_base_copy_ctor(ios_base *this, const ios_base *copy)
+/* ?sync_with_stdio@ios_base@std@@SA_N_N@Z */
+MSVCP_bool CDECL ios_base_sync_with_stdio(MSVCP_bool sync)
 {
-    TRACE("(%p %p)\n", this, copy);
-    *this = *copy;
-    this->vtable = &MSVCP_ios_base_vtable;
-    return this;
+    _Lockit lock;
+    MSVCP_bool ret;
+
+    TRACE("(%x)\n", sync);
+
+    _Lockit_ctor_locktype(&lock, _LOCK_STREAM);
+    ret = ios_base_Sync;
+    ios_base_Sync = sync;
+    _Lockit_dtor(&lock);
+    return ret;
 }
 
-/* ?_Callfns@ios_base@std@@AAEXW4event@12@@Z */
-/* ?_Callfns@ios_base@std@@AEAAXW4event@12@@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_Callfns, 8)
-void __thiscall ios_base_Callfns(ios_base *this, IOS_BASE_event event)
+/* ?unsetf@ios_base@std@@QAEXH@Z */
+/* ?unsetf@ios_base@std@@QEAAXH@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_unsetf, 8)
+void __thiscall ios_base_unsetf(ios_base *this, IOSB_fmtflags flags)
 {
-    IOS_BASE_fnarray *cur;
+    TRACE("(%p %x)\n", this, flags);
+    this->fmtfl &= ~flags;
+}
 
-    TRACE("(%p %x)\n", this, event);
+/* ?width@ios_base@std@@QAEHH@Z */
+/* ?width@ios_base@std@@QEAA_J_J@Z */
+DEFINE_THISCALL_WRAPPER(ios_base_width_set, 12)
+streamsize __thiscall ios_base_width_set(ios_base *this, streamsize width)
+{
+    streamsize ret = this->wide;
 
-    for(cur=this->calls; cur; cur=cur->next)
-        cur->event_handler(event, this, cur->index);
+    TRACE("(%p %s)\n", this, wine_dbgstr_longlong(width));
+
+    this->wide = width;
+    return ret;
 }
 
-/* ?_Tidy@ios_base@std@@AAAXXZ */
-/* ?_Tidy@ios_base@std@@AEAAXXZ */
-void CDECL ios_base_Tidy(ios_base *this)
+/* ?width@ios_base@std@@QBEHXZ */
+/* ?width@ios_base@std@@QEBA_JXZ */
+DEFINE_THISCALL_WRAPPER(ios_base_width_get, 4)
+streamsize __thiscall ios_base_width_get(ios_base *this)
 {
-    IOS_BASE_iosarray *arr_cur, *arr_next;
-    IOS_BASE_fnarray *event_cur, *event_next;
+    TRACE("(%p)\n", this);
+    return this->wide;
+}
+
+/* ?xalloc@ios_base@std@@SAHXZ */
+int CDECL ios_base_xalloc(void)
+{
+    _Lockit lock;
+    int ret;
+
+    TRACE("\n");
+
+    _Lockit_ctor_locktype(&lock, _LOCK_STREAM);
+    ret = ios_base_Index++;
+    _Lockit_dtor(&lock);
+    return ret;
+}
 
+/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAE@XZ */
+/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_ctor, 4)
+basic_ios_char* __thiscall basic_ios_char_ctor(basic_ios_char *this)
+{
     TRACE("(%p)\n", this);
 
-    ios_base_Callfns(this, EVENT_erase_event);
+    ios_base_ctor(&this->base);
+    this->base.vtable = &MSVCP_basic_ios_char_vtable;
+    return this;
+}
 
-    for(arr_cur=this->arr; arr_cur; arr_cur=arr_next) {
-        arr_next = arr_cur->next;
-        MSVCRT_operator_delete(arr_cur);
-    }
-    this->arr = NULL;
+/* ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAEXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z */
+/* ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_init, 12)
+void __thiscall basic_ios_char_init(basic_ios_char *this, basic_streambuf_char *streambuf, MSVCP_bool isstd)
+{
+    TRACE("(%p %p %x)\n", this, streambuf, isstd);
+    ios_base_Init(&this->base);
+    this->strbuf = streambuf;
+    this->stream = NULL;
+    this->fillch = ' ';
 
-    for(event_cur=this->calls; event_cur; event_cur=event_next) {
-        event_next = event_cur->next;
-        MSVCRT_operator_delete(event_cur);
-    }
-    this->calls = NULL;
+    if(!streambuf)
+        ios_base_setstate(&this->base, IOSTATE_badbit);
+
+    if(isstd)
+        FIXME("standard streams not handled yet\n");
 }
 
-/* ?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z */
-/* ?_Ios_base_dtor@ios_base@std@@CAXPEAV12@@Z */
-void CDECL ios_base_Ios_base_dtor(ios_base *obj)
+/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_ctor_streambuf, 8)
+basic_ios_char* __thiscall basic_ios_char_ctor_streambuf(basic_ios_char *this, basic_streambuf_char *strbuf)
 {
-    TRACE("(%p)\n", obj);
-    if(obj->loc) {
-        locale_dtor(obj->loc);
-        MSVCRT_operator_delete(obj->loc);
-    }
-    ios_base_Tidy(obj);
+    TRACE("(%p %p)\n", this, strbuf);
+
+    basic_ios_char_ctor(this);
+    basic_ios_char_init(this, strbuf, FALSE);
+    return this;
 }
 
-/* ??1ios_base@std@@UAE@XZ */
-/* ??1ios_base@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(ios_base_dtor, 4)
-void __thiscall ios_base_dtor(ios_base *this)
+/* ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ */
+/* ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_dtor, 4)
+void __thiscall basic_ios_char_dtor(basic_ios_char *this)
 {
-    ios_base_Ios_base_dtor(this);
+    TRACE("(%p)\n", this);
+    ios_base_dtor(&this->base);
 }
 
-DEFINE_THISCALL_WRAPPER(ios_base_vector_dtor, 8)
-ios_base* __thiscall ios_base_vector_dtor(ios_base *this, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(basic_ios_char_vector_dtor, 8)
+basic_ios_char* __thiscall basic_ios_char_vector_dtor(basic_ios_char *this, unsigned int flags)
 {
     TRACE("(%p %x)\n", this, flags);
     if(flags & 2) {
@@ -4411,10 +3478,10 @@ ios_base* __thiscall ios_base_vector_dtor(ios_base *this, unsigned int flags)
         INT_PTR i, *ptr = (INT_PTR *)this-1;
 
         for(i=*ptr-1; i>=0; i--)
-            ios_base_dtor(this+i);
+            basic_ios_char_dtor(this+i);
         MSVCRT_operator_delete(ptr);
     } else {
-        ios_base_dtor(this);
+        basic_ios_char_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -4422,526 +3489,534 @@ ios_base* __thiscall ios_base_vector_dtor(ios_base *this, unsigned int flags)
     return this;
 }
 
-DEFINE_THISCALL_WRAPPER(iosb_vector_dtor, 8)
-void* __thiscall iosb_vector_dtor(void *this, unsigned int flags)
+/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z */
+/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_clear_reraise, 12)
+void __thiscall basic_ios_char_clear_reraise(basic_ios_char *this, IOSB_iostate state, MSVCP_bool reraise)
 {
-    TRACE("(%p %x)\n", this, flags);
-    if(flags & 2) {
-        INT_PTR *ptr = (INT_PTR *)this-1;
-        MSVCRT_operator_delete(ptr);
-    } else {
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
+    TRACE("(%p %x %x)\n", this, state, reraise);
+    ios_base_clear_reraise(&this->base, state | (this->strbuf ? IOSTATE_goodbit : IOSTATE_badbit), reraise);
+}
+
+/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z */
+/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_clear, 8)
+void __thiscall basic_ios_char_clear(basic_ios_char *this, unsigned int state)
+{
+    basic_ios_char_clear_reraise(this, (IOSB_iostate)state, FALSE);
+}
+
+/* ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEAAV12@ABV12@@Z */
+/* ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_copyfmt, 8)
+basic_ios_char* __thiscall basic_ios_char_copyfmt(basic_ios_char *this, basic_ios_char *copy)
+{
+    TRACE("(%p %p)\n", this, copy);
+    if(this == copy)
+        return this;
 
+    this->stream = copy->stream;
+    this->fillch = copy->fillch;
+    ios_base_copyfmt(&this->base, &copy->base);
     return this;
 }
 
-/* ?_Findarr@ios_base@std@@AAEAAU_Iosarray@12@H@Z */
-/* ?_Findarr@ios_base@std@@AEAAAEAU_Iosarray@12@H@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_Findarr, 8)
-IOS_BASE_iosarray* __thiscall ios_base_Findarr(ios_base *this, int index)
+/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEDD@Z */
+/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAADD@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_fill_set, 8)
+char __thiscall basic_ios_char_fill_set(basic_ios_char *this, char fill)
 {
-    IOS_BASE_iosarray *p;
+    char ret = this->fillch;
 
-    TRACE("(%p %d)\n", this, index);
+    TRACE("(%p %c)\n", this, fill);
 
-    for(p=this->arr; p; p=p->next) {
-        if(p->index == index)
-            return p;
-    }
-
-    for(p=this->arr; p; p=p->next) {
-        if(!p->long_val && !p->ptr_val) {
-            p->index = index;
-            return p;
-        }
-    }
-
-    p = MSVCRT_operator_new(sizeof(IOS_BASE_iosarray));
-    p->next = this->arr;
-    p->index = index;
-    p->long_val = 0;
-    p->ptr_val = NULL;
-    this->arr = p;
-    return p;
+    this->fillch = fill;
+    return ret;
 }
 
-/* ?iword@ios_base@std@@QAEAAJH@Z */
-/* ?iword@ios_base@std@@QEAAAEAJH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_iword, 8)
-LONG* __thiscall ios_base_iword(ios_base *this, int index)
+/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ */
+/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_fill_get, 4)
+char __thiscall basic_ios_char_fill_get(basic_ios_char *this)
 {
-    TRACE("(%p %d)\n", this, index);
-    return &ios_base_Findarr(this, index)->long_val;
+    TRACE("(%p)\n", this);
+    return this->fillch;
 }
 
-/* ?pword@ios_base@std@@QAEAAPAXH@Z */
-/* ?pword@ios_base@std@@QEAAAEAPEAXH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_pword, 8)
-void** __thiscall ios_base_pword(ios_base *this, int index)
+/* ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
+/* ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_imbue, 12)
+locale *__thiscall basic_ios_char_imbue(basic_ios_char *this, locale *ret, const locale *loc)
 {
-    TRACE("(%p %d)\n", this, index);
-    return &ios_base_Findarr(this, index)->ptr_val;
-}
+    TRACE("(%p %p %p)\n", this, ret, loc);
 
-/* ?register_callback@ios_base@std@@QAEXP6AXW4event@12@AAV12@H@ZH@Z */
-/* ?register_callback@ios_base@std@@QEAAXP6AXW4event@12@AEAV12@H@ZH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_register_callback, 12)
-void __thiscall ios_base_register_callback(ios_base *this, IOS_BASE_event_callback callback, int index)
-{
-    IOS_BASE_fnarray *event;
+    if(this->strbuf) {
+        basic_streambuf_char_pubimbue(this->strbuf, ret, loc);
+        locale_dtor(ret);
+    }
 
-    TRACE("(%p %p %d)\n", this, callback, index);
+    return ios_base_imbue(&this->base, ret, loc);
+}
 
-    event = MSVCRT_operator_new(sizeof(IOS_BASE_fnarray));
-    event->next = this->calls;
-    event->index = index;
-    event->event_handler = callback;
-    this->calls = event;
+/* ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDDD@Z */
+/* ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADDD@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_narrow, 12)
+char __thiscall basic_ios_char_narrow(basic_ios_char *this, char ch, char def)
+{
+    TRACE("(%p %c %c)\n", this, ch, def);
+    return ctype_char_narrow_ch(ctype_char_use_facet(this->strbuf->loc), ch, def);
 }
 
-/* ?clear@ios_base@std@@QAEXH_N@Z */
-/* ?clear@ios_base@std@@QEAAXH_N@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_clear_reraise, 12)
-void __thiscall ios_base_clear_reraise(ios_base *this, IOSB_iostate state, MSVCP_bool reraise)
+/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z */
+/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAV32@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_rdbuf_set, 8)
+basic_streambuf_char* __thiscall basic_ios_char_rdbuf_set(basic_ios_char *this, basic_streambuf_char *streambuf)
 {
-    TRACE("(%p %x %x)\n", this, state, reraise);
+    basic_streambuf_char *ret = this->strbuf;
 
-    this->state = state & IOSTATE_mask;
-    if(!(this->state & this->except))
-        return;
+    TRACE("(%p %p)\n", this, streambuf);
 
-    if(reraise)
-        throw_exception(EXCEPTION_RERAISE, NULL);
-    else if(this->state & this->except & IOSTATE_eofbit)
-        throw_exception(EXCEPTION_FAILURE, "eofbit is set");
-    else if(this->state & this->except & IOSTATE_failbit)
-        throw_exception(EXCEPTION_FAILURE, "failbit is set");
-    else if(this->state & this->except & IOSTATE_badbit)
-        throw_exception(EXCEPTION_FAILURE, "badbit is set");
-    else if(this->state & this->except & IOSTATE__Hardfail)
-        throw_exception(EXCEPTION_FAILURE, "_Hardfail is set");
+    this->strbuf = streambuf;
+    basic_ios_char_clear(this, IOSTATE_goodbit);
+    return ret;
 }
 
-/* ?clear@ios_base@std@@QAEXH@Z */
-/* ?clear@ios_base@std@@QEAAXH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_clear, 8)
-void __thiscall ios_base_clear(ios_base *this, IOSB_iostate state)
+/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ */
+/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_rdbuf_get, 4)
+basic_streambuf_char* __thiscall basic_ios_char_rdbuf_get(const basic_ios_char *this)
 {
-    ios_base_clear_reraise(this, state, FALSE);
+    TRACE("(%p)\n", this);
+    return this->strbuf;
 }
 
-/* ?clear@ios_base@std@@QAEXI@Z */
-/* ?clear@ios_base@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_clear_unsigned, 8)
-void __thiscall ios_base_clear_unsigned(ios_base *this, unsigned int state)
+/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z */
+/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_setstate_reraise, 12)
+void __thiscall basic_ios_char_setstate_reraise(basic_ios_char *this, IOSB_iostate state, MSVCP_bool reraise)
 {
-    ios_base_clear_reraise(this, (IOSB_iostate)state, FALSE);
+    TRACE("(%p %x %x)\n", this, state, reraise);
+
+    if(state != IOSTATE_goodbit)
+        basic_ios_char_clear_reraise(this, this->base.state | state, reraise);
 }
 
-/* ?exceptions@ios_base@std@@QAEXH@Z */
-/* ?exceptions@ios_base@std@@QEAAXH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_exceptions_set, 8)
-void __thiscall ios_base_exceptions_set(ios_base *this, IOSB_iostate state)
+/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z */
+/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_setstate, 8)
+void __thiscall basic_ios_char_setstate(basic_ios_char *this, unsigned int state)
 {
-    TRACE("(%p %x)\n", this, state);
-    this->except = state & IOSTATE_mask;
-    ios_base_clear(this, this->state);
+    basic_ios_char_setstate_reraise(this, (IOSB_iostate)state, FALSE);
 }
 
-/* ?exceptions@ios_base@std@@QAEXI@Z */
-/* ?exceptions@ios_base@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_exceptions_set_unsigned, 8)
-void __thiscall ios_base_exceptions_set_unsigned(ios_base *this, unsigned int state)
+/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z */
+/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@PEAV32@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_tie_set, 8)
+basic_ostream_char* __thiscall basic_ios_char_tie_set(basic_ios_char *this, basic_ostream_char *ostream)
 {
-    TRACE("(%p %x)\n", this, state);
-    ios_base_exceptions_set(this, state);
+    basic_ostream_char *ret = this->stream;
+
+    TRACE("(%p %p)\n", this, ostream);
+
+    this->stream = ostream;
+    return ret;
 }
 
-/* ?exceptions@ios_base@std@@QBEHXZ */
-/* ?exceptions@ios_base@std@@QEBAHXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_exceptions_get, 4)
-IOSB_iostate __thiscall ios_base_exceptions_get(ios_base *this)
+/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ */
+/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_tie_get, 4)
+basic_ostream_char* __thiscall basic_ios_char_tie_get(const basic_ios_char *this)
 {
     TRACE("(%p)\n", this);
-    return this->except;
+    return this->stream;
 }
 
-/* ?copyfmt@ios_base@std@@QAEAAV12@ABV12@@Z */
-/* ?copyfmt@ios_base@std@@QEAAAEAV12@AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_copyfmt, 8)
-ios_base* __thiscall ios_base_copyfmt(ios_base *this, const ios_base *rhs)
+/* ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z */
+/* ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_char_widen, 8)
+char __thiscall basic_ios_char_widen(basic_ios_char *this, char ch)
 {
-    TRACE("(%p %p)\n", this, rhs);
-
-    if(this != rhs) {
-        IOS_BASE_iosarray *arr_cur;
-        IOS_BASE_fnarray *event_cur;
-
-        ios_base_Tidy(this);
-
-        for(arr_cur=rhs->arr; arr_cur; arr_cur=arr_cur->next) {
-            if(arr_cur->long_val)
-                *ios_base_iword(this, arr_cur->index) = arr_cur->long_val;
-            if(arr_cur->ptr_val)
-                *ios_base_pword(this, arr_cur->index) = arr_cur->ptr_val;
-        }
-        this->stdstr = rhs->stdstr;
-        this->fmtfl = rhs->fmtfl;
-        this->prec = rhs->prec;
-        this->wide = rhs->wide;
-        locale_operator_assign(this->loc, rhs->loc);
+    TRACE("(%p %c)\n", this, ch);
+    return ctype_char_widen_ch(ctype_char_use_facet(this->strbuf->loc), ch);
+}
 
-        for(event_cur=rhs->calls; event_cur; event_cur=event_cur->next)
-            ios_base_register_callback(this, event_cur->event_handler, event_cur->index);
 
-        ios_base_Callfns(this, EVENT_copyfmt_event);
-        ios_base_exceptions_set(this, rhs->except);
-    }
+/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ */
+/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_ctor, 4)
+basic_ios_wchar* __thiscall basic_ios_wchar_ctor(basic_ios_wchar *this)
+{
+    TRACE("(%p)\n", this);
 
+    ios_base_ctor(&this->base);
+    this->base.vtable = &MSVCP_basic_ios_wchar_vtable;
     return this;
 }
 
-/* ??4ios_base@std@@QAEAAV01@ABV01@@Z */
-/* ??4ios_base@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_assign, 8)
-ios_base* __thiscall ios_base_assign(ios_base *this, const ios_base *right)
+/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAE@XZ */
+/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_short_ctor, 4)
+basic_ios_wchar* __thiscall basic_ios_short_ctor(basic_ios_wchar *this)
 {
-    TRACE("(%p %p)\n", this, right);
-
-    if(this != right) {
-        this->state = right->state;
-        ios_base_copyfmt(this, right);
-    }
-
+    basic_ios_wchar_ctor(this);
+    this->base.vtable = &MSVCP_basic_ios_short_vtable;
     return this;
 }
 
-/* ?fail@ios_base@std@@QBE_NXZ */
-/* ?fail@ios_base@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_fail, 4)
-MSVCP_bool __thiscall ios_base_fail(const ios_base *this)
+/* ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAEXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z */
+/* ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z */
+/* ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAEXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z */
+/* ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_init, 12)
+void __thiscall basic_ios_wchar_init(basic_ios_wchar *this, basic_streambuf_wchar *streambuf, MSVCP_bool isstd)
 {
-    TRACE("(%p)\n", this);
-    return (this->state & (IOSTATE_failbit|IOSTATE_badbit)) != 0;
+    TRACE("(%p %p %x)\n", this, streambuf, isstd);
+    ios_base_Init(&this->base);
+    this->strbuf = streambuf;
+    this->stream = NULL;
+    this->fillch = ' ';
+
+    if(!streambuf)
+        ios_base_setstate(&this->base, IOSTATE_badbit);
+
+    if(isstd)
+        FIXME("standard streams not handled yet\n");
 }
 
-/* ??7ios_base@std@@QBE_NXZ */
-/* ??7ios_base@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_op_succ, 4)
-MSVCP_bool __thiscall ios_base_op_succ(const ios_base *this)
+/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_ctor_streambuf, 8)
+basic_ios_wchar* __thiscall basic_ios_wchar_ctor_streambuf(basic_ios_wchar *this, basic_streambuf_wchar *strbuf)
 {
-    TRACE("(%p)\n", this);
-    return ios_base_fail(this);
+    TRACE("(%p %p)\n", this, strbuf);
+
+    basic_ios_wchar_ctor(this);
+    basic_ios_wchar_init(this, strbuf, FALSE);
+    return this;
 }
 
-/* ??Bios_base@std@@QBEPAXXZ */
-/* ??Bios_base@std@@QEBAPEAXXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_op_fail, 4)
-void* __thiscall ios_base_op_fail(const ios_base *this)
+/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_short_ctor_streambuf, 8)
+basic_ios_wchar* __thiscall basic_ios_short_ctor_streambuf(basic_ios_wchar *this, basic_streambuf_wchar *strbuf)
 {
-    TRACE("(%p)\n", this);
-    return ios_base_fail(this) ? NULL : (void*)this;
+    basic_ios_wchar_ctor_streambuf(this, strbuf);
+    this->base.vtable = &MSVCP_basic_ios_short_vtable;
+    return this;
 }
 
-/* ?_Addstd@ios_base@std@@SAXPAV12@@Z */
-/* ?_Addstd@ios_base@std@@SAXPEAV12@@Z */
-void CDECL ios_base_Addstd(ios_base *add)
+/* ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
+/* ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
+/* ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAE@XZ */
+/* ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_dtor, 4)
+void __thiscall basic_ios_wchar_dtor(basic_ios_wchar *this)
 {
-    FIXME("(%p) stub\n", add);
+    TRACE("(%p)\n", this);
+    ios_base_dtor(&this->base);
 }
 
-/* ?_Init@ios_base@std@@IAEXXZ */
-/* ?_Init@ios_base@std@@IEAAXXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_Init, 4)
-void __thiscall ios_base_Init(ios_base *this)
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_vector_dtor, 8)
+basic_ios_wchar* __thiscall basic_ios_wchar_vector_dtor(basic_ios_wchar *this, unsigned int flags)
 {
-    TRACE("(%p)\n", this);
+    TRACE("(%p %x)\n", this, flags);
+    if(flags & 2) {
+        /* we have an array, with the number of elements stored before the first object */
+        INT_PTR i, *ptr = (INT_PTR *)this-1;
 
-    this->stdstr = 0;
-    this->state = this->except = IOSTATE_goodbit;
-    this->fmtfl = FMTFLAG_skipws | FMTFLAG_dec;
-    this->prec = 6;
-    this->wide = 0;
-    this->arr = NULL;
-    this->calls = NULL;
-    this->loc = MSVCRT_operator_new(sizeof(locale));
-    locale_ctor(this->loc);
+        for(i=*ptr-1; i>=0; i--)
+            basic_ios_wchar_dtor(this+i);
+        MSVCRT_operator_delete(ptr);
+    } else {
+        basic_ios_wchar_dtor(this);
+        if(flags & 1)
+            MSVCRT_operator_delete(this);
+    }
+
+    return this;
 }
 
-/* ?bad@ios_base@std@@QBE_NXZ */
-/* ?bad@ios_base@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_bad, 4)
-MSVCP_bool __thiscall ios_base_bad(const ios_base *this)
+/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z */
+/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z */
+/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z */
+/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_clear_reraise, 12)
+void __thiscall basic_ios_wchar_clear_reraise(basic_ios_wchar *this, IOSB_iostate state, MSVCP_bool reraise)
 {
-    TRACE("(%p)\n", this);
-    return (this->state & IOSTATE_badbit) != 0;
+    TRACE("(%p %x %x)\n", this, state, reraise);
+    ios_base_clear_reraise(&this->base, state | (this->strbuf ? IOSTATE_goodbit : IOSTATE_badbit), reraise);
 }
 
-/* ?eof@ios_base@std@@QBE_NXZ */
-/* ?eof@ios_base@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_eof, 4)
-MSVCP_bool __thiscall ios_base_eof(const ios_base *this)
+/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z */
+/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z */
+/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z */
+/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_clear, 8)
+void __thiscall basic_ios_wchar_clear(basic_ios_wchar *this, unsigned int state)
 {
-    TRACE("(%p)\n", this);
-    return (this->state & IOSTATE_eofbit) != 0;
+    basic_ios_wchar_clear_reraise(this, (IOSB_iostate)state, FALSE);
 }
 
-/* ?flags@ios_base@std@@QAEHH@Z */
-/* ?flags@ios_base@std@@QEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_flags_set, 8)
-IOSB_fmtflags __thiscall ios_base_flags_set(ios_base *this, IOSB_fmtflags flags)
+/* ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEAAV12@ABV12@@Z */
+/* ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEBV12@@Z */
+/* ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEAAV12@ABV12@@Z */
+/* ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEBV12@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_copyfmt, 8)
+basic_ios_wchar* __thiscall basic_ios_wchar_copyfmt(basic_ios_wchar *this, basic_ios_wchar *copy)
 {
-    IOSB_fmtflags ret = this->fmtfl;
-
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %p)\n", this, copy);
+    if(this == copy)
+        return this;
 
-    this->fmtfl = flags & FMTFLAG_mask;
-    return ret;
+    this->stream = copy->stream;
+    this->fillch = copy->fillch;
+    ios_base_copyfmt(&this->base, &copy->base);
+    return this;
 }
 
-/* ?flags@ios_base@std@@QBEHXZ */
-/* ?flags@ios_base@std@@QEBAHXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_flags_get, 4)
-IOSB_fmtflags __thiscall ios_base_flags_get(const ios_base *this)
+/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE_W_W@Z */
+/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA_W_W@Z */
+/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEGG@Z */
+/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAGG@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_fill_set, 8)
+wchar_t __thiscall basic_ios_wchar_fill_set(basic_ios_wchar *this, wchar_t fill)
 {
-    TRACE("(%p)\n", this);
-    return this->fmtfl;
-}
+    wchar_t ret = this->fillch;
 
-/* ?getloc@ios_base@std@@QBE?AVlocale@2@XZ */
-/* ?getloc@ios_base@std@@QEBA?AVlocale@2@XZ */
-DEFINE_THISCALL_WRAPPER(ios_base_getloc, 8)
-locale* __thiscall ios_base_getloc(const ios_base *this, locale *ret)
-{
-    TRACE("(%p)\n", this);
-    return locale_copy_ctor(ret, this->loc);
-}
+    TRACE("(%p %c)\n", this, fill);
 
-/* ?good@ios_base@std@@QBE_NXZ */
-/* ?good@ios_base@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_good, 4)
-MSVCP_bool __thiscall ios_base_good(const ios_base *this)
-{
-    TRACE("(%p)\n", this);
-    return this->state == IOSTATE_goodbit;
+    this->fillch = fill;
+    return ret;
 }
 
-/* ?imbue@ios_base@std@@QAE?AVlocale@2@ABV32@@Z */
-/* ?imbue@ios_base@std@@QEAA?AVlocale@2@AEBV32@@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_imbue, 12)
-locale* __thiscall ios_base_imbue(ios_base *this, locale *ret, const locale *loc)
+/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ */
+/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WXZ */
+/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGXZ */
+/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGXZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_fill_get, 4)
+wchar_t __thiscall basic_ios_wchar_fill_get(basic_ios_wchar *this)
 {
-    TRACE("(%p %p)\n", this, loc);
-    *ret = *this->loc;
-    locale_copy_ctor(this->loc, loc);
-    return ret;
+    TRACE("(%p)\n", this);
+    return this->fillch;
 }
 
-/* ?precision@ios_base@std@@QAEHH@Z */
-/* ?precision@ios_base@std@@QEAA_J_J@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_precision_set, 12)
-streamsize __thiscall ios_base_precision_set(ios_base *this, streamsize precision)
+/* ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
+/* ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
+/* ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
+/* ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_imbue, 12)
+locale *__thiscall basic_ios_wchar_imbue(basic_ios_wchar *this, locale *ret, const locale *loc)
 {
-    streamsize ret = this->prec;
+    TRACE("(%p %p %p)\n", this, ret, loc);
 
-    TRACE("(%p %s)\n", this, wine_dbgstr_longlong(precision));
+    if(this->strbuf)
+        return basic_streambuf_wchar_pubimbue(this->strbuf, ret, loc);
 
-    this->prec = precision;
+    locale_copy_ctor(ret, loc);
     return ret;
 }
 
-/* ?precision@ios_base@std@@QBEHXZ */
-/* ?precision@ios_base@std@@QEBA_JXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_precision_get, 4)
-streamsize __thiscall ios_base_precision_get(const ios_base *this)
-{
-    TRACE("(%p)\n", this);
-    return this->prec;
-}
-
-/* ?rdstate@ios_base@std@@QBEHXZ */
-/* ?rdstate@ios_base@std@@QEBAHXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_rdstate, 4)
-IOSB_iostate __thiscall ios_base_rdstate(const ios_base *this)
+/* ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBED_WD@Z */
+/* ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAD_WD@Z */
+/* ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEDGD@Z */
+/* ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBADGD@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_narrow, 12)
+char __thiscall basic_ios_wchar_narrow(basic_ios_wchar *this, wchar_t ch, char def)
 {
-    TRACE("(%p)\n", this);
-    return this->state;
+    TRACE("(%p %c %c)\n", this, ch, def);
+    return ctype_wchar_narrow_ch(ctype_wchar_use_facet(this->strbuf->loc), ch, def);
 }
 
-/* ?setf@ios_base@std@@QAEHHH@Z */
-/* ?setf@ios_base@std@@QEAAHHH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_setf_mask, 12)
-IOSB_fmtflags __thiscall ios_base_setf_mask(ios_base *this, IOSB_fmtflags flags, IOSB_fmtflags mask)
+/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z */
+/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEAV32@@Z */
+/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z */
+/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAV32@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_rdbuf_set, 8)
+basic_streambuf_wchar* __thiscall basic_ios_wchar_rdbuf_set(basic_ios_wchar *this, basic_streambuf_wchar *streambuf)
 {
-    IOSB_fmtflags ret = this->fmtfl;
+    basic_streambuf_wchar *ret = this->strbuf;
 
-    TRACE("(%p %x %x)\n", this, flags, mask);
+    TRACE("(%p %p)\n", this, streambuf);
 
-    this->fmtfl = (this->fmtfl & (~mask)) | (flags & mask & FMTFLAG_mask);
+    this->strbuf = streambuf;
+    basic_ios_wchar_clear(this, IOSTATE_goodbit);
     return ret;
 }
 
-/* ?setf@ios_base@std@@QAEHH@Z */
-/* ?setf@ios_base@std@@QEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_setf, 8)
-IOSB_fmtflags __thiscall ios_base_setf(ios_base *this, IOSB_fmtflags flags)
+/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ */
+/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ */
+/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ */
+/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_rdbuf_get, 4)
+basic_streambuf_wchar* __thiscall basic_ios_wchar_rdbuf_get(const basic_ios_wchar *this)
 {
-    return ios_base_setf_mask(this, flags, ~0);
+    TRACE("(%p)\n", this);
+    return this->strbuf;
 }
 
-/* ?setstate@ios_base@std@@QAEXH_N@Z */
-/* ?setstate@ios_base@std@@QEAAXH_N@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_setstate_reraise, 12)
-void __thiscall ios_base_setstate_reraise(ios_base *this, IOSB_iostate state, MSVCP_bool reraise)
+/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z */
+/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z */
+/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z */
+/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_setstate_reraise, 12)
+void __thiscall basic_ios_wchar_setstate_reraise(basic_ios_wchar *this, IOSB_iostate state, MSVCP_bool reraise)
 {
     TRACE("(%p %x %x)\n", this, state, reraise);
 
     if(state != IOSTATE_goodbit)
-        ios_base_clear_reraise(this, this->state | state, reraise);
+        basic_ios_wchar_clear_reraise(this, this->base.state | state, reraise);
 }
 
-/* ?setstate@ios_base@std@@QAEXH@Z */
-/* ?setstate@ios_base@std@@QEAAXH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_setstate, 8)
-void __thiscall ios_base_setstate(ios_base *this, IOSB_iostate state)
+/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z */
+/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z */
+/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z */
+/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_setstate, 8)
+void __thiscall basic_ios_wchar_setstate(basic_ios_wchar *this, IOSB_iostate state)
 {
-    ios_base_setstate_reraise(this, state, FALSE);
+    basic_ios_wchar_setstate_reraise(this, state, FALSE);
 }
 
-/* ?setstate@ios_base@std@@QAEXI@Z */
-/* ?setstate@ios_base@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_setstate_unsigned, 8)
-void __thiscall ios_base_setstate_unsigned(ios_base *this, unsigned int state)
+/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z */
+/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PEAV32@@Z */
+/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z */
+/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@PEAV32@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_tie_set, 8)
+basic_ostream_wchar* __thiscall basic_ios_wchar_tie_set(basic_ios_wchar *this, basic_ostream_wchar *ostream)
 {
-    ios_base_setstate_reraise(this, (IOSB_iostate)state, FALSE);
-}
-
-/* ?sync_with_stdio@ios_base@std@@SA_N_N@Z */
-MSVCP_bool CDECL ios_base_sync_with_stdio(MSVCP_bool sync)
-{
-    _Lockit lock;
-    MSVCP_bool ret;
+    basic_ostream_wchar *ret = this->stream;
 
-    TRACE("(%x)\n", sync);
+    TRACE("(%p %p)\n", this, ostream);
 
-    _Lockit_ctor_locktype(&lock, _LOCK_STREAM);
-    ret = ios_base_Sync;
-    ios_base_Sync = sync;
-    _Lockit_dtor(&lock);
+    this->stream = ostream;
     return ret;
 }
 
-/* ?unsetf@ios_base@std@@QAEXH@Z */
-/* ?unsetf@ios_base@std@@QEAAXH@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_unsetf, 8)
-void __thiscall ios_base_unsetf(ios_base *this, IOSB_fmtflags flags)
+/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ */
+/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ */
+/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ */
+/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_tie_get, 4)
+basic_ostream_wchar* __thiscall basic_ios_wchar_tie_get(const basic_ios_wchar *this)
 {
-    TRACE("(%p %x)\n", this, flags);
-    this->fmtfl &= ~flags;
+    TRACE("(%p)\n", this);
+    return this->stream;
 }
 
-/* ?width@ios_base@std@@QAEHH@Z */
-/* ?width@ios_base@std@@QEAA_J_J@Z */
-DEFINE_THISCALL_WRAPPER(ios_base_width_set, 12)
-streamsize __thiscall ios_base_width_set(ios_base *this, streamsize width)
+/* ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WD@Z */
+/* ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WD@Z */
+/* ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGD@Z */
+/* ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGD@Z */
+DEFINE_THISCALL_WRAPPER(basic_ios_wchar_widen, 8)
+wchar_t __thiscall basic_ios_wchar_widen(basic_ios_wchar *this, char ch)
 {
-    streamsize ret = this->wide;
-
-    TRACE("(%p %s)\n", this, wine_dbgstr_longlong(width));
-
-    this->wide = width;
-    return ret;
+    TRACE("(%p %c)\n", this, ch);
+    return ctype_wchar_widen_ch(ctype_wchar_use_facet(this->strbuf->loc), ch);
 }
 
-/* ?width@ios_base@std@@QBEHXZ */
-/* ?width@ios_base@std@@QEBA_JXZ */
-DEFINE_THISCALL_WRAPPER(ios_base_width_get, 4)
-streamsize __thiscall ios_base_width_get(ios_base *this)
+/* Caution: basic_ostream uses virtual inheritance.
+ * All constructors have additional parameter that says if base class should be initialized.
+ * Base class needs to be accessed using vbtable.
+ */
+static inline basic_ios_char* basic_ostream_char_get_basic_ios(basic_ostream_char *this)
 {
-    TRACE("(%p)\n", this);
-    return this->wide;
+    return (basic_ios_char*)((char*)this+this->vbtable[1]);
 }
 
-/* ?xalloc@ios_base@std@@SAHXZ */
-int CDECL ios_base_xalloc(void)
+static inline basic_ios_char* basic_ostream_char_to_basic_ios(basic_ostream_char *ptr)
 {
-    _Lockit lock;
-    int ret;
-
-    TRACE("\n");
+    return (basic_ios_char*)((char*)ptr+basic_ostream_char_vbtable[1]);
+}
 
-    _Lockit_ctor_locktype(&lock, _LOCK_STREAM);
-    ret = ios_base_Index++;
-    _Lockit_dtor(&lock);
-    return ret;
+static inline basic_ostream_char* basic_ostream_char_from_basic_ios(basic_ios_char *ptr)
+{
+    return (basic_ostream_char*)((char*)ptr-basic_ostream_char_vbtable[1]);
 }
 
-/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IAE@XZ */
-/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@IEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_ctor, 4)
-basic_ios_char* __thiscall basic_ios_char_ctor(basic_ios_char *this)
+/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
+/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_ctor, 16)
+basic_ostream_char* __thiscall basic_ostream_char_ctor(basic_ostream_char *this,
+        basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
 {
-    TRACE("(%p)\n", this);
+    basic_ios_char *base;
 
-    ios_base_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_ios_char_vtable;
+    TRACE("(%p %p %d %d)\n", this, strbuf, isstd, virt_init);
+
+    if(virt_init) {
+        this->vbtable = basic_ostream_char_vbtable;
+        base = basic_ostream_char_get_basic_ios(this);
+        basic_ios_char_ctor(base);
+    }else {
+        base = basic_ostream_char_get_basic_ios(this);
+    }
+
+    base->base.vtable = &MSVCP_basic_ostream_char_vtable;
+    basic_ios_char_init(base, strbuf, isstd);
     return this;
 }
 
-/* ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IAEXPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z */
-/* ?init@?$basic_ios@DU?$char_traits@D@std@@@std@@IEAAXPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_init, 12)
-void __thiscall basic_ios_char_init(basic_ios_char *this, basic_streambuf_char *streambuf, MSVCP_bool isstd)
+/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
+/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_ctor_uninitialized, 16)
+basic_ostream_char* __thiscall basic_ostream_char_ctor_uninitialized(basic_ostream_char *this,
+        int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
 {
-    TRACE("(%p %p %x)\n", this, streambuf, isstd);
-    ios_base_Init(&this->base);
-    this->strbuf = streambuf;
-    this->stream = NULL;
-    this->fillch = ' ';
+    basic_ios_char *base;
 
-    if(!streambuf)
-        ios_base_setstate(&this->base, IOSTATE_badbit);
+    TRACE("(%p %d %x)\n", this, uninitialized, addstd);
 
-    if(isstd)
-        FIXME("standard streams not handled yet\n");
+    if(virt_init) {
+        this->vbtable = basic_ostream_char_vbtable;
+        base = basic_ostream_char_get_basic_ios(this);
+        basic_ios_char_ctor(base);
+    }else {
+        base = basic_ostream_char_get_basic_ios(this);
+    }
+
+    base->base.vtable = &MSVCP_basic_ostream_char_vtable;
+    if(addstd)
+        ios_base_Addstd(&base->base);
+    return this;
 }
 
-/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-/* ??0?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_ctor_streambuf, 8)
-basic_ios_char* __thiscall basic_ios_char_ctor_streambuf(basic_ios_char *this, basic_streambuf_char *strbuf)
+/* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ */
+/* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_dtor, 4)
+void __thiscall basic_ostream_char_dtor(basic_ios_char *base)
 {
-    TRACE("(%p %p)\n", this, strbuf);
+    basic_ostream_char *this = basic_ostream_char_from_basic_ios(base);
 
-    basic_ios_char_ctor(this);
-    basic_ios_char_init(this, strbuf, FALSE);
-    return this;
+    /* don't destroy virtual base here */
+    TRACE("(%p)\n", this);
 }
 
-/* ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_ios@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_dtor, 4)
-void __thiscall basic_ios_char_dtor(basic_ios_char *this)
+/* ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
+/* ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_vbase_dtor, 4)
+void __thiscall basic_ostream_char_vbase_dtor(basic_ostream_char *this)
 {
     TRACE("(%p)\n", this);
-    ios_base_dtor(&this->base);
+    basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(this));
+    basic_ios_char_dtor(basic_ostream_char_get_basic_ios(this));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_ios_char_vector_dtor, 8)
-basic_ios_char* __thiscall basic_ios_char_vector_dtor(basic_ios_char *this, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_vector_dtor, 8)
+basic_ostream_char* __thiscall basic_ostream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
 {
+    basic_ostream_char *this = basic_ostream_char_from_basic_ios(base);
+
     TRACE("(%p %x)\n", this, flags);
+
     if(flags & 2) {
         /* we have an array, with the number of elements stored before the first object */
         INT_PTR i, *ptr = (INT_PTR *)this-1;
 
         for(i=*ptr-1; i>=0; i--)
-            basic_ios_char_dtor(this+i);
+            basic_ostream_char_vbase_dtor(this+i);
         MSVCRT_operator_delete(ptr);
     } else {
-        basic_ios_char_dtor(this);
+        basic_ostream_char_vbase_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -4949,3076 +4024,637 @@ basic_ios_char* __thiscall basic_ios_char_vector_dtor(basic_ios_char *this, unsi
     return this;
 }
 
-/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z */
-/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_clear_reraise, 12)
-void __thiscall basic_ios_char_clear_reraise(basic_ios_char *this, IOSB_iostate state, MSVCP_bool reraise)
+/* ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ */
+/* ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_flush, 4)
+basic_ostream_char* __thiscall basic_ostream_char_flush(basic_ostream_char *this)
 {
-    TRACE("(%p %x %x)\n", this, state, reraise);
-    ios_base_clear_reraise(&this->base, state | (this->strbuf ? IOSTATE_goodbit : IOSTATE_badbit), reraise);
-}
+    /* this function is not matching C++ specification */
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
-/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z */
-/* ?clear@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_clear, 8)
-void __thiscall basic_ios_char_clear(basic_ios_char *this, unsigned int state)
-{
-    basic_ios_char_clear_reraise(this, (IOSB_iostate)state, FALSE);
+    TRACE("(%p)\n", this);
+
+    if(basic_ios_char_rdbuf_get(base) && ios_base_good(&base->base)
+            && basic_streambuf_char_pubsync(basic_ios_char_rdbuf_get(base))==-1)
+        basic_ios_char_setstate(base, IOSTATE_badbit);
+    return this;
 }
 
-/* ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEAAV12@ABV12@@Z */
-/* ?copyfmt@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_copyfmt, 8)
-basic_ios_char* __thiscall basic_ios_char_copyfmt(basic_ios_char *this, basic_ios_char *copy)
+/* ?flush@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z */
+/* ?flush@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
+basic_ostream_char* __cdecl flush_ostream_char(basic_ostream_char *ostream)
 {
-    TRACE("(%p %p)\n", this, copy);
-    if(this == copy)
-        return this;
-
-    this->stream = copy->stream;
-    this->fillch = copy->fillch;
-    ios_base_copyfmt(&this->base, &copy->base);
-    return this;
+    return basic_ostream_char_flush(ostream);
 }
 
-/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEDD@Z */
-/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAADD@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_fill_set, 8)
-char __thiscall basic_ios_char_fill_set(basic_ios_char *this, char fill)
+/* ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
+/* ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char__Osfx, 4)
+void __thiscall basic_ostream_char__Osfx(basic_ostream_char *this)
 {
-    char ret = this->fillch;
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
-    TRACE("(%p %c)\n", this, fill);
+    TRACE("(%p)\n", this);
 
-    this->fillch = fill;
-    return ret;
+    if(base->base.fmtfl & FMTFLAG_unitbuf)
+        basic_ostream_char_flush(this);
 }
 
-/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ */
-/* ?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADXZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_fill_get, 4)
-char __thiscall basic_ios_char_fill_get(basic_ios_char *this)
+/* ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
+/* ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_osfx, 4)
+void __thiscall basic_ostream_char_osfx(basic_ostream_char *this)
 {
     TRACE("(%p)\n", this);
-    return this->fillch;
+    basic_ostream_char__Osfx(this);
 }
 
-/* ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
-/* ?imbue@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_imbue, 12)
-locale *__thiscall basic_ios_char_imbue(basic_ios_char *this, locale *ret, const locale *loc)
+static BOOL basic_ostream_char_sentry_create(basic_ostream_char *ostr)
 {
-    TRACE("(%p %p %p)\n", this, ret, loc);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
 
-    if(this->strbuf) {
-        basic_streambuf_char_pubimbue(this->strbuf, ret, loc);
-        locale_dtor(ret);
-    }
+    if(basic_ios_char_rdbuf_get(base))
+        call_basic_streambuf_char__Lock(base->strbuf);
 
-    return ios_base_imbue(&this->base, ret, loc);
+    if(ios_base_good(&base->base) && base->stream)
+        basic_ostream_char_flush(base->stream);
+
+    return ios_base_good(&base->base);
 }
 
-/* ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDDD@Z */
-/* ?narrow@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADDD@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_narrow, 12)
-char __thiscall basic_ios_char_narrow(basic_ios_char *this, char ch, char def)
-{
-    TRACE("(%p %c %c)\n", this, ch, def);
-    return ctype_char_narrow_ch(ctype_char_use_facet(this->strbuf->loc), ch, def);
-}
-
-/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PAV32@@Z */
-/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@PEAV32@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_rdbuf_set, 8)
-basic_streambuf_char* __thiscall basic_ios_char_rdbuf_set(basic_ios_char *this, basic_streambuf_char *streambuf)
+static void basic_ostream_char_sentry_destroy(basic_ostream_char *ostr)
 {
-    basic_streambuf_char *ret = this->strbuf;
-
-    TRACE("(%p %p)\n", this, streambuf);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
 
-    this->strbuf = streambuf;
-    basic_ios_char_clear(this, IOSTATE_goodbit);
-    return ret;
-}
+    if(ios_base_good(&base->base) && !__uncaught_exception())
+        basic_ostream_char_osfx(ostr);
 
-/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ */
-/* ?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_rdbuf_get, 4)
-basic_streambuf_char* __thiscall basic_ios_char_rdbuf_get(const basic_ios_char *this)
-{
-    TRACE("(%p)\n", this);
-    return this->strbuf;
+    if(basic_ios_char_rdbuf_get(base))
+        call_basic_streambuf_char__Unlock(base->strbuf);
 }
 
-/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z */
-/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXH_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_setstate_reraise, 12)
-void __thiscall basic_ios_char_setstate_reraise(basic_ios_char *this, IOSB_iostate state, MSVCP_bool reraise)
+/* ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE_NXZ */
+/* ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA_NXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_opfx, 4)
+MSVCP_bool __thiscall basic_ostream_char_opfx(basic_ostream_char *this)
 {
-    TRACE("(%p %x %x)\n", this, state, reraise);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
-    if(state != IOSTATE_goodbit)
-        basic_ios_char_clear_reraise(this, this->base.state | state, reraise);
-}
+    TRACE("(%p)\n", this);
 
-/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXI@Z */
-/* ?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_setstate, 8)
-void __thiscall basic_ios_char_setstate(basic_ios_char *this, unsigned int state)
-{
-    basic_ios_char_setstate_reraise(this, (IOSB_iostate)state, FALSE);
+    if(ios_base_good(&base->base) && base->stream)
+        basic_ostream_char_flush(base->stream);
+    return ios_base_good(&base->base);
 }
 
-/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@PAV32@@Z */
-/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEAAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@PEAV32@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_tie_set, 8)
-basic_ostream_char* __thiscall basic_ios_char_tie_set(basic_ios_char *this, basic_ostream_char *ostream)
+/* ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z */
+/* ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_put, 8)
+basic_ostream_char* __thiscall basic_ostream_char_put(basic_ostream_char *this, char ch)
 {
-    basic_ostream_char *ret = this->stream;
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
-    TRACE("(%p %p)\n", this, ostream);
+    TRACE("(%p %c)\n", this, ch);
 
-    this->stream = ostream;
-    return ret;
-}
+    if(!basic_ostream_char_sentry_create(this)
+            || basic_streambuf_char_sputc(base->strbuf, ch)==EOF) {
+        basic_ostream_char_sentry_destroy(this);
+        basic_ios_char_setstate(base, IOSTATE_badbit);
+        return this;
+    }
 
-/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ */
-/* ?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_tie_get, 4)
-basic_ostream_char* __thiscall basic_ios_char_tie_get(const basic_ios_char *this)
-{
-    TRACE("(%p)\n", this);
-    return this->stream;
+    basic_ostream_char_sentry_destroy(this);
+    return this;
 }
 
-/* ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDD@Z */
-/* ?widen@?$basic_ios@DU?$char_traits@D@std@@@std@@QEBADD@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_char_widen, 8)
-char __thiscall basic_ios_char_widen(basic_ios_char *this, char ch)
+/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@JH@Z */
+/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_seekp, 16)
+basic_ostream_char* __thiscall basic_ostream_char_seekp(basic_ostream_char *this, streamoff off, int way)
 {
-    TRACE("(%p %c)\n", this, ch);
-    return ctype_char_widen_ch(ctype_char_use_facet(this->strbuf->loc), ch);
-}
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
+    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), way);
 
-/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAE@XZ */
-/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_ctor, 4)
-basic_ios_wchar* __thiscall basic_ios_wchar_ctor(basic_ios_wchar *this)
-{
-    TRACE("(%p)\n", this);
+    if(!ios_base_fail(&base->base)) {
+        fpos_int seek;
 
-    ios_base_ctor(&this->base);
-    this->base.vtable = &MSVCP_basic_ios_wchar_vtable;
+        basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
+                &seek, off, way, OPENMODE_out);
+        if(seek.off==0 && seek.pos==-1 && seek.state==0)
+            basic_ios_char_setstate(base, IOSTATE_failbit);
+    }
     return this;
 }
 
-/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IAE@XZ */
-/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@IEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_short_ctor, 4)
-basic_ios_wchar* __thiscall basic_ios_short_ctor(basic_ios_wchar *this)
+/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
+/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_seekp_fpos, 28)
+basic_ostream_char* __thiscall basic_ostream_char_seekp_fpos(basic_ostream_char *this, fpos_int pos)
 {
-    basic_ios_wchar_ctor(this);
-    this->base.vtable = &MSVCP_basic_ios_short_vtable;
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
+
+    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
+
+    if(!ios_base_fail(&base->base)) {
+        fpos_int seek;
+
+        basic_streambuf_char_pubseekpos(basic_ios_char_rdbuf_get(base),
+                &seek, pos, OPENMODE_out);
+        if(seek.off==0 && seek.pos==-1 && seek.state==0)
+            basic_ios_char_setstate(base, IOSTATE_failbit);
+    }
     return this;
 }
 
-/* ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IAEXPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z */
-/* ?init@?$basic_ios@_WU?$char_traits@_W@std@@@std@@IEAAXPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_N@Z */
-/* ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IAEXPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z */
-/* ?init@?$basic_ios@GU?$char_traits@G@std@@@std@@IEAAXPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_init, 12)
-void __thiscall basic_ios_wchar_init(basic_ios_wchar *this, basic_streambuf_wchar *streambuf, MSVCP_bool isstd)
+/* ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ */
+/* ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_tellp, 8)
+fpos_int* __thiscall basic_ostream_char_tellp(basic_ostream_char *this, fpos_int *ret)
 {
-    TRACE("(%p %p %x)\n", this, streambuf, isstd);
-    ios_base_Init(&this->base);
-    this->strbuf = streambuf;
-    this->stream = NULL;
-    this->fillch = ' ';
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
-    if(!streambuf)
-        ios_base_setstate(&this->base, IOSTATE_badbit);
+    TRACE("(%p)\n", this);
 
-    if(isstd)
-        FIXME("standard streams not handled yet\n");
+    if(!ios_base_fail(&base->base)) {
+        basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
+                ret, 0, SEEKDIR_cur, OPENMODE_out);
+    }else {
+        ret->off = 0;
+        ret->pos = -1;
+        ret->state = 0;
+    }
+    return ret;
 }
 
-/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-/* ??0?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_ctor_streambuf, 8)
-basic_ios_wchar* __thiscall basic_ios_wchar_ctor_streambuf(basic_ios_wchar *this, basic_streambuf_wchar *strbuf)
+/* ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@PBDH@Z */
+/* ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEBD_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_write, 16)
+basic_ostream_char* __thiscall basic_ostream_char_write(basic_ostream_char *this, const char *str, streamsize count)
 {
-    TRACE("(%p %p)\n", this, strbuf);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
 
-    basic_ios_wchar_ctor(this);
-    basic_ios_wchar_init(this, strbuf, FALSE);
+    TRACE("(%p %s %s)\n", this, debugstr_a(str), wine_dbgstr_longlong(count));
+
+    if(!basic_ostream_char_sentry_create(this)
+            || basic_streambuf_char_sputn(base->strbuf, str, count)!=count) {
+        basic_ostream_char_sentry_destroy(this);
+        basic_ios_char_setstate(base, IOSTATE_badbit);
+        return this;
+    }
+
+    basic_ostream_char_sentry_destroy(this);
     return this;
 }
 
-/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-/* ??0?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_short_ctor_streambuf, 8)
-basic_ios_wchar* __thiscall basic_ios_short_ctor_streambuf(basic_ios_wchar *this, basic_streambuf_wchar *strbuf)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@F@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@F@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_short, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_short(basic_ostream_char *this, short val)
 {
-    basic_ios_wchar_ctor_streambuf(this, strbuf);
-    this->base.vtable = &MSVCP_basic_ios_short_vtable;
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
+
+    TRACE("(%p %d)\n", this, val);
+
+    if(basic_ostream_char_sentry_create(this)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
+
+        num_put_char_put_long(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base),
+                (ios_base_flags_get(&base->base) & FMTFLAG_basefield & (FMTFLAG_oct | FMTFLAG_hex))
+                ? (LONG)((unsigned short)val) : (LONG)val);
+    }
+    basic_ostream_char_sentry_destroy(this);
+
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_ios@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_ios@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_dtor, 4)
-void __thiscall basic_ios_wchar_dtor(basic_ios_wchar *this)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@G@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@G@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ushort, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_ushort(basic_ostream_char *this, unsigned short val)
 {
-    TRACE("(%p)\n", this);
-    ios_base_dtor(&this->base);
-}
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_vector_dtor, 8)
-basic_ios_wchar* __thiscall basic_ios_wchar_vector_dtor(basic_ios_wchar *this, unsigned int flags)
-{
-    TRACE("(%p %x)\n", this, flags);
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    TRACE("(%p %u)\n", this, val);
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_ios_wchar_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ios_wchar_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+    if(basic_ostream_char_sentry_create(this)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
+
+        num_put_char_put_ulong(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
+    basic_ostream_char_sentry_destroy(this);
 
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z */
-/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z */
-/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z */
-/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_clear_reraise, 12)
-void __thiscall basic_ios_wchar_clear_reraise(basic_ios_wchar *this, IOSB_iostate state, MSVCP_bool reraise)
-{
-    TRACE("(%p %x %x)\n", this, state, reraise);
-    ios_base_clear_reraise(&this->base, state | (this->strbuf ? IOSTATE_goodbit : IOSTATE_badbit), reraise);
-}
-
-/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z */
-/* ?clear@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z */
-/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z */
-/* ?clear@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_clear, 8)
-void __thiscall basic_ios_wchar_clear(basic_ios_wchar *this, unsigned int state)
-{
-    basic_ios_wchar_clear_reraise(this, (IOSB_iostate)state, FALSE);
-}
-
-/* ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEAAV12@ABV12@@Z */
-/* ?copyfmt@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEBV12@@Z */
-/* ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEAAV12@ABV12@@Z */
-/* ?copyfmt@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_copyfmt, 8)
-basic_ios_wchar* __thiscall basic_ios_wchar_copyfmt(basic_ios_wchar *this, basic_ios_wchar *copy)
-{
-    TRACE("(%p %p)\n", this, copy);
-    if(this == copy)
-        return this;
-
-    this->stream = copy->stream;
-    this->fillch = copy->fillch;
-    ios_base_copyfmt(&this->base, &copy->base);
-    return this;
-}
-
-/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE_W_W@Z */
-/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA_W_W@Z */
-/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEGG@Z */
-/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAGG@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_fill_set, 8)
-wchar_t __thiscall basic_ios_wchar_fill_set(basic_ios_wchar *this, wchar_t fill)
-{
-    wchar_t ret = this->fillch;
-
-    TRACE("(%p %c)\n", this, fill);
-
-    this->fillch = fill;
-    return ret;
-}
-
-/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WXZ */
-/* ?fill@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WXZ */
-/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGXZ */
-/* ?fill@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGXZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_fill_get, 4)
-wchar_t __thiscall basic_ios_wchar_fill_get(basic_ios_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return this->fillch;
-}
-
-/* ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
-/* ?imbue@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
-/* ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QAE?AVlocale@2@ABV32@@Z */
-/* ?imbue@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAA?AVlocale@2@AEBV32@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_imbue, 12)
-locale *__thiscall basic_ios_wchar_imbue(basic_ios_wchar *this, locale *ret, const locale *loc)
-{
-    TRACE("(%p %p %p)\n", this, ret, loc);
-
-    if(this->strbuf)
-        return basic_streambuf_wchar_pubimbue(this->strbuf, ret, loc);
-
-    locale_copy_ctor(ret, loc);
-    return ret;
-}
-
-/* ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBED_WD@Z */
-/* ?narrow@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAD_WD@Z */
-/* ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEDGD@Z */
-/* ?narrow@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBADGD@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_narrow, 12)
-char __thiscall basic_ios_wchar_narrow(basic_ios_wchar *this, wchar_t ch, char def)
-{
-    TRACE("(%p %c %c)\n", this, ch, def);
-    return ctype_wchar_narrow_ch(ctype_wchar_use_facet(this->strbuf->loc), ch, def);
-}
-
-/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PAV32@@Z */
-/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@PEAV32@@Z */
-/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PAV32@@Z */
-/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@PEAV32@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_rdbuf_set, 8)
-basic_streambuf_wchar* __thiscall basic_ios_wchar_rdbuf_set(basic_ios_wchar *this, basic_streambuf_wchar *streambuf)
-{
-    basic_streambuf_wchar *ret = this->strbuf;
-
-    TRACE("(%p %p)\n", this, streambuf);
-
-    this->strbuf = streambuf;
-    basic_ios_wchar_clear(this, IOSTATE_goodbit);
-    return ret;
-}
-
-/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ */
-/* ?rdbuf@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_rdbuf_get, 4)
-basic_streambuf_wchar* __thiscall basic_ios_wchar_rdbuf_get(const basic_ios_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return this->strbuf;
-}
-
-/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXH_N@Z */
-/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXH_N@Z */
-/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXH_N@Z */
-/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXH_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_setstate_reraise, 12)
-void __thiscall basic_ios_wchar_setstate_reraise(basic_ios_wchar *this, IOSB_iostate state, MSVCP_bool reraise)
-{
-    TRACE("(%p %x %x)\n", this, state, reraise);
-
-    if(state != IOSTATE_goodbit)
-        basic_ios_wchar_clear_reraise(this, this->base.state | state, reraise);
-}
-
-/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEXI@Z */
-/* ?setstate@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAXI@Z */
-/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEXI@Z */
-/* ?setstate@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAXI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_setstate, 8)
-void __thiscall basic_ios_wchar_setstate(basic_ios_wchar *this, IOSB_iostate state)
-{
-    basic_ios_wchar_setstate_reraise(this, state, FALSE);
-}
-
-/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QAEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PAV32@@Z */
-/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEAAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@PEAV32@@Z */
-/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QAEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@PAV32@@Z */
-/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEAAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@PEAV32@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_tie_set, 8)
-basic_ostream_wchar* __thiscall basic_ios_wchar_tie_set(basic_ios_wchar *this, basic_ostream_wchar *ostream)
-{
-    basic_ostream_wchar *ret = this->stream;
-
-    TRACE("(%p %p)\n", this, ostream);
-
-    this->stream = ostream;
-    return ret;
-}
-
-/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?tie@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_ostream@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ */
-/* ?tie@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_ostream@GU?$char_traits@G@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_tie_get, 4)
-basic_ostream_wchar* __thiscall basic_ios_wchar_tie_get(const basic_ios_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return this->stream;
-}
-
-/* ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QBE_WD@Z */
-/* ?widen@?$basic_ios@_WU?$char_traits@_W@std@@@std@@QEBA_WD@Z */
-/* ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QBEGD@Z */
-/* ?widen@?$basic_ios@GU?$char_traits@G@std@@@std@@QEBAGD@Z */
-DEFINE_THISCALL_WRAPPER(basic_ios_wchar_widen, 8)
-wchar_t __thiscall basic_ios_wchar_widen(basic_ios_wchar *this, char ch)
-{
-    TRACE("(%p %c)\n", this, ch);
-    return ctype_wchar_widen_ch(ctype_wchar_use_facet(this->strbuf->loc), ch);
-}
-
-/* Caution: basic_ostream uses virtual inheritance.
- * All constructors have additional parameter that says if base class should be initialized.
- * Base class needs to be accessed using vbtable.
- */
-static inline basic_ios_char* basic_ostream_char_get_basic_ios(basic_ostream_char *this)
-{
-    return (basic_ios_char*)((char*)this+this->vbtable[1]);
-}
-
-static inline basic_ios_char* basic_ostream_char_to_basic_ios(basic_ostream_char *ptr)
-{
-    return (basic_ios_char*)((char*)ptr+basic_ostream_char_vbtable[1]);
-}
-
-static inline basic_ostream_char* basic_ostream_char_from_basic_ios(basic_ios_char *ptr)
-{
-    return (basic_ostream_char*)((char*)ptr-basic_ostream_char_vbtable[1]);
-}
-
-/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
-/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_ctor, 16)
-basic_ostream_char* __thiscall basic_ostream_char_ctor(basic_ostream_char *this,
-        basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
-{
-    basic_ios_char *base;
-
-    TRACE("(%p %p %d %d)\n", this, strbuf, isstd, virt_init);
-
-    if(virt_init) {
-        this->vbtable = basic_ostream_char_vbtable;
-        base = basic_ostream_char_get_basic_ios(this);
-        basic_ios_char_ctor(base);
-    }else {
-        base = basic_ostream_char_get_basic_ios(this);
-    }
-
-    base->base.vtable = &MSVCP_basic_ostream_char_vtable;
-    basic_ios_char_init(base, strbuf, isstd);
-    return this;
-}
-
-/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
-/* ??0?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_ctor_uninitialized, 16)
-basic_ostream_char* __thiscall basic_ostream_char_ctor_uninitialized(basic_ostream_char *this,
-        int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
-{
-    basic_ios_char *base;
-
-    TRACE("(%p %d %x)\n", this, uninitialized, addstd);
-
-    if(virt_init) {
-        this->vbtable = basic_ostream_char_vbtable;
-        base = basic_ostream_char_get_basic_ios(this);
-        basic_ios_char_ctor(base);
-    }else {
-        base = basic_ostream_char_get_basic_ios(this);
-    }
-
-    base->base.vtable = &MSVCP_basic_ostream_char_vtable;
-    if(addstd)
-        ios_base_Addstd(&base->base);
-    return this;
-}
-
-/* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_ostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_dtor, 4)
-void __thiscall basic_ostream_char_dtor(basic_ios_char *base)
-{
-    basic_ostream_char *this = basic_ostream_char_from_basic_ios(base);
-
-    /* don't destroy virtual base here */
-    TRACE("(%p)\n", this);
-}
-
-/* ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_vbase_dtor, 4)
-void __thiscall basic_ostream_char_vbase_dtor(basic_ostream_char *this)
-{
-    TRACE("(%p)\n", this);
-    basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_ostream_char_get_basic_ios(this));
-}
-
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_vector_dtor, 8)
-basic_ostream_char* __thiscall basic_ostream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
-{
-    basic_ostream_char *this = basic_ostream_char_from_basic_ios(base);
-
-    TRACE("(%p %x)\n", this, flags);
-
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
-
-        for(i=*ptr-1; i>=0; i--)
-            basic_ostream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ostream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
-
-    return this;
-}
-
-/* ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ */
-/* ?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_flush, 4)
-basic_ostream_char* __thiscall basic_ostream_char_flush(basic_ostream_char *this)
-{
-    /* this function is not matching C++ specification */
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(basic_ios_char_rdbuf_get(base) && ios_base_good(&base->base)
-            && basic_streambuf_char_pubsync(basic_ios_char_rdbuf_get(base))==-1)
-        basic_ios_char_setstate(base, IOSTATE_badbit);
-    return this;
-}
-
-/* ?flush@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z */
-/* ?flush@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
-basic_ostream_char* __cdecl flush_ostream_char(basic_ostream_char *ostream)
-{
-    return basic_ostream_char_flush(ostream);
-}
-
-/* ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char__Osfx, 4)
-void __thiscall basic_ostream_char__Osfx(basic_ostream_char *this)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(base->base.fmtfl & FMTFLAG_unitbuf)
-        basic_ostream_char_flush(this);
-}
-
-/* ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ?osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_osfx, 4)
-void __thiscall basic_ostream_char_osfx(basic_ostream_char *this)
-{
-    TRACE("(%p)\n", this);
-    basic_ostream_char__Osfx(this);
-}
-
-static BOOL basic_ostream_char_sentry_create(basic_ostream_char *ostr)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
-
-    if(basic_ios_char_rdbuf_get(base))
-        call_basic_streambuf_char__Lock(base->strbuf);
-
-    if(ios_base_good(&base->base) && base->stream)
-        basic_ostream_char_flush(base->stream);
-
-    return ios_base_good(&base->base);
-}
-
-static void basic_ostream_char_sentry_destroy(basic_ostream_char *ostr)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(ostr);
-
-    if(ios_base_good(&base->base) && !__uncaught_exception())
-        basic_ostream_char_osfx(ostr);
-
-    if(basic_ios_char_rdbuf_get(base))
-        call_basic_streambuf_char__Unlock(base->strbuf);
-}
-
-/* ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE_NXZ */
-/* ?opfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_opfx, 4)
-MSVCP_bool __thiscall basic_ostream_char_opfx(basic_ostream_char *this)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(ios_base_good(&base->base) && base->stream)
-        basic_ostream_char_flush(base->stream);
-    return ios_base_good(&base->base);
-}
-
-/* ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z */
-/* ?put@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_put, 8)
-basic_ostream_char* __thiscall basic_ostream_char_put(basic_ostream_char *this, char ch)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p %c)\n", this, ch);
-
-    if(!basic_ostream_char_sentry_create(this)
-            || basic_streambuf_char_sputc(base->strbuf, ch)==EOF) {
-        basic_ostream_char_sentry_destroy(this);
-        basic_ios_char_setstate(base, IOSTATE_badbit);
-        return this;
-    }
-
-    basic_ostream_char_sentry_destroy(this);
-    return this;
-}
-
-/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@JH@Z */
-/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_seekp, 16)
-basic_ostream_char* __thiscall basic_ostream_char_seekp(basic_ostream_char *this, streamoff off, int way)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), way);
-
-    if(!ios_base_fail(&base->base)) {
-        fpos_int seek;
-
-        basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
-                &seek, off, way, OPENMODE_out);
-        if(seek.off==0 && seek.pos==-1 && seek.state==0)
-            basic_ios_char_setstate(base, IOSTATE_failbit);
-    }
-    return this;
-}
-
-/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
-/* ?seekp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_seekp_fpos, 28)
-basic_ostream_char* __thiscall basic_ostream_char_seekp_fpos(basic_ostream_char *this, fpos_int pos)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
-
-    if(!ios_base_fail(&base->base)) {
-        fpos_int seek;
-
-        basic_streambuf_char_pubseekpos(basic_ios_char_rdbuf_get(base),
-                &seek, pos, OPENMODE_out);
-        if(seek.off==0 && seek.pos==-1 && seek.state==0)
-            basic_ios_char_setstate(base, IOSTATE_failbit);
-    }
-    return this;
-}
-
-/* ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ */
-/* ?tellp@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_tellp, 8)
-fpos_int* __thiscall basic_ostream_char_tellp(basic_ostream_char *this, fpos_int *ret)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(!ios_base_fail(&base->base)) {
-        basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
-                ret, 0, SEEKDIR_cur, OPENMODE_out);
-    }else {
-        ret->off = 0;
-        ret->pos = -1;
-        ret->state = 0;
-    }
-    return ret;
-}
-
-/* ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@PBDH@Z */
-/* ?write@?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEBD_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_write, 16)
-basic_ostream_char* __thiscall basic_ostream_char_write(basic_ostream_char *this, const char *str, streamsize count)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-
-    TRACE("(%p %s %s)\n", this, debugstr_a(str), wine_dbgstr_longlong(count));
-
-    if(!basic_ostream_char_sentry_create(this)
-            || basic_streambuf_char_sputn(base->strbuf, str, count)!=count) {
-        basic_ostream_char_sentry_destroy(this);
-        basic_ios_char_setstate(base, IOSTATE_badbit);
-        return this;
-    }
-
-    basic_ostream_char_sentry_destroy(this);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@F@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@F@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_short, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_short(basic_ostream_char *this, short val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %d)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_long(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base),
-                (ios_base_flags_get(&base->base) & FMTFLAG_basefield & (FMTFLAG_oct | FMTFLAG_hex))
-                ? (LONG)((unsigned short)val) : (LONG)val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@G@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@G@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ushort, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_ushort(basic_ostream_char *this, unsigned short val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %u)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_ulong(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@J@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_int, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_int(basic_ostream_char *this, int val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %d)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_long(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@I@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@I@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@K@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_uint, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_uint(basic_ostream_char *this, unsigned int val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %u)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_ulong(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@M@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_float, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_float(basic_ostream_char *this, float val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %f)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_double(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_double, 12)
-basic_ostream_char* __thiscall basic_ostream_char_print_double(basic_ostream_char *this, double val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %lf)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_double(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@O@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@O@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ldouble, 12)
-basic_ostream_char* __thiscall basic_ostream_char_print_ldouble(basic_ostream_char *this, double val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %lf)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_ldouble(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_streambuf, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_streambuf(basic_ostream_char *this, basic_streambuf_char *val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_badbit;
-    int c = '\n';
-
-    TRACE("(%p %p)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        for(c = basic_streambuf_char_sgetc(val); c!=EOF;
-                c = basic_streambuf_char_snextc(val)) {
-            state = IOSTATE_goodbit;
-
-            if(basic_streambuf_char_sputc(base->strbuf, c) == EOF) {
-                state = IOSTATE_badbit;
-                break;
-            }
-        }
-    }else {
-        state = IOSTATE_badbit;
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    ios_base_width_set(&base->base, 0);
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEBX@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ptr, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_ptr(basic_ostream_char *this, const void *val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_ptr(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_J@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_int64, 12)
-basic_ostream_char* __thiscall basic_ostream_char_print_int64(basic_ostream_char *this, __int64 val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p)\n", this);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_int64(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_K@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_uint64, 12)
-basic_ostream_char* __thiscall basic_ostream_char_print_uint64(basic_ostream_char *this, unsigned __int64 val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p)\n", this);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_uint64(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_N@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_bool, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_bool(basic_ostream_char *this, MSVCP_bool val)
-{
-    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %x)\n", this, val);
-
-    if(basic_ostream_char_sentry_create(this)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_put *numput = num_put_char_use_facet(strbuf->loc);
-        ostreambuf_iterator_char dest = {0, strbuf};
-
-        num_put_char_put_bool(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
-    }
-    basic_ostream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z */
-/* ?endl@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
-basic_ostream_char* __cdecl basic_ostream_char_endl(basic_ostream_char *ostr)
-{
-    TRACE("(%p)\n", ostr);
-
-    basic_ostream_char_put(ostr, '\n');
-    basic_ostream_char_flush(ostr);
-    return ostr;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_func(basic_ostream_char *this,
-        basic_ostream_char* (__cdecl *pfunc)(basic_ostream_char*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(this);
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func_basic_ios, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_func_basic_ios(basic_ostream_char *this,
-        basic_ios_char* (__cdecl *pfunc)(basic_ios_char*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(basic_ostream_char_get_basic_ios(this));
-    return this;
-}
-
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
-/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func_ios_base, 8)
-basic_ostream_char* __thiscall basic_ostream_char_print_func_ios_base(
-        basic_ostream_char *this, ios_base* (__cdecl *pfunc)(ios_base*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(&basic_ostream_char_get_basic_ios(this)->base);
-    return this;
-}
-
-/* Caution: basic_ostream uses virtual inheritance. */
-static inline basic_ios_wchar* basic_ostream_wchar_get_basic_ios(basic_ostream_wchar *this)
-{
-    return (basic_ios_wchar*)((char*)this+this->vbtable[1]);
-}
-
-static inline basic_ios_wchar* basic_ostream_wchar_to_basic_ios(basic_ostream_wchar *ptr)
-{
-    return (basic_ios_wchar*)((char*)ptr+basic_ostream_wchar_vbtable[1]);
-}
-
-static inline basic_ostream_wchar* basic_ostream_wchar_from_basic_ios(basic_ios_wchar *ptr)
-{
-    return (basic_ostream_wchar*)((char*)ptr-basic_ostream_wchar_vbtable[1]);
-}
-
-/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
-/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_ctor, 16)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor(basic_ostream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *base;
-
-    TRACE("(%p %p %d %d)\n", this, strbuf, isstd, virt_init);
-
-    if(virt_init) {
-        this->vbtable = basic_ostream_wchar_vbtable;
-        base = basic_ostream_wchar_get_basic_ios(this);
-        basic_ios_wchar_ctor(base);
-    }else {
-        base = basic_ostream_wchar_get_basic_ios(this);
-    }
-
-    base->base.vtable = &MSVCP_basic_ostream_wchar_vtable;
-    basic_ios_wchar_init(base, strbuf, isstd);
-    return this;
-}
-
-/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
-/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_ctor, 16)
-basic_ostream_wchar* __thiscall basic_ostream_short_ctor(basic_ostream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
-{
-    basic_ostream_wchar_ctor(this, strbuf, isstd, virt_init);
-    basic_ostream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_ostream_short_vtable;
-    return this;
-}
-
-/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
-/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_ctor_uninitialized, 16)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor_uninitialized(basic_ostream_wchar *this,
-        int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *base;
-
-    TRACE("(%p %d %x)\n", this, uninitialized, addstd);
-
-    if(virt_init) {
-        this->vbtable = basic_ostream_wchar_vbtable;
-        base = basic_ostream_wchar_get_basic_ios(this);
-        basic_ios_wchar_ctor(base);
-    }else {
-        base = basic_ostream_wchar_get_basic_ios(this);
-    }
-
-    base->base.vtable = &MSVCP_basic_ostream_wchar_vtable;
-    if(addstd)
-        ios_base_Addstd(&base->base);
-    return this;
-}
-
-/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
-/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_ctor_uninitialized, 16)
-basic_ostream_wchar* __thiscall basic_ostream_short_ctor_uninitialized(basic_ostream_wchar *this,
-        int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
-{
-    basic_ostream_wchar_ctor_uninitialized(this, uninitialized, addstd, virt_init);
-    basic_ostream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_ostream_short_vtable;
-    return this;
-}
-
-/* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_dtor, 4)
-void __thiscall basic_ostream_wchar_dtor(basic_ios_wchar *base)
-{
-    basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base);
-
-    /* don't destroy virtual base here */
-    TRACE("(%p)\n", this);
-}
-
-/* ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vbase_dtor, 4)
-void __thiscall basic_ostream_wchar_vbase_dtor(basic_ostream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(this));
-}
-
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vector_dtor, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
-{
-    basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base);
-
-    TRACE("(%p %x)\n", this, flags);
-
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
-
-        for(i=*ptr-1; i>=0; i--)
-            basic_ostream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ostream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
-
-    return this;
-}
-
-/* ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ */
-/* ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ */
-/* ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ */
-/* ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_flush, 4)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_flush(basic_ostream_wchar *this)
-{
-    /* this function is not matching C++ specification */
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(basic_ios_wchar_rdbuf_get(base) && ios_base_good(&base->base)
-            && basic_streambuf_wchar_pubsync(basic_ios_wchar_rdbuf_get(base))==-1)
-        basic_ios_wchar_setstate(base, IOSTATE_badbit);
-    return this;
-}
-
-/* ?flush@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
-/* ?flush@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
-/* ?flush@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@1@AAV21@@Z */
-/* ?flush@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
-basic_ostream_wchar* __cdecl flush_ostream_wchar(basic_ostream_wchar *ostream)
-{
-    return basic_ostream_wchar_flush(ostream);
-}
-
-/* ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar__Osfx, 4)
-void __thiscall basic_ostream_wchar__Osfx(basic_ostream_wchar *this)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(base->base.fmtfl & FMTFLAG_unitbuf)
-        basic_ostream_wchar_flush(this);
-}
-
-/* ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_osfx, 4)
-void __thiscall basic_ostream_wchar_osfx(basic_ostream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    basic_ostream_wchar__Osfx(this);
-}
-
-static BOOL basic_ostream_wchar_sentry_create(basic_ostream_wchar *ostr)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
-
-    if(basic_ios_wchar_rdbuf_get(base))
-        basic_streambuf_wchar__Lock(base->strbuf);
-
-    if(ios_base_good(&base->base) && base->stream)
-        basic_ostream_wchar_flush(base->stream);
-
-    return ios_base_good(&base->base);
-}
-
-static void basic_ostream_wchar_sentry_destroy(basic_ostream_wchar *ostr)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
-
-    if(ios_base_good(&base->base) && !__uncaught_exception())
-        basic_ostream_wchar_osfx(ostr);
-
-    if(basic_ios_wchar_rdbuf_get(base))
-        basic_streambuf_wchar__Unlock(base->strbuf);
-}
-
-/* ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE_NXZ */
-/* ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA_NXZ */
-/* ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE_NXZ */
-/* ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_opfx, 4)
-MSVCP_bool __thiscall basic_ostream_wchar_opfx(basic_ostream_wchar *this)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(ios_base_good(&base->base) && base->stream)
-        basic_ostream_wchar_flush(base->stream);
-    return ios_base_good(&base->base);
-}
-
-/* ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z */
-/* ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z */
-/* ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z */
-/* ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_put, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_put(basic_ostream_wchar *this, wchar_t ch)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p %c)\n", this, ch);
-
-    if(!basic_ostream_wchar_sentry_create(this)
-            || basic_streambuf_wchar_sputc(base->strbuf, ch)==WEOF) {
-        basic_ostream_wchar_sentry_destroy(this);
-        basic_ios_wchar_setstate(base, IOSTATE_badbit);
-        return this;
-    }
-
-    basic_ostream_wchar_sentry_destroy(this);
-    return this;
-}
-
-/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@JH@Z */
-/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z */
-/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@JH@Z */
-/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_seekp, 16)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_seekp(basic_ostream_wchar *this, streamoff off, int way)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), way);
-
-    if(!ios_base_fail(&base->base)) {
-        fpos_int seek;
-
-        basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
-                &seek, off, way, OPENMODE_out);
-        if(seek.off==0 && seek.pos==-1 && seek.state==0)
-            basic_ios_wchar_setstate(base, IOSTATE_failbit);
-    }
-    return this;
-}
-
-/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
-/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
-/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
-/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_seekp_fpos, 28)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_seekp_fpos(basic_ostream_wchar *this, fpos_int pos)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
-
-    if(!ios_base_fail(&base->base)) {
-        fpos_int seek;
-
-        basic_streambuf_wchar_pubseekpos(basic_ios_wchar_rdbuf_get(base),
-                &seek, pos, OPENMODE_out);
-        if(seek.off==0 && seek.pos==-1 && seek.state==0)
-            basic_ios_wchar_setstate(base, IOSTATE_failbit);
-    }
-    return this;
-}
-
-/* ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ */
-/* ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
-/* ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ */
-/* ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_tellp, 8)
-fpos_int* __thiscall basic_ostream_wchar_tellp(basic_ostream_wchar *this, fpos_int *ret)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p)\n", this);
-
-    if(!ios_base_fail(&base->base)) {
-        basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
-                ret, 0, SEEKDIR_cur, OPENMODE_out);
-    }else {
-        ret->off = 0;
-        ret->pos = -1;
-        ret->state = 0;
-    }
-    return ret;
-}
-
-/* ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PB_WH@Z */
-/* ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEB_W_J@Z */
-/* ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@PBGH@Z */
-/* ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEBG_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_write, 16)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_write(basic_ostream_wchar *this, const wchar_t *str, streamsize count)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-
-    TRACE("(%p %s %s)\n", this, debugstr_w(str), wine_dbgstr_longlong(count));
-
-    if(!basic_ostream_wchar_sentry_create(this)
-            || basic_streambuf_wchar_sputn(base->strbuf, str, count)!=count) {
-        basic_ostream_wchar_sentry_destroy(this);
-        basic_ios_wchar_setstate(base, IOSTATE_badbit);
-        return this;
-    }
-
-    basic_ostream_wchar_sentry_destroy(this);
-    return this;
-}
-
-static basic_ostream_wchar* basic_ostream_print_short(basic_ostream_wchar *this, short val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %d)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_long(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base),
-                (ios_base_flags_get(&base->base) & FMTFLAG_basefield & (FMTFLAG_oct | FMTFLAG_hex))
-                ? (LONG)((unsigned short)val) : (LONG)val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@F@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@F@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_short, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_short(basic_ostream_wchar *this, short val)
-{
-    return basic_ostream_print_short(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@F@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@F@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_short, 8)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_short(basic_ostream_wchar *this, short val)
-{
-    return basic_ostream_print_short(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@G@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@G@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_ushort, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ushort(basic_ostream_wchar *this, unsigned short val)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %u)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        const num_put *numput = num_put_wchar_use_facet(strbuf->loc);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_ulong(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-static basic_ostream_wchar* basic_ostream_print_int(basic_ostream_wchar *this, int val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %d)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_long(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@H@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@H@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@J@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_int, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_int(basic_ostream_wchar *this, int val)
-{
-    return basic_ostream_print_int(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@H@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@H@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@J@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_int, 8)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_int(basic_ostream_wchar *this, int val)
-{
-    return basic_ostream_print_int(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_uint(basic_ostream_wchar *this, unsigned int val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %u)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_ulong(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@I@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@I@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@K@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@K@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_uint, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_uint(basic_ostream_wchar *this, unsigned int val)
-{
-    return basic_ostream_print_uint(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@I@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@I@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@K@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@K@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_uint, 8)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_uint(basic_ostream_wchar *this, unsigned int val)
-{
-    return basic_ostream_print_uint(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_float(basic_ostream_wchar *this, float val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %f)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_double(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@M@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@M@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_float, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_float(basic_ostream_wchar *this, float val)
-{
-    return basic_ostream_print_float(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@M@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@M@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_float, 8)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_float(basic_ostream_wchar *this, float val)
-{
-    return basic_ostream_print_float(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_double(basic_ostream_wchar *this, double val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %lf)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_double(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@N@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_double, 12)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_double(basic_ostream_wchar *this, double val)
-{
-    return basic_ostream_print_double(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@N@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_double, 12)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_double(basic_ostream_wchar *this, double val)
-{
-    return basic_ostream_print_double(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_ldouble(basic_ostream_wchar *this, double val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %lf)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_ldouble(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@O@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@O@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_ldouble, 12)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ldouble(basic_ostream_wchar *this, double val)
-{
-    return basic_ostream_print_ldouble(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@O@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@O@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_ldouble, 12)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_ldouble(basic_ostream_wchar *this, double val)
-{
-    return basic_ostream_print_ldouble(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_streambuf, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_streambuf(basic_ostream_wchar *this, basic_streambuf_wchar *val)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_badbit;
-    unsigned short c = '\n';
-
-    TRACE("(%p %p)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        for(c = basic_streambuf_wchar_sgetc(val); c!=WEOF;
-                c = basic_streambuf_wchar_snextc(val)) {
-            state = IOSTATE_goodbit;
-
-            if(basic_streambuf_wchar_sputc(base->strbuf, c) == WEOF) {
-                state = IOSTATE_badbit;
-                break;
-            }
-        }
-    }else {
-        state = IOSTATE_badbit;
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    ios_base_width_set(&base->base, 0);
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-static basic_ostream_wchar* basic_ostream_print_ptr(basic_ostream_wchar *this, const void *val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_ptr(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PBX@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEBX@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_ptr, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ptr(basic_ostream_wchar *this, const void *val)
-{
-    return basic_ostream_print_ptr(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PBX@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEBX@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_ptr, 8)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_ptr(basic_ostream_wchar *this, const void *val)
-{
-    return basic_ostream_print_ptr(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_int64(basic_ostream_wchar *this, __int64 val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p)\n", this);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_int64(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_J@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_int64, 12)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_int64(basic_ostream_wchar *this, __int64 val)
-{
-    return basic_ostream_print_int64(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_J@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_int64, 12)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_int64(basic_ostream_wchar *this, __int64 val)
-{
-    return basic_ostream_print_int64(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_uint64(basic_ostream_wchar *this, unsigned __int64 val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p)\n", this);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_uint64(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_K@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_uint64, 12)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_uint64(basic_ostream_wchar *this, unsigned __int64 val)
-{
-    return basic_ostream_print_uint64(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_K@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_uint64, 12)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_uint64(basic_ostream_wchar *this, unsigned __int64 val)
-{
-    return basic_ostream_print_uint64(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-static basic_ostream_wchar* basic_ostream_print_bool(basic_ostream_wchar *this, MSVCP_bool val, const num_put *numput)
-{
-    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %x)\n", this, val);
-
-    if(basic_ostream_wchar_sentry_create(this)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        ostreambuf_iterator_wchar dest = {0, strbuf};
-
-        num_put_wchar_put_bool(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
-    }
-    basic_ostream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_N@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_bool, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_bool(basic_ostream_wchar *this, MSVCP_bool val)
-{
-    return basic_ostream_print_bool(this, val, num_put_wchar_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_N@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_bool, 8)
-basic_ostream_wchar* __thiscall basic_ostream_short_print_bool(basic_ostream_wchar *this, MSVCP_bool val)
-{
-    return basic_ostream_print_bool(this, val, num_put_short_use_facet(
-                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
-}
-
-/* ?endl@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
-/* ?endl@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
-/* ?endl@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@1@AAV21@@Z */
-/* ?endl@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
-basic_ostream_wchar* __cdecl basic_ostream_wchar_endl(basic_ostream_wchar *ostr)
-{
-    TRACE("(%p)\n", ostr);
-
-    basic_ostream_wchar_put(ostr, '\n');
-    basic_ostream_wchar_flush(ostr);
-    return ostr;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func(basic_ostream_wchar *this,
-        basic_ostream_wchar* (__cdecl *pfunc)(basic_ostream_wchar*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(this);
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func_basic_ios, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func_basic_ios(basic_ostream_wchar *this,
-        basic_ios_wchar* (__cdecl *pfunc)(basic_ios_wchar*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(basic_ostream_wchar_get_basic_ios(this));
-    return this;
-}
-
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
-/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
-/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func_ios_base, 8)
-basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func_ios_base(
-        basic_ostream_wchar *this, ios_base* (__cdecl *pfunc)(ios_base*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(&basic_ostream_wchar_get_basic_ios(this)->base);
-    return this;
-}
-
-/* Caution: basic_istream uses virtual inheritance. */
-static inline basic_ios_char* basic_istream_char_get_basic_ios(basic_istream_char *this)
-{
-    return (basic_ios_char*)((char*)this+this->vbtable[1]);
-}
-
-static inline basic_ios_char* basic_istream_char_to_basic_ios(basic_istream_char *ptr)
-{
-    return (basic_ios_char*)((char*)ptr+basic_istream_char_vbtable[1]);
-}
-
-static inline basic_istream_char* basic_istream_char_from_basic_ios(basic_ios_char *ptr)
-{
-    return (basic_istream_char*)((char*)ptr-basic_istream_char_vbtable[1]);
-}
-
-/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */
-/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor_init, 20)
-basic_istream_char* __thiscall basic_istream_char_ctor_init(basic_istream_char *this, basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
-{
-    basic_ios_char *base;
-
-    TRACE("(%p %p %d %d %d)\n", this, strbuf, isstd, noinit, virt_init);
-
-    if(virt_init) {
-        this->vbtable = basic_istream_char_vbtable;
-        base = basic_istream_char_get_basic_ios(this);
-        basic_ios_char_ctor(base);
-    }else {
-        base = basic_istream_char_get_basic_ios(this);
-    }
-
-    base->base.vtable = &MSVCP_basic_istream_char_vtable;
-    this->count = 0;
-    if(!noinit)
-        basic_ios_char_init(base, strbuf, isstd);
-    return this;
-}
-
-/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
-/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor, 16)
-basic_istream_char* __thiscall basic_istream_char_ctor(basic_istream_char *this, basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
-{
-    return basic_istream_char_ctor_init(this, strbuf, isstd, FALSE, virt_init);
-}
-
-/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor_uninitialized, 12)
-basic_istream_char* __thiscall basic_istream_char_ctor_uninitialized(basic_istream_char *this, int uninitialized, MSVCP_bool virt_init)
-{
-    basic_ios_char *base;
-
-    TRACE("(%p %d %d)\n", this, uninitialized, virt_init);
-
-    if(virt_init) {
-        this->vbtable = basic_istream_char_vbtable;
-        base = basic_istream_char_get_basic_ios(this);
-        basic_ios_char_ctor(base);
-    }else {
-        base = basic_istream_char_get_basic_ios(this);
-    }
-
-    base->base.vtable = &MSVCP_basic_istream_char_vtable;
-    ios_base_Addstd(&base->base);
-    return this;
-}
-
-/* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_dtor, 4)
-void __thiscall basic_istream_char_dtor(basic_ios_char *base)
-{
-    basic_istream_char *this = basic_istream_char_from_basic_ios(base);
-
-    /* don't destroy virtual base here */
-    TRACE("(%p)\n", this);
-}
-
-/* ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_vbase_dtor, 4)
-void __thiscall basic_istream_char_vbase_dtor(basic_istream_char *this)
-{
-    TRACE("(%p)\n", this);
-    basic_istream_char_dtor(basic_istream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_istream_char_get_basic_ios(this));
-}
-
-DEFINE_THISCALL_WRAPPER(basic_istream_char_vector_dtor, 8)
-basic_istream_char* __thiscall basic_istream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
-{
-    basic_istream_char *this = basic_istream_char_from_basic_ios(base);
-
-    TRACE("(%p %x)\n", this, flags);
-
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
-
-        for(i=*ptr-1; i>=0; i--)
-            basic_istream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_istream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
-
-    return this;
-}
-
-/* ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z */
-/* ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char__Ipfx, 8)
-MSVCP_bool __thiscall basic_istream_char__Ipfx(basic_istream_char *this, MSVCP_bool noskip)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-
-    TRACE("(%p %d)\n", this, noskip);
-
-    if(!ios_base_good(&base->base)) {
-        basic_ios_char_setstate(base, IOSTATE_failbit);
-        return FALSE;
-    }
-
-    if(basic_ios_char_tie_get(base))
-        basic_ostream_char_flush(basic_ios_char_tie_get(base));
-
-    if(!noskip && (ios_base_flags_get(&base->base) & FMTFLAG_skipws)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const ctype_char *ctype = ctype_char_use_facet(base->strbuf->loc);
-        int ch;
-
-        for(ch = basic_streambuf_char_sgetc(strbuf); ;
-                ch = basic_streambuf_char_snextc(strbuf)) {
-            if(ch == EOF) {
-                basic_ios_char_setstate(base, IOSTATE_eofbit);
-                return FALSE;
-            }
-
-            if(!ctype_char_is_ch(ctype, _SPACE|_BLANK, ch))
-                break;
-        }
-    }
-
-    return TRUE;
-}
-
-/* ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z */
-/* ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_ipfx, 8)
-MSVCP_bool __thiscall basic_istream_char_ipfx(basic_istream_char *this, MSVCP_bool noskip)
-{
-    return basic_istream_char__Ipfx(this, noskip);
-}
-
-/* ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_isfx, 4)
-void __thiscall basic_istream_char_isfx(basic_istream_char *this)
-{
-    TRACE("(%p)\n", this);
-}
-
-static BOOL basic_istream_char_sentry_create(basic_istream_char *istr, MSVCP_bool noskip)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(istr);
-
-    if(basic_ios_char_rdbuf_get(base))
-        call_basic_streambuf_char__Lock(base->strbuf);
-
-    return basic_istream_char_ipfx(istr, noskip);
-}
-
-static void basic_istream_char_sentry_destroy(basic_istream_char *istr)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(istr);
-
-    if(basic_ios_char_rdbuf_get(base))
-        call_basic_streambuf_char__Unlock(base->strbuf);
-}
-
-/* ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBEHXZ */
-/* ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QEBA_JXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_gcount, 4)
-int __thiscall basic_istream_char_gcount(const basic_istream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return this->count;
-}
-
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_get, 4)
-int __thiscall basic_istream_char_get(basic_istream_char *this)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int ret;
-
-    TRACE("(%p)\n", this);
-
-    this->count = 0;
-
-    if(!basic_istream_char_sentry_create(this, TRUE)) {
-        basic_istream_char_sentry_destroy(this);
-        return EOF;
-    }
-
-    ret = basic_streambuf_char_sbumpc(basic_ios_char_rdbuf_get(base));
-    basic_istream_char_sentry_destroy(this);
-    if(ret == EOF)
-        basic_ios_char_setstate(base, IOSTATE_eofbit|IOSTATE_failbit);
-    else
-        this->count++;
-
-    return ret;
-}
-
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAD@Z */
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAD@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_get_ch, 8)
-basic_istream_char* __thiscall basic_istream_char_get_ch(basic_istream_char *this, char *ch)
-{
-    int ret;
-
-    TRACE("(%p %p)\n", this, ch);
-
-    ret = basic_istream_char_get(this);
-    if(ret != EOF)
-        *ch = (char)ret;
-    return this;
-}
-
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADHD@Z */
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_get_str_delim, 20)
-basic_istream_char* __thiscall basic_istream_char_get_str_delim(basic_istream_char *this, char *str, streamsize count, char delim)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int ch = delim;
-
-    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-        for(ch = basic_streambuf_char_sgetc(strbuf); count>1;
-                ch = basic_streambuf_char_snextc(strbuf)) {
-            if(ch==EOF || ch==delim)
-                break;
-
-            *str++ = ch;
-            this->count++;
-            count--;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
-            (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
-    if(count > 0)
-        *str = 0;
-    return this;
-}
-
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_get_str, 16)
-basic_istream_char* __thiscall basic_istream_char_get_str(basic_istream_char *this, char *str, streamsize count)
-{
-    return basic_istream_char_get_str_delim(this, str, count, '\n');
-}
-
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z */
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_get_streambuf_delim, 12)
-basic_istream_char* __thiscall basic_istream_char_get_streambuf_delim(basic_istream_char *this, basic_streambuf_char *strbuf, char delim)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int ch = delim;
-
-    TRACE("(%p %p %c)\n", this, strbuf, delim);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_streambuf_char *strbuf_read = basic_ios_char_rdbuf_get(base);
-
-        for(ch = basic_streambuf_char_sgetc(strbuf_read); ;
-                ch = basic_streambuf_char_snextc(strbuf_read)) {
-            if(ch==EOF || ch==delim)
-                break;
-
-            if(basic_streambuf_char_sputc(strbuf, ch) == EOF)
-                break;
-            this->count++;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
-            (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
-    return this;
-}
-
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z */
-/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_get_streambuf, 8)
-basic_istream_char* __thiscall basic_istream_char_get_streambuf(basic_istream_char *this, basic_streambuf_char *strbuf)
-{
-    return basic_istream_char_get_streambuf_delim(this, strbuf, '\n');
-}
-
-/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADHD@Z */
-/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_getline_delim, 20)
-basic_istream_char* __thiscall basic_istream_char_getline_delim(basic_istream_char *this, char *str, streamsize count, char delim)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int ch = delim;
-
-    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE) && count>0) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-        while(count > 1) {
-            ch = basic_streambuf_char_sbumpc(strbuf);
-
-            if(ch==EOF || ch==delim)
-                break;
-
-            *str++ = ch;
-            this->count++;
-            count--;
-        }
-
-        if(ch == delim)
-            this->count++;
-        else if(ch != EOF) {
-            ch = basic_streambuf_char_sgetc(strbuf);
-
-            if(ch == delim) {
-                basic_streambuf_char__Gninc(strbuf);
-                this->count++;
-            }
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit) |
-            (!this->count || (ch!=delim && ch!=EOF) ? IOSTATE_failbit : IOSTATE_goodbit));
-    if(count > 0)
-        *str = 0;
-    return this;
-}
-
-/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
-/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_getline, 16)
-basic_istream_char* __thiscall basic_istream_char_getline(basic_istream_char *this, char *str, streamsize count)
-{
-    return basic_istream_char_getline_delim(this, str, count, '\n');
-}
-
-/* ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@HH@Z */
-/* ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_ignore, 16)
-basic_istream_char* __thiscall basic_istream_char_ignore(basic_istream_char *this, streamsize count, int delim)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int ch = delim;
-
-    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(count), delim);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-        while(count > 0) {
-            ch = basic_streambuf_char_sbumpc(strbuf);
-
-            if(ch==EOF || ch==delim)
-                break;
-
-            this->count++;
-            if(count != INT_MAX)
-                count--;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    if(ch == EOF)
-        basic_ios_char_setstate(base, IOSTATE_eofbit);
-    return this;
-}
-
-/* ?ws@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@1@AAV21@@Z */
-/* ?ws@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
-basic_istream_char* __cdecl ws_basic_istream_char(basic_istream_char *istream)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
-    int ch = '\n';
-
-    TRACE("(%p)\n", istream);
-
-    if(basic_istream_char_sentry_create(istream, TRUE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const ctype_char *ctype = ctype_char_use_facet(strbuf->loc);
-
-        for(ch = basic_streambuf_char_sgetc(strbuf); ctype_char_is_ch(ctype, _SPACE, ch);
-                ch = basic_streambuf_char_snextc(strbuf)) {
-            if(ch == EOF)
-                break;
-        }
-    }
-    basic_istream_char_sentry_destroy(istream);
-
-    if(ch == EOF)
-        basic_ios_char_setstate(base, IOSTATE_eofbit);
-    return istream;
-}
-
-/* ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
-/* ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_peek, 4)
-int __thiscall basic_istream_char_peek(basic_istream_char *this)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int ret = EOF;
-
-    TRACE("(%p)\n", this);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE))
-        ret = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base));
-    basic_istream_char_sentry_destroy(this);
-    return ret;
-}
-
-/* ?_Read_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADIH@Z */
-/* ?_Read_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char__Read_s, 20)
-basic_istream_char* __thiscall basic_istream_char__Read_s(basic_istream_char *this, char *str, MSVCP_size_t size, streamsize count)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
-
-    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-        this->count = basic_streambuf_char__Sgetn_s(strbuf, str, size, count);
-        if(this->count != count)
-            state |= IOSTATE_failbit | IOSTATE_eofbit;
-    }else {
-        this->count = 0;
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
-/* ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read, 16)
-basic_istream_char* __thiscall basic_istream_char_read(basic_istream_char *this, char *str, streamsize count)
-{
-    return basic_istream_char__Read_s(this, str, count, count);
-}
-
-/* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADIH@Z */
-/* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char__Readsome_s, 20)
-streamsize __thiscall basic_istream_char__Readsome_s(basic_istream_char *this, char *str, MSVCP_size_t size, streamsize count)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
-
-    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        streamsize avail = basic_streambuf_char_in_avail(basic_ios_char_rdbuf_get(base));
-        if(avail > count)
-            avail = count;
-
-        if(avail == -1)
-            state |= IOSTATE_eofbit;
-        else if(avail > 0)
-            basic_istream_char__Read_s(this, str, size, avail);
-    }else {
-        state |= IOSTATE_failbit;
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this->count;
-}
-
-/* ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADH@Z */
-/* ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_readsome, 16)
-streamsize __thiscall basic_istream_char_readsome(basic_istream_char *this, char *str, streamsize count)
-{
-    return basic_istream_char__Readsome_s(this, str, count, count);
-}
-
-/* ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z */
-/* ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_putback, 8)
-basic_istream_char* __thiscall basic_istream_char_putback(basic_istream_char *this, char ch)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
-
-    TRACE("(%p %c)\n", this, ch);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-        if(!ios_base_good(&base->base))
-            state |= IOSTATE_failbit;
-        else if(!strbuf || basic_streambuf_char_sputbackc(strbuf, ch)==EOF)
-            state |= IOSTATE_badbit;
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ */
-/* ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_unget, 4)
-basic_istream_char* __thiscall basic_istream_char_unget(basic_istream_char *this)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
-
-    TRACE("(%p)\n", this);
-
-    this->count = 0;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-        if(!ios_base_good(&base->base))
-            state |= IOSTATE_failbit;
-        else if(!strbuf || basic_streambuf_char_sungetc(strbuf)==EOF)
-            state |= IOSTATE_badbit;
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
-/* ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_sync, 4)
-int __thiscall basic_istream_char_sync(basic_istream_char *this)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-
-    TRACE("(%p)\n", this);
-
-    if(!strbuf)
-        return -1;
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        if(basic_streambuf_char_pubsync(strbuf) != -1) {
-            basic_istream_char_sentry_destroy(this);
-            return 0;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, IOSTATE_badbit);
-    return -1;
-}
-
-/* ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ */
-/* ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_tellg, 8)
-fpos_int* __thiscall basic_istream_char_tellg(basic_istream_char *this, fpos_int *ret)
-{
-    TRACE("(%p %p)\n", this, ret);
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-        if(!ios_base_fail(&base->base)) {
-            basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
-                    ret, 0, SEEKDIR_cur, OPENMODE_in);
-            basic_istream_char_sentry_destroy(this);
-
-            if(ret->off==0 && ret->pos==-1 && ret->state==0)
-                basic_ios_char_setstate(base, IOSTATE_failbit);
-            return ret;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    ret->off = 0;
-    ret->pos = -1;
-    ret->state = 0;
-    return ret;
-}
-
-/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@JH@Z */
-/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_seekg, 16)
-basic_istream_char* __thiscall basic_istream_char_seekg(basic_istream_char *this, streamoff off, int dir)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-
-    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), dir);
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        if(!ios_base_fail(&base->base)) {
-            basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-            fpos_int ret;
-
-            basic_streambuf_char_pubseekoff(strbuf, &ret, off, dir, OPENMODE_in);
-            basic_istream_char_sentry_destroy(this);
-
-            if(ret.off==0 && ret.pos==-1 && ret.state==0)
-                basic_ios_char_setstate(base, IOSTATE_failbit);
-            else
-                basic_ios_char_clear(base, IOSTATE_goodbit);
-            return this;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, IOSTATE_failbit);
-    return this;
-}
-
-/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
-/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_seekg_fpos, 28)
-basic_istream_char* __thiscall basic_istream_char_seekg_fpos(basic_istream_char *this, fpos_int pos)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-
-    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
-
-    if(basic_istream_char_sentry_create(this, TRUE)) {
-        if(!ios_base_fail(&base->base)) {
-            basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-            fpos_int ret;
-
-            basic_streambuf_char_pubseekpos(strbuf, &ret, pos, OPENMODE_in);
-            basic_istream_char_sentry_destroy(this);
-
-            if(ret.off==0 && ret.pos==-1 && ret.state==0)
-                basic_ios_char_setstate(base, IOSTATE_failbit);
-            else
-                basic_ios_char_clear(base, IOSTATE_goodbit);
-            return this;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, IOSTATE_failbit);
-    return this;
-}
-
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAF@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAF@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_short, 8)
-basic_istream_char* __thiscall basic_istream_char_read_short(basic_istream_char *this, short *v)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, v);
-
-    if(basic_istream_char_sentry_create(this, FALSE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
-        LONG tmp;
-
-        first.strbuf = strbuf;
-        num_get_char_get_long(numget, &last, first, last, &base->base, &state, &tmp);
-
-        if(!(state&IOSTATE_failbit) && tmp==(LONG)((short)tmp))
-            *v = tmp;
-        else
-            state |= IOSTATE_failbit;
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAG@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAG@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ushort, 8)
-basic_istream_char* __thiscall basic_istream_char_read_ushort(basic_istream_char *this, unsigned short *v)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, v);
-
-    if(basic_istream_char_sentry_create(this, FALSE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
-
-        first.strbuf = strbuf;
-        num_get_char_get_ushort(numget, &last, first, last, &base->base, &state, v);
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAH@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_int, 8)
-basic_istream_char* __thiscall basic_istream_char_read_int(basic_istream_char *this, int *v)
-{
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, v);
-
-    if(basic_istream_char_sentry_create(this, FALSE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
-
-        first.strbuf = strbuf;
-        num_get_char_get_long(numget, &last, first, last, &base->base, &state, v);
-    }
-    basic_istream_char_sentry_destroy(this);
-
-    basic_ios_char_setstate(base, state);
-    return this;
-}
-
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAI@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAI@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_uint, 8)
-basic_istream_char* __thiscall basic_istream_char_read_uint(basic_istream_char *this, unsigned int *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@H@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@H@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@J@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_int, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_int(basic_ostream_char *this, int val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %d)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_uint(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_long(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAJ@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAJ@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_long, 8)
-basic_istream_char* __thiscall basic_istream_char_read_long(basic_istream_char *this, LONG *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@I@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@I@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@K@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@K@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_uint, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_uint(basic_ostream_char *this, unsigned int val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %u)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_long(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_ulong(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAK@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAK@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ulong, 8)
-basic_istream_char* __thiscall basic_istream_char_read_ulong(basic_istream_char *this, ULONG *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@M@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@M@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_float, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_float(basic_ostream_char *this, float val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %f)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_ulong(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_double(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAM@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAM@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_float, 8)
-basic_istream_char* __thiscall basic_istream_char_read_float(basic_istream_char *this, float *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@N@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_double, 12)
+basic_ostream_char* __thiscall basic_ostream_char_print_double(basic_ostream_char *this, double val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %lf)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_float(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_double(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAN@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_double, 8)
-basic_istream_char* __thiscall basic_istream_char_read_double(basic_istream_char *this, double *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@O@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@O@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ldouble, 12)
+basic_ostream_char* __thiscall basic_ostream_char_print_ldouble(basic_ostream_char *this, double val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %lf)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_double(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_ldouble(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAO@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAO@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ldouble, 8)
-basic_istream_char* __thiscall basic_istream_char_read_ldouble(basic_istream_char *this, double *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_streambuf, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_streambuf(basic_ostream_char *this, basic_streambuf_char *val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_badbit;
+    int c = '\n';
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %p)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
-        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+    if(basic_ostream_char_sentry_create(this)) {
+        for(c = basic_streambuf_char_sgetc(val); c!=EOF;
+                c = basic_streambuf_char_snextc(val)) {
+            state = IOSTATE_goodbit;
 
-        first.strbuf = strbuf;
-        num_get_char_get_ldouble(numget, &last, first, last, &base->base, &state, v);
+            if(basic_streambuf_char_sputc(base->strbuf, c) == EOF) {
+                state = IOSTATE_badbit;
+                break;
+            }
+        }
+    }else {
+        state = IOSTATE_badbit;
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
+    ios_base_width_set(&base->base, 0);
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAPAX@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ptr, 8)
-basic_istream_char* __thiscall basic_istream_char_read_ptr(basic_istream_char *this, void **v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@PBX@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEBX@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_ptr, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_ptr(basic_ostream_char *this, const void *val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %p)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_void(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_ptr(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_J@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_int64, 8)
-basic_istream_char* __thiscall basic_istream_char_read_int64(basic_istream_char *this, __int64 *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_J@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_int64, 12)
+basic_ostream_char* __thiscall basic_ostream_char_print_int64(basic_ostream_char *this, __int64 val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p)\n", this);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_int64(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_int64(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_K@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_uint64, 8)
-basic_istream_char* __thiscall basic_istream_char_read_uint64(basic_istream_char *this, unsigned __int64 *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_K@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_K@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_uint64, 12)
+basic_ostream_char* __thiscall basic_ostream_char_print_uint64(basic_ostream_char *this, unsigned __int64 val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p)\n", this);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_uint64(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_uint64(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_N@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_bool, 8)
-basic_istream_char* __thiscall basic_istream_char_read_bool(basic_istream_char *this, MSVCP_bool *v)
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@_N@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_bool, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_bool(basic_ostream_char *this, MSVCP_bool val)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_ios_char *base = basic_ostream_char_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %x)\n", this, val);
 
-    if(basic_istream_char_sentry_create(this, FALSE)) {
+    if(basic_ostream_char_sentry_create(this)) {
         basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
-        const num_get *numget = num_get_char_use_facet(strbuf->loc);
-        istreambuf_iterator_char first={0}, last={0};
+        const num_put *numput = num_put_char_use_facet(strbuf->loc);
+        ostreambuf_iterator_char dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_char_get_bool(numget, &last, first, last, &base->base, &state, v);
+        num_put_char_put_bool(numput, &dest, dest, &base->base, basic_ios_char_fill_get(base), val);
     }
-    basic_istream_char_sentry_destroy(this);
+    basic_ostream_char_sentry_destroy(this);
 
     basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_streambuf, 8)
-basic_istream_char* __thiscall basic_istream_char_read_streambuf(
-        basic_istream_char *this, basic_streambuf_char *streambuf)
+/* ?endl@std@@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@1@AAV21@@Z */
+/* ?endl@std@@YAAEAV?$basic_ostream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
+basic_ostream_char* __cdecl basic_ostream_char_endl(basic_ostream_char *ostr)
 {
-    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_failbit;
-    int c = '\n';
-
-    TRACE("(%p %p)\n", this, streambuf);
-
-    if(basic_istream_char_sentry_create(this, FALSE)) {
-        for(c = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base)); c!=EOF;
-                c = basic_streambuf_char_snextc(basic_ios_char_rdbuf_get(base))) {
-            state = IOSTATE_goodbit;
-            if(basic_streambuf_char_sputc(streambuf, c) == EOF)
-                break;
-        }
-    }
-    basic_istream_char_sentry_destroy(this);
+    TRACE("(%p)\n", ostr);
 
-    basic_ios_char_setstate(base, state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
-    return this;
+    basic_ostream_char_put(ostr, '\n');
+    basic_ostream_char_flush(ostr);
+    return ostr;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func, 8)
-basic_istream_char* __thiscall basic_istream_char_read_func(basic_istream_char *this,
-        basic_istream_char* (__cdecl *pfunc)(basic_istream_char*))
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_func(basic_ostream_char *this,
+        basic_ostream_char* (__cdecl *pfunc)(basic_ostream_char*))
 {
     TRACE("(%p %p)\n", this, pfunc);
     pfunc(this);
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func_basic_ios, 8)
-basic_istream_char* __thiscall basic_istream_char_read_func_basic_ios(basic_istream_char *this,
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func_basic_ios, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_func_basic_ios(basic_ostream_char *this,
         basic_ios_char* (__cdecl *pfunc)(basic_ios_char*))
 {
     TRACE("(%p %p)\n", this, pfunc);
-    pfunc(basic_istream_char_get_basic_ios(this));
+    pfunc(basic_ostream_char_get_basic_ios(this));
     return this;
 }
 
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
-/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func_ios_base, 8)
-basic_istream_char* __thiscall basic_istream_char_read_func_ios_base(basic_istream_char *this,
-        ios_base* (__cdecl *pfunc)(ios_base*))
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
+/* ??6?$basic_ostream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_char_print_func_ios_base, 8)
+basic_ostream_char* __thiscall basic_ostream_char_print_func_ios_base(
+        basic_ostream_char *this, ios_base* (__cdecl *pfunc)(ios_base*))
 {
     TRACE("(%p %p)\n", this, pfunc);
-    pfunc(&basic_istream_char_get_basic_ios(this)->base);
+    pfunc(&basic_ostream_char_get_basic_ios(this)->base);
     return this;
 }
 
-/* Caution: basic_istream uses virtual inheritance. */
-static inline basic_ios_wchar* basic_istream_wchar_get_basic_ios(basic_istream_wchar *this)
+/* Caution: basic_ostream uses virtual inheritance. */
+static inline basic_ios_wchar* basic_ostream_wchar_get_basic_ios(basic_ostream_wchar *this)
 {
     return (basic_ios_wchar*)((char*)this+this->vbtable[1]);
 }
 
-static inline basic_ios_wchar* basic_istream_wchar_to_basic_ios(basic_istream_wchar *ptr)
+static inline basic_ios_wchar* basic_ostream_wchar_to_basic_ios(basic_ostream_wchar *ptr)
 {
-    return (basic_ios_wchar*)((char*)ptr+basic_istream_wchar_vbtable[1]);
+    return (basic_ios_wchar*)((char*)ptr+basic_ostream_wchar_vbtable[1]);
 }
 
-static inline basic_istream_wchar* basic_istream_wchar_from_basic_ios(basic_ios_wchar *ptr)
+static inline basic_ostream_wchar* basic_ostream_wchar_from_basic_ios(basic_ios_wchar *ptr)
 {
-    return (basic_istream_wchar*)((char*)ptr-basic_istream_wchar_vbtable[1]);
+    return (basic_ostream_wchar*)((char*)ptr-basic_ostream_wchar_vbtable[1]);
 }
 
-/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */
-/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor_init, 20)
-basic_istream_wchar* __thiscall basic_istream_wchar_ctor_init(basic_istream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
+/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
+/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_ctor, 16)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor(basic_ostream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
 {
     basic_ios_wchar *base;
 
-    TRACE("(%p %p %d %d %d)\n", this, strbuf, isstd, noinit, virt_init);
+    TRACE("(%p %p %d %d)\n", this, strbuf, isstd, virt_init);
 
     if(virt_init) {
-        this->vbtable = basic_istream_wchar_vbtable;
-        base = basic_istream_wchar_get_basic_ios(this);
+        this->vbtable = basic_ostream_wchar_vbtable;
+        base = basic_ostream_wchar_get_basic_ios(this);
         basic_ios_wchar_ctor(base);
     }else {
-        base = basic_istream_wchar_get_basic_ios(this);
+        base = basic_ostream_wchar_get_basic_ios(this);
     }
 
-    base->base.vtable = &MSVCP_basic_istream_wchar_vtable;
-    this->count = 0;
-    if(!noinit)
-        basic_ios_wchar_init(base, strbuf, isstd);
-    return this;
-}
-
-/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z */
-/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor_init, 20)
-basic_istream_wchar* __thiscall basic_istream_short_ctor_init(basic_istream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
-{
-    basic_istream_wchar_ctor_init(this, strbuf, isstd, noinit, virt_init);
-    basic_istream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_istream_short_vtable;
+    base->base.vtable = &MSVCP_basic_ostream_wchar_vtable;
+    basic_ios_wchar_init(base, strbuf, isstd);
     return this;
 }
 
-/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
-/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor, 16)
-basic_istream_wchar* __thiscall basic_istream_wchar_ctor(basic_istream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
-{
-    return basic_istream_wchar_ctor_init(this, strbuf, isstd, FALSE, virt_init);
-}
-
-/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
-/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor, 16)
-basic_istream_wchar* __thiscall basic_istream_short_ctor(basic_istream_wchar *this,
+/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
+/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_ctor, 16)
+basic_ostream_wchar* __thiscall basic_ostream_short_ctor(basic_ostream_wchar *this,
         basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
 {
-    return basic_istream_short_ctor_init(this, strbuf, isstd, FALSE, virt_init);
+    basic_ostream_wchar_ctor(this, strbuf, isstd, virt_init);
+    basic_ostream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_ostream_short_vtable;
+    return this;
 }
 
-/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor_uninitialized, 12)
-basic_istream_wchar* __thiscall basic_istream_wchar_ctor_uninitialized(
-        basic_istream_wchar *this, int uninitialized, MSVCP_bool virt_init)
+/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
+/* ??0?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_ctor_uninitialized, 16)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_ctor_uninitialized(basic_ostream_wchar *this,
+        int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
 {
     basic_ios_wchar *base;
 
-    TRACE("(%p %d %d)\n", this, uninitialized, virt_init);
+    TRACE("(%p %d %x)\n", this, uninitialized, addstd);
 
     if(virt_init) {
-        this->vbtable = basic_istream_wchar_vbtable;
-        base = basic_istream_wchar_get_basic_ios(this);
+        this->vbtable = basic_ostream_wchar_vbtable;
+        base = basic_ostream_wchar_get_basic_ios(this);
         basic_ios_wchar_ctor(base);
     }else {
-        base = basic_istream_wchar_get_basic_ios(this);
+        base = basic_ostream_wchar_get_basic_ios(this);
     }
 
-    base->base.vtable = &MSVCP_basic_istream_wchar_vtable;
-    ios_base_Addstd(&base->base);
+    base->base.vtable = &MSVCP_basic_ostream_wchar_vtable;
+    if(addstd)
+        ios_base_Addstd(&base->base);
     return this;
 }
 
-/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor_uninitialized, 12)
-basic_istream_wchar* __thiscall basic_istream_short_ctor_uninitialized(
-        basic_istream_wchar *this, int uninitialized, MSVCP_bool virt_init)
+/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@_N@Z */
+/* ??0?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_ctor_uninitialized, 16)
+basic_ostream_wchar* __thiscall basic_ostream_short_ctor_uninitialized(basic_ostream_wchar *this,
+        int uninitialized, MSVCP_bool addstd, MSVCP_bool virt_init)
 {
-    basic_istream_wchar_ctor_uninitialized(this, uninitialized, virt_init);
-    basic_istream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_istream_short_vtable;
+    basic_ostream_wchar_ctor_uninitialized(this, uninitialized, addstd, virt_init);
+    basic_ostream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_ostream_short_vtable;
     return this;
 }
 
-/* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_dtor, 4)
-void __thiscall basic_istream_wchar_dtor(basic_ios_wchar *base)
+/* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
+/* ??1?$basic_ostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
+/* ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UAE@XZ */
+/* ??1?$basic_ostream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_dtor, 4)
+void __thiscall basic_ostream_wchar_dtor(basic_ios_wchar *base)
 {
-    basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base);
+    basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base);
 
     /* don't destroy virtual base here */
     TRACE("(%p)\n", this);
 }
 
-/* ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vbase_dtor, 4)
-void __thiscall basic_istream_wchar_vbase_dtor(basic_istream_wchar *this)
+/* ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
+/* ??_D?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
+/* ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
+/* ??_D?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vbase_dtor, 4)
+void __thiscall basic_ostream_wchar_vbase_dtor(basic_ostream_wchar *this)
 {
     TRACE("(%p)\n", this);
-    basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(this));
+    basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(this));
+    basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(this));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vector_dtor, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_vector_dtor, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
 {
-    basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base);
+    basic_ostream_wchar *this = basic_ostream_wchar_from_basic_ios(base);
 
     TRACE("(%p %x)\n", this, flags);
 
@@ -8027,10 +4663,10 @@ basic_istream_wchar* __thiscall basic_istream_wchar_vector_dtor(basic_ios_wchar
         INT_PTR i, *ptr = (INT_PTR *)this-1;
 
         for(i=*ptr-1; i>=0; i--)
-            basic_istream_wchar_vbase_dtor(this+i);
+            basic_ostream_wchar_vbase_dtor(this+i);
         MSVCRT_operator_delete(ptr);
     } else {
-        basic_istream_wchar_vbase_dtor(this);
+        basic_ostream_wchar_vbase_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -8038,1985 +4674,1889 @@ basic_istream_wchar* __thiscall basic_istream_wchar_vector_dtor(basic_ios_wchar
     return this;
 }
 
-/* ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z */
-/* ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z */
-/* ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z */
-/* ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar__Ipfx, 8)
-MSVCP_bool __thiscall basic_istream_wchar__Ipfx(basic_istream_wchar *this, MSVCP_bool noskip)
+/* ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ */
+/* ?flush@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ */
+/* ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ */
+/* ?flush@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_flush, 4)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_flush(basic_ostream_wchar *this)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-
-    TRACE("(%p %d)\n", this, noskip);
-
-    if(!ios_base_good(&base->base)) {
-        basic_ios_wchar_setstate(base, IOSTATE_failbit);
-        return FALSE;
-    }
-
-    if(basic_ios_wchar_tie_get(base))
-        basic_ostream_wchar_flush(basic_ios_wchar_tie_get(base));
-
-    if(!noskip && (ios_base_flags_get(&base->base) & FMTFLAG_skipws)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        const ctype_wchar *ctype = ctype_wchar_use_facet(base->strbuf->loc);
-        int ch;
-
-        for(ch = basic_streambuf_wchar_sgetc(strbuf); ;
-                ch = basic_streambuf_wchar_snextc(strbuf)) {
-            if(ch == WEOF) {
-                basic_ios_wchar_setstate(base, IOSTATE_eofbit);
-                return FALSE;
-            }
-
-            if(!ctype_wchar_is_ch(ctype, _SPACE|_BLANK, ch))
-                break;
-        }
-    }
+    /* this function is not matching C++ specification */
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-    return TRUE;
-}
+    TRACE("(%p)\n", this);
 
-/* ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z */
-/* ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z */
-/* ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z */
-/* ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ipfx, 8)
-MSVCP_bool __thiscall basic_istream_wchar_ipfx(basic_istream_wchar *this, MSVCP_bool noskip)
-{
-    return basic_istream_wchar__Ipfx(this, noskip);
+    if(basic_ios_wchar_rdbuf_get(base) && ios_base_good(&base->base)
+            && basic_streambuf_wchar_pubsync(basic_ios_wchar_rdbuf_get(base))==-1)
+        basic_ios_wchar_setstate(base, IOSTATE_badbit);
+    return this;
 }
 
-/* ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_isfx, 4)
-void __thiscall basic_istream_wchar_isfx(basic_istream_wchar *this)
+/* ?flush@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
+/* ?flush@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
+/* ?flush@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@1@AAV21@@Z */
+/* ?flush@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
+basic_ostream_wchar* __cdecl flush_ostream_wchar(basic_ostream_wchar *ostream)
 {
-    TRACE("(%p)\n", this);
+    return basic_ostream_wchar_flush(ostream);
 }
 
-static BOOL basic_istream_wchar_sentry_create(basic_istream_wchar *istr, MSVCP_bool noskip)
+/* ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
+/* ?_Osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
+/* ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
+/* ?_Osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar__Osfx, 4)
+void __thiscall basic_ostream_wchar__Osfx(basic_ostream_wchar *this)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istr);
-
-    if(basic_ios_wchar_rdbuf_get(base))
-        basic_streambuf_wchar__Lock(base->strbuf);
-
-    return basic_istream_wchar_ipfx(istr, noskip);
-}
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-static void basic_istream_wchar_sentry_destroy(basic_istream_wchar *istr)
-{
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istr);
+    TRACE("(%p)\n", this);
 
-    if(basic_ios_wchar_rdbuf_get(base))
-        basic_streambuf_wchar__Unlock(base->strbuf);
+    if(base->base.fmtfl & FMTFLAG_unitbuf)
+        basic_ostream_wchar_flush(this);
 }
 
-/* ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBEHXZ */
-/* ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEBA_JXZ */
-/* ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBEHXZ */
-/* ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QEBA_JXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_gcount, 4)
-int __thiscall basic_istream_wchar_gcount(const basic_istream_wchar *this)
+/* ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
+/* ?osfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
+/* ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
+/* ?osfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_osfx, 4)
+void __thiscall basic_ostream_wchar_osfx(basic_ostream_wchar *this)
 {
     TRACE("(%p)\n", this);
-    return this->count;
+    basic_ostream_wchar__Osfx(this);
 }
 
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get, 4)
-unsigned short __thiscall basic_istream_wchar_get(basic_istream_wchar *this)
+static BOOL basic_ostream_wchar_sentry_create(basic_ostream_wchar *ostr)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int ret;
-
-    TRACE("(%p)\n", this);
-
-    this->count = 0;
-
-    if(!basic_istream_wchar_sentry_create(this, TRUE)) {
-        basic_istream_wchar_sentry_destroy(this);
-        return WEOF;
-    }
-
-    ret = basic_streambuf_wchar_sbumpc(basic_ios_wchar_rdbuf_get(base));
-    basic_istream_wchar_sentry_destroy(this);
-    if(ret == WEOF)
-        basic_ios_wchar_setstate(base, IOSTATE_eofbit|IOSTATE_failbit);
-    else
-        this->count++;
-
-    return ret;
-}
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
 
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AA_W@Z */
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEA_W@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAG@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAG@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_ch, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_get_ch(basic_istream_wchar *this, wchar_t *ch)
-{
-    unsigned short ret;
+    if(basic_ios_wchar_rdbuf_get(base))
+        basic_streambuf_wchar__Lock(base->strbuf);
 
-    TRACE("(%p %p)\n", this, ch);
+    if(ios_base_good(&base->base) && base->stream)
+        basic_ostream_wchar_flush(base->stream);
 
-    ret = basic_istream_wchar_get(this);
-    if(ret != WEOF)
-        *ch = (wchar_t)ret;
-    return this;
+    return ios_base_good(&base->base);
 }
 
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH_W@Z */
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGHG@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_str_delim, 20)
-basic_istream_wchar* __thiscall basic_istream_wchar_get_str_delim(basic_istream_wchar *this, wchar_t *str, streamsize count, wchar_t delim)
+static void basic_ostream_wchar_sentry_destroy(basic_ostream_wchar *ostr)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    unsigned short ch = delim;
-
-    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
-
-    this->count = 0;
-
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-
-        for(ch = basic_streambuf_wchar_sgetc(strbuf); count>1;
-                ch = basic_streambuf_wchar_snextc(strbuf)) {
-            if(ch==WEOF || ch==delim)
-                break;
-
-            *str++ = ch;
-            this->count++;
-            count--;
-        }
-    }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(ostr);
 
-    basic_ios_wchar_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
-            (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
-    if(count > 0)
-        *str = 0;
-    return this;
-}
+    if(ios_base_good(&base->base) && !__uncaught_exception())
+        basic_ostream_wchar_osfx(ostr);
 
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_str, 16)
-basic_istream_wchar* __thiscall basic_istream_wchar_get_str(basic_istream_wchar *this, wchar_t *str, streamsize count)
-{
-    return basic_istream_wchar_get_str_delim(this, str, count, '\n');
+    if(basic_ios_wchar_rdbuf_get(base))
+        basic_streambuf_wchar__Unlock(base->strbuf);
 }
 
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z */
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_streambuf_delim, 12)
-basic_istream_wchar* __thiscall basic_istream_wchar_get_streambuf_delim(basic_istream_wchar *this, basic_streambuf_wchar *strbuf, wchar_t delim)
+/* ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE_NXZ */
+/* ?opfx@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA_NXZ */
+/* ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE_NXZ */
+/* ?opfx@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA_NXZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_opfx, 4)
+MSVCP_bool __thiscall basic_ostream_wchar_opfx(basic_ostream_wchar *this)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    unsigned short ch = delim;
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-    TRACE("(%p %p %c)\n", this, strbuf, delim);
+    TRACE("(%p)\n", this);
 
-    this->count = 0;
+    if(ios_base_good(&base->base) && base->stream)
+        basic_ostream_wchar_flush(base->stream);
+    return ios_base_good(&base->base);
+}
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        basic_streambuf_wchar *strbuf_read = basic_ios_wchar_rdbuf_get(base);
+/* ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z */
+/* ?put@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z */
+/* ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z */
+/* ?put@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_put, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_put(basic_ostream_wchar *this, wchar_t ch)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-        for(ch = basic_streambuf_wchar_sgetc(strbuf_read); ;
-                ch = basic_streambuf_wchar_snextc(strbuf_read)) {
-            if(ch==WEOF || ch==delim)
-                break;
+    TRACE("(%p %c)\n", this, ch);
 
-            if(basic_streambuf_wchar_sputc(strbuf, ch) == WEOF)
-                break;
-            this->count++;
-        }
+    if(!basic_ostream_wchar_sentry_create(this)
+            || basic_streambuf_wchar_sputc(base->strbuf, ch)==WEOF) {
+        basic_ostream_wchar_sentry_destroy(this);
+        basic_ios_wchar_setstate(base, IOSTATE_badbit);
+        return this;
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
-            (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    basic_ostream_wchar_sentry_destroy(this);
     return this;
 }
 
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z */
-/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z */
-/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_streambuf, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_get_streambuf(basic_istream_wchar *this, basic_streambuf_wchar *strbuf)
-{
-    return basic_istream_wchar_get_streambuf_delim(this, strbuf, '\n');
-}
-
-/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH_W@Z */
-/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z */
-/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGHG@Z */
-/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_getline_delim, 20)
-basic_istream_wchar* __thiscall basic_istream_wchar_getline_delim(basic_istream_wchar *this, wchar_t *str, streamsize count, wchar_t delim)
+/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@JH@Z */
+/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z */
+/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@JH@Z */
+/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_seekp, 16)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_seekp(basic_ostream_wchar *this, streamoff off, int way)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    unsigned short ch = delim;
-
-    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-    this->count = 0;
+    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), way);
 
-    if(basic_istream_wchar_sentry_create(this, TRUE) && count>0) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+    if(!ios_base_fail(&base->base)) {
+        fpos_int seek;
 
-        while(count > 1) {
-            ch = basic_streambuf_wchar_sbumpc(strbuf);
+        basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
+                &seek, off, way, OPENMODE_out);
+        if(seek.off==0 && seek.pos==-1 && seek.state==0)
+            basic_ios_wchar_setstate(base, IOSTATE_failbit);
+    }
+    return this;
+}
 
-            if(ch==WEOF || ch==delim)
-                break;
+/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
+/* ?seekp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
+/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
+/* ?seekp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_seekp_fpos, 28)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_seekp_fpos(basic_ostream_wchar *this, fpos_int pos)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-            *str++ = ch;
-            this->count++;
-            count--;
-        }
+    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
 
-        if(ch == delim)
-            this->count++;
-        else if(ch != WEOF) {
-            ch = basic_streambuf_wchar_sgetc(strbuf);
+    if(!ios_base_fail(&base->base)) {
+        fpos_int seek;
 
-            if(ch == delim) {
-                basic_streambuf_wchar__Gninc(strbuf);
-                this->count++;
-            }
-        }
+        basic_streambuf_wchar_pubseekpos(basic_ios_wchar_rdbuf_get(base),
+                &seek, pos, OPENMODE_out);
+        if(seek.off==0 && seek.pos==-1 && seek.state==0)
+            basic_ios_wchar_setstate(base, IOSTATE_failbit);
     }
-    basic_istream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit) |
-            (!this->count || (ch!=delim && ch!=WEOF) ? IOSTATE_failbit : IOSTATE_goodbit));
-    if(count > 0)
-        *str = 0;
     return this;
 }
 
-/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
-/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
-/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
-/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_getline, 16)
-basic_istream_wchar* __thiscall basic_istream_wchar_getline(basic_istream_wchar *this, wchar_t *str, streamsize count)
-{
-    return basic_istream_wchar_getline_delim(this, str, count, '\n');
-}
-
-/* ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@HG@Z */
-/* ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JG@Z */
-/* ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@HG@Z */
-/* ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JG@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ignore, 16)
-basic_istream_wchar* __thiscall basic_istream_wchar_ignore(basic_istream_wchar *this, streamsize count, unsigned short delim)
+/* ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ */
+/* ?tellp@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
+/* ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ */
+/* ?tellp@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_tellp, 8)
+fpos_int* __thiscall basic_ostream_wchar_tellp(basic_ostream_wchar *this, fpos_int *ret)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    unsigned short ch = delim;
-
-    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(count), delim);
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-    this->count = 0;
+    TRACE("(%p)\n", this);
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+    if(!ios_base_fail(&base->base)) {
+        basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
+                ret, 0, SEEKDIR_cur, OPENMODE_out);
+    }else {
+        ret->off = 0;
+        ret->pos = -1;
+        ret->state = 0;
+    }
+    return ret;
+}
 
-        while(count > 0) {
-            ch = basic_streambuf_wchar_sbumpc(strbuf);
+/* ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PB_WH@Z */
+/* ?write@?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEB_W_J@Z */
+/* ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV12@PBGH@Z */
+/* ?write@?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEBG_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_write, 16)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_write(basic_ostream_wchar *this, const wchar_t *str, streamsize count)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
 
-            if(ch==WEOF || ch==delim)
-                break;
+    TRACE("(%p %s %s)\n", this, debugstr_w(str), wine_dbgstr_longlong(count));
 
-            this->count++;
-            if(count != INT_MAX)
-                count--;
-        }
+    if(!basic_ostream_wchar_sentry_create(this)
+            || basic_streambuf_wchar_sputn(base->strbuf, str, count)!=count) {
+        basic_ostream_wchar_sentry_destroy(this);
+        basic_ios_wchar_setstate(base, IOSTATE_badbit);
+        return this;
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    if(ch == WEOF)
-        basic_ios_wchar_setstate(base, IOSTATE_eofbit);
+    basic_ostream_wchar_sentry_destroy(this);
     return this;
 }
 
-/* ?ws@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
-/* ?ws@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
-/* ?ws@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@1@AAV21@@Z */
-/* ?ws@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
-basic_istream_wchar* __cdecl ws_basic_istream_wchar(basic_istream_wchar *istream)
+static basic_ostream_wchar* basic_ostream_print_short(basic_ostream_wchar *this, short val, const num_put *numput)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
-    unsigned short ch = '\n';
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p)\n", istream);
+    TRACE("(%p %d)\n", this, val);
 
-    if(basic_istream_wchar_sentry_create(istream, TRUE)) {
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        const ctype_wchar *ctype = ctype_wchar_use_facet(strbuf->loc);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        for(ch = basic_streambuf_wchar_sgetc(strbuf); ctype_wchar_is_ch(ctype, _SPACE, ch);
-                ch = basic_streambuf_wchar_snextc(strbuf)) {
-            if(ch == WEOF)
-                break;
-        }
+        num_put_wchar_put_long(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base),
+                (ios_base_flags_get(&base->base) & FMTFLAG_basefield & (FMTFLAG_oct | FMTFLAG_hex))
+                ? (LONG)((unsigned short)val) : (LONG)val);
     }
-    basic_istream_wchar_sentry_destroy(istream);
+    basic_ostream_wchar_sentry_destroy(this);
 
-    if(ch == WEOF)
-        basic_ios_wchar_setstate(base, IOSTATE_eofbit);
-    return istream;
+    basic_ios_wchar_setstate(base, state);
+    return this;
 }
 
-/* ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
-/* ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
-/* ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ */
-/* ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_peek, 4)
-unsigned short __thiscall basic_istream_wchar_peek(basic_istream_wchar *this)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@F@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@F@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_short, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_short(basic_ostream_wchar *this, short val)
+{
+    return basic_ostream_print_short(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@F@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@F@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_short, 8)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_short(basic_ostream_wchar *this, short val)
+{
+    return basic_ostream_print_short(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@G@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@G@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_ushort, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ushort(basic_ostream_wchar *this, unsigned short val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    unsigned short ret = WEOF;
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %u)\n", this, val);
 
-    this->count = 0;
+    if(basic_ostream_wchar_sentry_create(this)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        const num_put *numput = num_put_wchar_use_facet(strbuf->loc);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-    if(basic_istream_wchar_sentry_create(this, TRUE))
-        ret = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base));
-    basic_istream_wchar_sentry_destroy(this);
-    return ret;
+        num_put_wchar_put_ulong(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
+    }
+    basic_ostream_wchar_sentry_destroy(this);
+
+    basic_ios_wchar_setstate(base, state);
+    return this;
 }
 
-/* ?_Read_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WIH@Z */
-/* ?_Read_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_K_J@Z */
-/* ?_Read_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGIH@Z */
-/* ?_Read_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar__Read_s, 20)
-basic_istream_wchar* __thiscall basic_istream_wchar__Read_s(basic_istream_wchar *this, wchar_t *str, MSVCP_size_t size, streamsize count)
+static basic_ostream_wchar* basic_ostream_print_int(basic_ostream_wchar *this, int val, const num_put *numput)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
+    TRACE("(%p %d)\n", this, val);
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        this->count = basic_streambuf_wchar__Sgetn_s(strbuf, str, size, count);
-        if(this->count != count)
-            state |= IOSTATE_failbit | IOSTATE_eofbit;
-    }else {
-        this->count = 0;
+        num_put_wchar_put_long(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
-/* ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
-/* ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
-/* ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read, 16)
-basic_istream_wchar* __thiscall basic_istream_wchar_read(basic_istream_wchar *this, wchar_t *str, streamsize count)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@H@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@H@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@J@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_int, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_int(basic_ostream_wchar *this, int val)
 {
-    return basic_istream_wchar__Read_s(this, str, count, count);
+    return basic_ostream_print_int(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
 }
 
-/* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WIH@Z */
-/* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_K_J@Z */
-/* ?_Readsome_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHPAGIH@Z */
-/* ?_Readsome_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_K_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar__Readsome_s, 20)
-streamsize __thiscall basic_istream_wchar__Readsome_s(basic_istream_wchar *this, wchar_t *str, MSVCP_size_t size, streamsize count)
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@H@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@H@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@J@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_int, 8)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_int(basic_ostream_wchar *this, int val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
+    return basic_ostream_print_int(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
 
-    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
+static basic_ostream_wchar* basic_ostream_print_uint(basic_ostream_wchar *this, unsigned int val, const num_put *numput)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    this->count = 0;
+    TRACE("(%p %u)\n", this, val);
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        streamsize avail = basic_streambuf_wchar_in_avail(basic_ios_wchar_rdbuf_get(base));
-        if(avail > count)
-            avail = count;
+    if(basic_ostream_wchar_sentry_create(this)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        if(avail == -1)
-            state |= IOSTATE_eofbit;
-        else if(avail > 0)
-            basic_istream_wchar__Read_s(this, str, size, avail);
-    }else {
-        state |= IOSTATE_failbit;
+        num_put_wchar_put_ulong(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
-    return this->count;
+    return this;
 }
 
-/* ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WH@Z */
-/* ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z */
-/* ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHPAGH@Z */
-/* ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_readsome, 16)
-streamsize __thiscall basic_istream_wchar_readsome(basic_istream_wchar *this, wchar_t *str, streamsize count)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@I@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@I@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@K@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@K@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_uint, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_uint(basic_ostream_wchar *this, unsigned int val)
 {
-    return basic_istream_wchar__Readsome_s(this, str, count, count);
+    return basic_ostream_print_uint(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
 }
 
-/* ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z */
-/* ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z */
-/* ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z */
-/* ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_putback, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_putback(basic_istream_wchar *this, wchar_t ch)
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@I@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@I@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@K@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@K@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_uint, 8)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_uint(basic_ostream_wchar *this, unsigned int val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
+    return basic_ostream_print_uint(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
 
-    TRACE("(%p %c)\n", this, ch);
+static basic_ostream_wchar* basic_ostream_print_float(basic_ostream_wchar *this, float val, const num_put *numput)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    this->count = 0;
+    TRACE("(%p %f)\n", this, val);
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        if(!ios_base_good(&base->base))
-            state |= IOSTATE_failbit;
-        else if(!strbuf || basic_streambuf_wchar_sputbackc(strbuf, ch)==WEOF)
-            state |= IOSTATE_badbit;
+        num_put_wchar_put_double(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ */
-/* ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ */
-/* ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ */
-/* ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_unget, 4)
-basic_istream_wchar* __thiscall basic_istream_wchar_unget(basic_istream_wchar *this)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@M@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@M@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_float, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_float(basic_ostream_wchar *this, float val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_goodbit;
+    return basic_ostream_print_float(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
 
-    TRACE("(%p)\n", this);
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@M@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@M@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_float, 8)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_float(basic_ostream_wchar *this, float val)
+{
+    return basic_ostream_print_float(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
 
-    this->count = 0;
+static basic_ostream_wchar* basic_ostream_print_double(basic_ostream_wchar *this, double val, const num_put *numput)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+    TRACE("(%p %lf)\n", this, val);
+
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        if(!ios_base_good(&base->base))
-            state |= IOSTATE_failbit;
-        else if(!strbuf || basic_streambuf_wchar_sungetc(strbuf)==WEOF)
-            state |= IOSTATE_badbit;
+        num_put_wchar_put_double(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHXZ */
-/* ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAHXZ */
-/* ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHXZ */
-/* ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAHXZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_sync, 4)
-int __thiscall basic_istream_wchar_sync(basic_istream_wchar *this)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@N@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_double, 12)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_double(basic_ostream_wchar *this, double val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-
-    TRACE("(%p)\n", this);
-
-    if(!strbuf)
-        return -1;
-
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        if(basic_streambuf_wchar_pubsync(strbuf) != -1) {
-            basic_istream_wchar_sentry_destroy(this);
-            return 0;
-        }
-    }
-    basic_istream_wchar_sentry_destroy(this);
+    return basic_ostream_print_double(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
 
-    basic_ios_wchar_setstate(base, IOSTATE_badbit);
-    return -1;
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@N@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_double, 12)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_double(basic_ostream_wchar *this, double val)
+{
+    return basic_ostream_print_double(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
 }
 
-/* ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ */
-/* ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
-/* ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ */
-/* ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_tellg, 8)
-fpos_int* __thiscall basic_istream_wchar_tellg(basic_istream_wchar *this, fpos_int *ret)
+static basic_ostream_wchar* basic_ostream_print_ldouble(basic_ostream_wchar *this, double val, const num_put *numput)
 {
-    TRACE("(%p %p)\n", this, ret);
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-        if(!ios_base_fail(&base->base)) {
-            basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
-                    ret, 0, SEEKDIR_cur, OPENMODE_in);
-            basic_istream_wchar_sentry_destroy(this);
+    TRACE("(%p %lf)\n", this, val);
 
-            if(ret->off==0 && ret->pos==-1 && ret->state==0)
-                basic_ios_wchar_setstate(base, IOSTATE_failbit);
-            return ret;
-        }
+    if(basic_ostream_wchar_sentry_create(this)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
+
+        num_put_wchar_put_ldouble(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
+
+    basic_ios_wchar_setstate(base, state);
+    return this;
+}
 
-    ret->off = 0;
-    ret->pos = -1;
-    ret->state = 0;
-    return ret;
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@O@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@O@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_ldouble, 12)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ldouble(basic_ostream_wchar *this, double val)
+{
+    return basic_ostream_print_ldouble(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
 }
 
-/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@JH@Z */
-/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z */
-/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@JH@Z */
-/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_seekg, 16)
-basic_istream_wchar* __thiscall basic_istream_wchar_seekg(basic_istream_wchar *this, streamoff off, int dir)
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@O@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@O@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_ldouble, 12)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_ldouble(basic_ostream_wchar *this, double val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    return basic_ostream_print_ldouble(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
 
-    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), dir);
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_streambuf, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_streambuf(basic_ostream_wchar *this, basic_streambuf_wchar *val)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_badbit;
+    unsigned short c = '\n';
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        if(!ios_base_fail(&base->base)) {
-            basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-            fpos_int ret;
+    TRACE("(%p %p)\n", this, val);
 
-            basic_streambuf_wchar_pubseekoff(strbuf, &ret, off, dir, OPENMODE_in);
-            basic_istream_wchar_sentry_destroy(this);
+    if(basic_ostream_wchar_sentry_create(this)) {
+        for(c = basic_streambuf_wchar_sgetc(val); c!=WEOF;
+                c = basic_streambuf_wchar_snextc(val)) {
+            state = IOSTATE_goodbit;
 
-            if(ret.off==0 && ret.pos==-1 && ret.state==0)
-                basic_ios_wchar_setstate(base, IOSTATE_failbit);
-            else
-                basic_ios_wchar_clear(base, IOSTATE_goodbit);
-            return this;
+            if(basic_streambuf_wchar_sputc(base->strbuf, c) == WEOF) {
+                state = IOSTATE_badbit;
+                break;
+            }
         }
+    }else {
+        state = IOSTATE_badbit;
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, IOSTATE_failbit);
+    ios_base_width_set(&base->base, 0);
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
-/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
-/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
-/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_seekg_fpos, 28)
-basic_istream_wchar* __thiscall basic_istream_wchar_seekg_fpos(basic_istream_wchar *this, fpos_int pos)
+static basic_ostream_wchar* basic_ostream_print_ptr(basic_ostream_wchar *this, const void *val, const num_put *numput)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-
-    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    if(basic_istream_wchar_sentry_create(this, TRUE)) {
-        if(!ios_base_fail(&base->base)) {
-            basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-            fpos_int ret;
+    TRACE("(%p %p)\n", this, val);
 
-            basic_streambuf_wchar_pubseekpos(strbuf, &ret, pos, OPENMODE_in);
-            basic_istream_wchar_sentry_destroy(this);
+    if(basic_ostream_wchar_sentry_create(this)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-            if(ret.off==0 && ret.pos==-1 && ret.state==0)
-                basic_ios_wchar_setstate(base, IOSTATE_failbit);
-            else
-                basic_ios_wchar_clear(base, IOSTATE_goodbit);
-            return this;
-        }
+        num_put_wchar_put_ptr(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, IOSTATE_failbit);
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-static basic_istream_wchar* basic_istream_read_short(basic_istream_wchar *this, short *v, const num_get *numget)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PBX@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEBX@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_ptr, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_ptr(basic_ostream_wchar *this, const void *val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    return basic_ostream_print_ptr(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@PBX@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEBX@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_ptr, 8)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_ptr(basic_ostream_wchar *this, const void *val)
+{
+    return basic_ostream_print_ptr(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+static basic_ostream_wchar* basic_ostream_print_int64(basic_ostream_wchar *this, __int64 val, const num_put *numput)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p)\n", this);
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
-        LONG tmp;
-
-        first.strbuf = strbuf;
-        num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, &tmp);
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        if(!(state&IOSTATE_failbit) && tmp==(LONG)((short)tmp))
-            *v = tmp;
-        else
-            state |= IOSTATE_failbit;
+        num_put_wchar_put_int64(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAF@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAF@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_short, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_short(basic_istream_wchar *this, short *v)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_J@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_int64, 12)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_int64(basic_ostream_wchar *this, __int64 val)
 {
-    return basic_istream_read_short(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_ostream_print_int64(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAF@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAF@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_short, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_short(basic_istream_wchar *this, short *v)
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_J@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_int64, 12)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_int64(basic_ostream_wchar *this, __int64 val)
 {
-    return basic_istream_read_short(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_ostream_print_int64(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAG@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAG@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ushort, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_ushort(basic_istream_wchar *this, unsigned short *v)
+static basic_ostream_wchar* basic_ostream_print_uint64(basic_ostream_wchar *this, unsigned __int64 val, const num_put *numput)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p)\n", this);
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        const num_get *numget = num_get_wchar_use_facet(strbuf->loc);
-        istreambuf_iterator_wchar first={0}, last={0};
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_ushort(numget, &last, first, last, &base->base, &state, v);
+        num_put_wchar_put_uint64(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-static basic_istream_wchar* basic_istream_read_int(basic_istream_wchar *this, int *v, const num_get *numget)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_K@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_K@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_uint64, 12)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_uint64(basic_ostream_wchar *this, unsigned __int64 val)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    return basic_ostream_print_uint64(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_K@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_K@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_uint64, 12)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_uint64(basic_ostream_wchar *this, unsigned __int64 val)
+{
+    return basic_ostream_print_uint64(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+static basic_ostream_wchar* basic_ostream_print_bool(basic_ostream_wchar *this, MSVCP_bool val, const num_put *numput)
+{
+    basic_ios_wchar *base = basic_ostream_wchar_get_basic_ios(this);
     int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %x)\n", this, val);
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+    if(basic_ostream_wchar_sentry_create(this)) {
         basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+        ostreambuf_iterator_wchar dest = {0, strbuf};
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, v);
+        num_put_wchar_put_bool(numput, &dest, dest, &base->base, basic_ios_wchar_fill_get(base), val);
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_ostream_wchar_sentry_destroy(this);
 
     basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAH@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAH@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_int, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_int(basic_istream_wchar *this, int *v)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@_N@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_bool, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_bool(basic_ostream_wchar *this, MSVCP_bool val)
 {
-    return basic_istream_read_int(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_ostream_print_bool(this, val, num_put_wchar_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@_N@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_short_print_bool, 8)
+basic_ostream_wchar* __thiscall basic_ostream_short_print_bool(basic_ostream_wchar *this, MSVCP_bool val)
+{
+    return basic_ostream_print_bool(this, val, num_put_short_use_facet(
+                basic_ios_wchar_rdbuf_get(basic_ostream_wchar_get_basic_ios(this))->loc));
+}
+
+/* ?endl@std@@YAAAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
+/* ?endl@std@@YAAEAV?$basic_ostream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
+/* ?endl@std@@YAAAV?$basic_ostream@GU?$char_traits@G@std@@@1@AAV21@@Z */
+/* ?endl@std@@YAAEAV?$basic_ostream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
+basic_ostream_wchar* __cdecl basic_ostream_wchar_endl(basic_ostream_wchar *ostr)
+{
+    TRACE("(%p)\n", ostr);
+
+    basic_ostream_wchar_put(ostr, '\n');
+    basic_ostream_wchar_flush(ostr);
+    return ostr;
+}
+
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func(basic_ostream_wchar *this,
+        basic_ostream_wchar* (__cdecl *pfunc)(basic_ostream_wchar*))
+{
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(this);
+    return this;
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAH@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAH@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_int, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_int(basic_istream_wchar *this, int *v)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func_basic_ios, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func_basic_ios(basic_ostream_wchar *this,
+        basic_ios_wchar* (__cdecl *pfunc)(basic_ios_wchar*))
 {
-    return basic_istream_read_int(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(basic_ostream_wchar_get_basic_ios(this));
+    return this;
 }
 
-static basic_istream_wchar* basic_istream_read_uint(basic_istream_wchar *this, unsigned int *v, const num_get *numget)
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
+/* ??6?$basic_ostream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
+/* ??6?$basic_ostream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_ostream_wchar_print_func_ios_base, 8)
+basic_ostream_wchar* __thiscall basic_ostream_wchar_print_func_ios_base(
+        basic_ostream_wchar *this, ios_base* (__cdecl *pfunc)(ios_base*))
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, v);
-
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
-
-        first.strbuf = strbuf;
-        num_get_wchar_get_uint(numget, &last, first, last, &base->base, &state, v);
-    }
-    basic_istream_wchar_sentry_destroy(this);
-
-    basic_ios_wchar_setstate(base, state);
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(&basic_ostream_wchar_get_basic_ios(this)->base);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAI@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAI@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_uint, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_uint(basic_istream_wchar *this, unsigned int *v)
+/* Caution: basic_istream uses virtual inheritance. */
+static inline basic_ios_char* basic_istream_char_get_basic_ios(basic_istream_char *this)
 {
-    return basic_istream_read_uint(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return (basic_ios_char*)((char*)this+this->vbtable[1]);
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAI@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAI@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_uint, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_uint(basic_istream_wchar *this, unsigned int *v)
+static inline basic_ios_char* basic_istream_char_to_basic_ios(basic_istream_char *ptr)
 {
-    return basic_istream_read_uint(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return (basic_ios_char*)((char*)ptr+basic_istream_char_vbtable[1]);
 }
 
-static basic_istream_wchar* basic_istream_read_long(basic_istream_wchar *this, LONG *v, const num_get *numget)
+static inline basic_istream_char* basic_istream_char_from_basic_ios(basic_ios_char *ptr)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    return (basic_istream_char*)((char*)ptr-basic_istream_char_vbtable[1]);
+}
 
-    TRACE("(%p %p)\n", this, v);
+/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */
+/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N1@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor_init, 20)
+basic_istream_char* __thiscall basic_istream_char_ctor_init(basic_istream_char *this, basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
+{
+    basic_ios_char *base;
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    TRACE("(%p %p %d %d %d)\n", this, strbuf, isstd, noinit, virt_init);
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, v);
+    if(virt_init) {
+        this->vbtable = basic_istream_char_vbtable;
+        base = basic_istream_char_get_basic_ios(this);
+        basic_ios_char_ctor(base);
+    }else {
+        base = basic_istream_char_get_basic_ios(this);
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
+    base->base.vtable = &MSVCP_basic_istream_char_vtable;
+    this->count = 0;
+    if(!noinit)
+        basic_ios_char_init(base, strbuf, isstd);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_long, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_long(basic_istream_wchar *this, LONG *v)
-{
-    return basic_istream_read_long(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
-}
-
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_long, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_long(basic_istream_wchar *this, LONG *v)
+/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
+/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor, 16)
+basic_istream_char* __thiscall basic_istream_char_ctor(basic_istream_char *this, basic_streambuf_char *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
 {
-    return basic_istream_read_long(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_istream_char_ctor_init(this, strbuf, isstd, FALSE, virt_init);
 }
 
-static basic_istream_wchar* basic_istream_read_ulong(basic_istream_wchar *this, ULONG *v, const num_get *numget)
+/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QAE@W4_Uninitialized@1@@Z */
+/* ??0?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_ctor_uninitialized, 12)
+basic_istream_char* __thiscall basic_istream_char_ctor_uninitialized(basic_istream_char *this, int uninitialized, MSVCP_bool virt_init)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, v);
+    basic_ios_char *base;
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    TRACE("(%p %d %d)\n", this, uninitialized, virt_init);
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_ulong(numget, &last, first, last, &base->base, &state, v);
+    if(virt_init) {
+        this->vbtable = basic_istream_char_vbtable;
+        base = basic_istream_char_get_basic_ios(this);
+        basic_ios_char_ctor(base);
+    }else {
+        base = basic_istream_char_get_basic_ios(this);
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
+    base->base.vtable = &MSVCP_basic_istream_char_vtable;
+    ios_base_Addstd(&base->base);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAK@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAK@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ulong, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_ulong(basic_istream_wchar *this, ULONG *v)
+/* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UAE@XZ */
+/* ??1?$basic_istream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_dtor, 4)
+void __thiscall basic_istream_char_dtor(basic_ios_char *base)
 {
-    return basic_istream_read_ulong(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    basic_istream_char *this = basic_istream_char_from_basic_ios(base);
+
+    /* don't destroy virtual base here */
+    TRACE("(%p)\n", this);
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAK@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAK@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ulong, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_ulong(basic_istream_wchar *this, ULONG *v)
+/* ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ */
+/* ??_D?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_vbase_dtor, 4)
+void __thiscall basic_istream_char_vbase_dtor(basic_istream_char *this)
 {
-    return basic_istream_read_ulong(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    TRACE("(%p)\n", this);
+    basic_istream_char_dtor(basic_istream_char_to_basic_ios(this));
+    basic_ios_char_dtor(basic_istream_char_get_basic_ios(this));
 }
 
-static basic_istream_wchar* basic_istream_read_float(basic_istream_wchar *this, float *v, const num_get *numget)
+DEFINE_THISCALL_WRAPPER(basic_istream_char_vector_dtor, 8)
+basic_istream_char* __thiscall basic_istream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    basic_istream_char *this = basic_istream_char_from_basic_ios(base);
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %x)\n", this, flags);
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    if(flags & 2) {
+        /* we have an array, with the number of elements stored before the first object */
+        INT_PTR i, *ptr = (INT_PTR *)this-1;
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_float(numget, &last, first, last, &base->base, &state, v);
+        for(i=*ptr-1; i>=0; i--)
+            basic_istream_char_vbase_dtor(this+i);
+        MSVCRT_operator_delete(ptr);
+    } else {
+        basic_istream_char_vbase_dtor(this);
+        if(flags & 1)
+            MSVCRT_operator_delete(this);
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAM@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAM@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_float, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_float(basic_istream_wchar *this, float *v)
+/* ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z */
+/* ?_Ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char__Ipfx, 8)
+MSVCP_bool __thiscall basic_istream_char__Ipfx(basic_istream_char *this, MSVCP_bool noskip)
 {
-    return basic_istream_read_float(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAM@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAM@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_float, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_float(basic_istream_wchar *this, float *v)
-{
-    return basic_istream_read_float(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
-}
+    TRACE("(%p %d)\n", this, noskip);
 
-static basic_istream_wchar* basic_istream_read_double(basic_istream_wchar *this, double *v, const num_get *numget)
-{
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    if(!ios_base_good(&base->base)) {
+        basic_ios_char_setstate(base, IOSTATE_failbit);
+        return FALSE;
+    }
 
-    TRACE("(%p %p)\n", this, v);
+    if(basic_ios_char_tie_get(base))
+        basic_ostream_char_flush(basic_ios_char_tie_get(base));
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    if(!noskip && (ios_base_flags_get(&base->base) & FMTFLAG_skipws)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const ctype_char *ctype = ctype_char_use_facet(base->strbuf->loc);
+        int ch;
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_double(numget, &last, first, last, &base->base, &state, v);
+        for(ch = basic_streambuf_char_sgetc(strbuf); ;
+                ch = basic_streambuf_char_snextc(strbuf)) {
+            if(ch == EOF) {
+                basic_ios_char_setstate(base, IOSTATE_eofbit);
+                return FALSE;
+            }
+
+            if(!ctype_char_is_ch(ctype, _SPACE|_BLANK, ch))
+                break;
+        }
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
-    return this;
+    return TRUE;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAN@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAN@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_double, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_double(basic_istream_wchar *this, double *v)
+/* ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE_N_N@Z */
+/* ?ipfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_N_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_ipfx, 8)
+MSVCP_bool __thiscall basic_istream_char_ipfx(basic_istream_char *this, MSVCP_bool noskip)
 {
-    return basic_istream_read_double(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_istream_char__Ipfx(this, noskip);
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAN@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAN@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_double, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_double(basic_istream_wchar *this, double *v)
+/* ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEXXZ */
+/* ?isfx@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_isfx, 4)
+void __thiscall basic_istream_char_isfx(basic_istream_char *this)
 {
-    return basic_istream_read_double(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    TRACE("(%p)\n", this);
 }
 
-static basic_istream_wchar* basic_istream_read_ldouble(basic_istream_wchar *this, double *v, const num_get *numget)
+static BOOL basic_istream_char_sentry_create(basic_istream_char *istr, MSVCP_bool noskip)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
-
-    TRACE("(%p %p)\n", this, v);
-
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    basic_ios_char *base = basic_istream_char_get_basic_ios(istr);
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_ldouble(numget, &last, first, last, &base->base, &state, v);
-    }
-    basic_istream_wchar_sentry_destroy(this);
+    if(basic_ios_char_rdbuf_get(base))
+        call_basic_streambuf_char__Lock(base->strbuf);
 
-    basic_ios_wchar_setstate(base, state);
-    return this;
+    return basic_istream_char_ipfx(istr, noskip);
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAO@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAO@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ldouble, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_ldouble(basic_istream_wchar *this, double *v)
+static void basic_istream_char_sentry_destroy(basic_istream_char *istr)
 {
-    return basic_istream_read_ldouble(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    basic_ios_char *base = basic_istream_char_get_basic_ios(istr);
+
+    if(basic_ios_char_rdbuf_get(base))
+        call_basic_streambuf_char__Unlock(base->strbuf);
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAO@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAO@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ldouble, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_ldouble(basic_istream_wchar *this, double *v)
+/* ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QBEHXZ */
+/* ?gcount@?$basic_istream@DU?$char_traits@D@std@@@std@@QEBA_JXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_gcount, 4)
+int __thiscall basic_istream_char_gcount(const basic_istream_char *this)
 {
-    return basic_istream_read_ldouble(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    TRACE("(%p)\n", this);
+    return this->count;
 }
 
-static basic_istream_wchar* basic_istream_read_ptr(basic_istream_wchar *this, void **v, const num_get *numget)
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_get, 4)
+int __thiscall basic_istream_char_get(basic_istream_char *this)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int ret;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p)\n", this);
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    this->count = 0;
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_void(numget, &last, first, last, &base->base, &state, v);
+    if(!basic_istream_char_sentry_create(this, TRUE)) {
+        basic_istream_char_sentry_destroy(this);
+        return EOF;
     }
-    basic_istream_wchar_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
-    return this;
-}
+    ret = basic_streambuf_char_sbumpc(basic_ios_char_rdbuf_get(base));
+    basic_istream_char_sentry_destroy(this);
+    if(ret == EOF)
+        basic_ios_char_setstate(base, IOSTATE_eofbit|IOSTATE_failbit);
+    else
+        this->count++;
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAPAX@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ptr, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_ptr(basic_istream_wchar *this, void **v)
-{
-    return basic_istream_read_ptr(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return ret;
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAPAX@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ptr, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_ptr(basic_istream_wchar *this, void **v)
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAD@Z */
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAD@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_get_ch, 8)
+basic_istream_char* __thiscall basic_istream_char_get_ch(basic_istream_char *this, char *ch)
 {
-    return basic_istream_read_ptr(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    int ret;
+
+    TRACE("(%p %p)\n", this, ch);
+
+    ret = basic_istream_char_get(this);
+    if(ret != EOF)
+        *ch = (char)ret;
+    return this;
 }
 
-static basic_istream_wchar* basic_istream_read_int64(basic_istream_wchar *this, __int64 *v, const num_get *numget)
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADHD@Z */
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_get_str_delim, 20)
+basic_istream_char* __thiscall basic_istream_char_get_str_delim(basic_istream_char *this, char *str, streamsize count, char delim)
 {
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int ch = delim;
 
-    TRACE("(%p %p)\n", this, v);
+    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    this->count = 0;
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_int64(numget, &last, first, last, &base->base, &state, v);
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+
+        for(ch = basic_streambuf_char_sgetc(strbuf); count>1;
+                ch = basic_streambuf_char_snextc(strbuf)) {
+            if(ch==EOF || ch==delim)
+                break;
+
+            *str++ = ch;
+            this->count++;
+            count--;
+        }
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
+    basic_ios_char_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
+            (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    if(count > 0)
+        *str = 0;
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_J@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_int64, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_int64(basic_istream_wchar *this, __int64 *v)
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_get_str, 16)
+basic_istream_char* __thiscall basic_istream_char_get_str(basic_istream_char *this, char *str, streamsize count)
 {
-    return basic_istream_read_int64(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_istream_char_get_str_delim(this, str, count, '\n');
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_J@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_J@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_int64, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_int64(basic_istream_wchar *this, __int64 *v)
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z */
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@D@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_get_streambuf_delim, 12)
+basic_istream_char* __thiscall basic_istream_char_get_streambuf_delim(basic_istream_char *this, basic_streambuf_char *strbuf, char delim)
 {
-    return basic_istream_read_int64(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int ch = delim;
 
-static basic_istream_wchar* basic_istream_read_uint64(basic_istream_wchar *this, unsigned __int64 *v, const num_get *numget)
-{
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    TRACE("(%p %p %c)\n", this, strbuf, delim);
 
-    TRACE("(%p %p)\n", this, v);
+    this->count = 0;
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_streambuf_char *strbuf_read = basic_ios_char_rdbuf_get(base);
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_uint64(numget, &last, first, last, &base->base, &state, v);
+        for(ch = basic_streambuf_char_sgetc(strbuf_read); ;
+                ch = basic_streambuf_char_snextc(strbuf_read)) {
+            if(ch==EOF || ch==delim)
+                break;
+
+            if(basic_streambuf_char_sputc(strbuf, ch) == EOF)
+                break;
+            this->count++;
+        }
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
+    basic_ios_char_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
+            (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_K@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_uint64, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_uint64(basic_istream_wchar *this, unsigned __int64 *v)
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@AAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z */
+/* ?get@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@DU?$char_traits@D@std@@@2@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_get_streambuf, 8)
+basic_istream_char* __thiscall basic_istream_char_get_streambuf(basic_istream_char *this, basic_streambuf_char *strbuf)
 {
-    return basic_istream_read_uint64(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_istream_char_get_streambuf_delim(this, strbuf, '\n');
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_K@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_uint64, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_uint64(basic_istream_wchar *this, unsigned __int64 *v)
+/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADHD@Z */
+/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_JD@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_getline_delim, 20)
+basic_istream_char* __thiscall basic_istream_char_getline_delim(basic_istream_char *this, char *str, streamsize count, char delim)
 {
-    return basic_istream_read_uint64(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int ch = delim;
 
-static basic_istream_wchar* basic_istream_read_bool(basic_istream_wchar *this, MSVCP_bool *v, const num_get *numget)
-{
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    int state = IOSTATE_goodbit;
+    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
 
-    TRACE("(%p %p)\n", this, v);
+    this->count = 0;
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
-        istreambuf_iterator_wchar first={0}, last={0};
+    if(basic_istream_char_sentry_create(this, TRUE) && count>0) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
 
-        first.strbuf = strbuf;
-        num_get_wchar_get_bool(numget, &last, first, last, &base->base, &state, v);
+        while(count > 1) {
+            ch = basic_streambuf_char_sbumpc(strbuf);
+
+            if(ch==EOF || ch==delim)
+                break;
+
+            *str++ = ch;
+            this->count++;
+            count--;
+        }
+
+        if(ch == delim)
+            this->count++;
+        else if(ch != EOF) {
+            ch = basic_streambuf_char_sgetc(strbuf);
+
+            if(ch == delim) {
+                basic_streambuf_char__Gninc(strbuf);
+                this->count++;
+            }
+        }
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state);
+    basic_ios_char_setstate(base, (ch==EOF ? IOSTATE_eofbit : IOSTATE_goodbit) |
+            (!this->count || (ch!=delim && ch!=EOF) ? IOSTATE_failbit : IOSTATE_goodbit));
+    if(count > 0)
+        *str = 0;
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_N@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_bool, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_bool(basic_istream_wchar *this, MSVCP_bool *v)
+/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
+/* ?getline@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_getline, 16)
+basic_istream_char* __thiscall basic_istream_char_getline(basic_istream_char *this, char *str, streamsize count)
 {
-    return basic_istream_read_bool(this, v, num_get_wchar_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+    return basic_istream_char_getline_delim(this, str, count, '\n');
 }
 
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_N@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_short_read_bool, 8)
-basic_istream_wchar* __thiscall basic_istream_short_read_bool(basic_istream_wchar *this, MSVCP_bool *v)
+/* ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@HH@Z */
+/* ?ignore@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_ignore, 16)
+basic_istream_char* __thiscall basic_istream_char_ignore(basic_istream_char *this, streamsize count, int delim)
 {
-    return basic_istream_read_bool(this, v, num_get_short_use_facet(
-                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int ch = delim;
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_streambuf, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_streambuf(
-        basic_istream_wchar *this, basic_streambuf_wchar *streambuf)
-{
-    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
-    IOSB_iostate state = IOSTATE_failbit;
-    unsigned short c = '\n';
+    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(count), delim);
 
-    TRACE("(%p %p)\n", this, streambuf);
+    this->count = 0;
 
-    if(basic_istream_wchar_sentry_create(this, FALSE)) {
-        for(c = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base)); c!=WEOF;
-                c = basic_streambuf_wchar_snextc(basic_ios_wchar_rdbuf_get(base))) {
-            state = IOSTATE_goodbit;
-            if(basic_streambuf_wchar_sputc(streambuf, c) == WEOF)
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+
+        while(count > 0) {
+            ch = basic_streambuf_char_sbumpc(strbuf);
+
+            if(ch==EOF || ch==delim)
                 break;
+
+            this->count++;
+            if(count != INT_MAX)
+                count--;
         }
     }
-    basic_istream_wchar_sentry_destroy(this);
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ios_wchar_setstate(base, state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    if(ch == EOF)
+        basic_ios_char_setstate(base, IOSTATE_eofbit);
     return this;
 }
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_func(basic_istream_wchar *this,
-        basic_istream_wchar* (__cdecl *pfunc)(basic_istream_wchar*))
+/* ?ws@std@@YAAAV?$basic_istream@DU?$char_traits@D@std@@@1@AAV21@@Z */
+/* ?ws@std@@YAAEAV?$basic_istream@DU?$char_traits@D@std@@@1@AEAV21@@Z */
+basic_istream_char* __cdecl ws_basic_istream_char(basic_istream_char *istream)
 {
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(this);
-    return this;
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(istream);
+    int ch = '\n';
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func_basic_ios, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_func_basic_ios(basic_istream_wchar *this,
-        basic_ios_wchar* (__cdecl *pfunc)(basic_ios_wchar*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(basic_istream_wchar_get_basic_ios(this));
-    return this;
-}
+    TRACE("(%p)\n", istream);
 
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
-/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
-/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
-DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func_ios_base, 8)
-basic_istream_wchar* __thiscall basic_istream_wchar_read_func_ios_base(
-        basic_istream_wchar *this, ios_base* (__cdecl *pfunc)(ios_base*))
-{
-    TRACE("(%p %p)\n", this, pfunc);
-    pfunc(&basic_istream_wchar_get_basic_ios(this)->base);
-    return this;
-}
+    if(basic_istream_char_sentry_create(istream, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const ctype_char *ctype = ctype_char_use_facet(strbuf->loc);
 
-static inline basic_ios_char* basic_iostream_char_to_basic_ios(basic_iostream_char *ptr)
-{
-    return (basic_ios_char*)((char*)ptr+basic_iostream_char_vbtable1[1]);
+        for(ch = basic_streambuf_char_sgetc(strbuf); ctype_char_is_ch(ctype, _SPACE, ch);
+                ch = basic_streambuf_char_snextc(strbuf)) {
+            if(ch == EOF)
+                break;
+        }
+    }
+    basic_istream_char_sentry_destroy(istream);
+
+    if(ch == EOF)
+        basic_ios_char_setstate(base, IOSTATE_eofbit);
+    return istream;
 }
 
-static inline basic_iostream_char* basic_iostream_char_from_basic_ios(basic_ios_char *ptr)
+/* ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
+/* ?peek@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_peek, 4)
+int __thiscall basic_istream_char_peek(basic_istream_char *this)
 {
-    return (basic_iostream_char*)((char*)ptr-basic_iostream_char_vbtable1[1]);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int ret = EOF;
+
+    TRACE("(%p)\n", this);
+
+    this->count = 0;
+
+    if(basic_istream_char_sentry_create(this, TRUE))
+        ret = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base));
+    basic_istream_char_sentry_destroy(this);
+    return ret;
 }
 
-/* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-/* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_iostream_char_ctor, 12)
-basic_iostream_char* __thiscall basic_iostream_char_ctor(basic_iostream_char *this, basic_streambuf_char *strbuf, MSVCP_bool virt_init)
+/* ?_Read_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADIH@Z */
+/* ?_Read_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_K_J@Z */
+static basic_istream_char* basic_istream_char__Read_s(basic_istream_char *this, char *str, MSVCP_size_t size, streamsize count)
 {
-    basic_ios_char *basic_ios;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-    TRACE("(%p %p %d)\n", this, strbuf, virt_init);
+    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
 
-    if(virt_init) {
-        this->base1.vbtable = basic_iostream_char_vbtable1;
-        this->base2.vbtable = basic_iostream_char_vbtable2;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base1);
-        basic_ios_char_ctor(basic_ios);
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+
+        this->count = basic_streambuf_char__Sgetn_s(strbuf, str, size, count);
+        if(this->count != count)
+            state |= IOSTATE_failbit | IOSTATE_eofbit;
     }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base1);
+        this->count = 0;
     }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ios->base.vtable = &MSVCP_basic_iostream_char_vtable;
-
-    basic_istream_char_ctor(&this->base1, strbuf, FALSE, FALSE);
-    basic_ostream_char_ctor_uninitialized(&this->base2, 0, FALSE, FALSE);
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_iostream_char_dtor, 4)
-void __thiscall basic_iostream_char_dtor(basic_ios_char *base)
+/* ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@PADH@Z */
+/* ?read@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@PEAD_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read, 16)
+basic_istream_char* __thiscall basic_istream_char_read(basic_istream_char *this, char *str, streamsize count)
 {
-    basic_iostream_char *this = basic_iostream_char_from_basic_ios(base);
-
-    TRACE("(%p)\n", this);
-    basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base2));
-    basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base1));
+    return basic_istream_char__Read_s(this, str, count, count);
 }
 
-/* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_iostream_char_vbase_dtor, 4)
-void __thiscall basic_iostream_char_vbase_dtor(basic_iostream_char *this)
+/* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADIH@Z */
+/* ?_Readsome_s@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_K_J@Z */
+static streamsize basic_istream_char__Readsome_s(basic_istream_char *this, char *str, MSVCP_size_t size, streamsize count)
 {
-    TRACE("(%p)\n", this);
-    basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base1));
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-DEFINE_THISCALL_WRAPPER(basic_iostream_char_vector_dtor, 8)
-basic_iostream_char* __thiscall basic_iostream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
-{
-    basic_iostream_char *this = basic_iostream_char_from_basic_ios(base);
+    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
 
-    TRACE("(%p %x)\n", this, flags);
+    this->count = 0;
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        streamsize avail = basic_streambuf_char_in_avail(basic_ios_char_rdbuf_get(base));
+        if(avail > count)
+            avail = count;
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_iostream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_iostream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        if(avail == -1)
+            state |= IOSTATE_eofbit;
+        else if(avail > 0)
+            basic_istream_char__Read_s(this, str, size, avail);
+    }else {
+        state |= IOSTATE_failbit;
     }
+    basic_istream_char_sentry_destroy(this);
 
-    return this;
+    basic_ios_char_setstate(base, state);
+    return this->count;
 }
 
-static inline basic_ios_wchar* basic_iostream_wchar_to_basic_ios(basic_iostream_wchar *ptr)
+/* ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHPADH@Z */
+/* ?readsome@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA_JPEAD_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_readsome, 16)
+streamsize __thiscall basic_istream_char_readsome(basic_istream_char *this, char *str, streamsize count)
 {
-    return (basic_ios_wchar*)((char*)ptr+basic_iostream_wchar_vbtable1[1]);
+    return basic_istream_char__Readsome_s(this, str, count, count);
 }
 
-static inline basic_iostream_wchar* basic_iostream_wchar_from_basic_ios(basic_ios_wchar *ptr)
-{
-    return (basic_iostream_wchar*)((char*)ptr-basic_iostream_wchar_vbtable1[1]);
+/* ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@D@Z */
+/* ?putback@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@D@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_putback, 8)
+basic_istream_char* __thiscall basic_istream_char_putback(basic_istream_char *this, char ch)
+{
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
+
+    TRACE("(%p %c)\n", this, ch);
+
+    this->count = 0;
+
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+
+        if(!ios_base_good(&base->base))
+            state |= IOSTATE_failbit;
+        else if(!strbuf || basic_streambuf_char_sputbackc(strbuf, ch)==EOF)
+            state |= IOSTATE_badbit;
+    }
+    basic_istream_char_sentry_destroy(this);
+
+    basic_ios_char_setstate(base, state);
+    return this;
 }
 
-/* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-/* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_ctor, 12)
-basic_iostream_wchar* __thiscall basic_iostream_wchar_ctor(basic_iostream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool virt_init)
+/* ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ */
+/* ?unget@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@XZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_unget, 4)
+basic_istream_char* __thiscall basic_istream_char_unget(basic_istream_char *this)
 {
-    basic_ios_wchar *basic_ios;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-    TRACE("(%p %p %d)\n", this, strbuf, virt_init);
+    TRACE("(%p)\n", this);
 
-    if(virt_init) {
-        this->base1.vbtable = basic_iostream_wchar_vbtable1;
-        this->base2.vbtable = basic_iostream_wchar_vbtable2;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
-    }
+    this->count = 0;
 
-    basic_istream_wchar_ctor(&this->base1, strbuf, FALSE, FALSE);
-    basic_ostream_wchar_ctor_uninitialized(&this->base2, 0, FALSE, FALSE);
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
 
-    basic_ios->base.vtable = &MSVCP_basic_iostream_wchar_vtable;
-    return this;
-}
+        if(!ios_base_good(&base->base))
+            state |= IOSTATE_failbit;
+        else if(!strbuf || basic_streambuf_char_sungetc(strbuf)==EOF)
+            state |= IOSTATE_badbit;
+    }
+    basic_istream_char_sentry_destroy(this);
 
-/* ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-/* ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
-DEFINE_THISCALL_WRAPPER(basic_iostream_short_ctor, 12)
-basic_iostream_wchar* __thiscall basic_iostream_short_ctor(basic_iostream_wchar *this,
-        basic_streambuf_wchar *strbuf, MSVCP_bool virt_init)
-{
-    basic_iostream_wchar_ctor(this, strbuf, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base1)->base.vtable = &MSVCP_basic_iostream_short_vtable;
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_dtor, 4)
-void __thiscall basic_iostream_wchar_dtor(basic_ios_wchar *base)
+/* ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEHXZ */
+/* ?sync@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAHXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_sync, 4)
+int __thiscall basic_istream_char_sync(basic_istream_char *this)
 {
-    basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
 
     TRACE("(%p)\n", this);
-    basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base2));
-    basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base1));
+
+    if(!strbuf)
+        return -1;
+
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        if(basic_streambuf_char_pubsync(strbuf) != -1) {
+            basic_istream_char_sentry_destroy(this);
+            return 0;
+        }
+    }
+    basic_istream_char_sentry_destroy(this);
+
+    basic_ios_char_setstate(base, IOSTATE_badbit);
+    return -1;
 }
 
-/* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vbase_dtor, 4)
-void __thiscall basic_iostream_wchar_vbase_dtor(basic_iostream_wchar *this)
+/* ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAE?AV?$fpos@H@2@XZ */
+/* ?tellg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_tellg, 8)
+fpos_int* __thiscall basic_istream_char_tellg(basic_istream_char *this, fpos_int *ret)
 {
-    TRACE("(%p)\n", this);
-    basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base1));
+    TRACE("(%p %p)\n", this, ret);
+
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+        if(!ios_base_fail(&base->base)) {
+            basic_streambuf_char_pubseekoff(basic_ios_char_rdbuf_get(base),
+                    ret, 0, SEEKDIR_cur, OPENMODE_in);
+            basic_istream_char_sentry_destroy(this);
+
+            if(ret->off==0 && ret->pos==-1 && ret->state==0)
+                basic_ios_char_setstate(base, IOSTATE_failbit);
+            return ret;
+        }
+    }
+    basic_istream_char_sentry_destroy(this);
+
+    ret->off = 0;
+    ret->pos = -1;
+    ret->state = 0;
+    return ret;
 }
 
-DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vector_dtor, 8)
-basic_iostream_wchar* __thiscall basic_iostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@JH@Z */
+/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@_JH@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_seekg, 16)
+basic_istream_char* __thiscall basic_istream_char_seekg(basic_istream_char *this, streamoff off, int dir)
 {
-    basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
 
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), dir);
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        if(!ios_base_fail(&base->base)) {
+            basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+            fpos_int ret;
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_iostream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_iostream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+            basic_streambuf_char_pubseekoff(strbuf, &ret, off, dir, OPENMODE_in);
+            basic_istream_char_sentry_destroy(this);
+
+            if(ret.off==0 && ret.pos==-1 && ret.state==0)
+                basic_ios_char_setstate(base, IOSTATE_failbit);
+            else
+                basic_ios_char_clear(base, IOSTATE_goodbit);
+            return this;
+        }
     }
+    basic_istream_char_sentry_destroy(this);
 
+    basic_ios_char_setstate(base, IOSTATE_failbit);
     return this;
 }
 
-static inline basic_ios_char* basic_ofstream_char_to_basic_ios(basic_ofstream_char *ptr)
+/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
+/* ?seekg@?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_seekg_fpos, 28)
+basic_istream_char* __thiscall basic_istream_char_seekg_fpos(basic_istream_char *this, fpos_int pos)
 {
-    return (basic_ios_char*)((char*)ptr+basic_ofstream_char_vbtable[1]);
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
 
-static inline basic_ofstream_char* basic_ofstream_char_from_basic_ios(basic_ios_char *ptr)
-{
-    return (basic_ofstream_char*)((char*)ptr-basic_ofstream_char_vbtable[1]);
-}
+    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
 
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@XZ */
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor, 8)
-basic_ofstream_char* __thiscall basic_ofstream_char_ctor(basic_ofstream_char *this, MSVCP_bool virt_init)
-{
-    basic_ios_char *basic_ios;
+    if(basic_istream_char_sentry_create(this, TRUE)) {
+        if(!ios_base_fail(&base->base)) {
+            basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+            fpos_int ret;
 
-    TRACE("(%p %d)\n", this, virt_init);
+            basic_streambuf_char_pubseekpos(strbuf, &ret, pos, OPENMODE_in);
+            basic_istream_char_sentry_destroy(this);
 
-    if(virt_init) {
-        this->base.vbtable = basic_ofstream_char_vbtable;
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
+            if(ret.off==0 && ret.pos==-1 && ret.state==0)
+                basic_ios_char_setstate(base, IOSTATE_failbit);
+            else
+                basic_ios_char_clear(base, IOSTATE_goodbit);
+            return this;
+        }
     }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_filebuf_char_ctor(&this->filebuf);
-    basic_ostream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ofstream_char_vtable;
+    basic_ios_char_setstate(base, IOSTATE_failbit);
     return this;
 }
 
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor_file, 12)
-basic_ofstream_char* __thiscall basic_ofstream_char_ctor_file(
-        basic_ofstream_char *this, FILE *file, MSVCP_bool virt_init)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAF@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAF@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_short, 8)
+basic_istream_char* __thiscall basic_istream_char_read_short(basic_istream_char *this, short *v)
 {
-    basic_ios_char *basic_ios;
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %p %d)\n", this, file, virt_init);
+    TRACE("(%p %p)\n", this, v);
 
-    if(virt_init) {
-        this->base.vbtable = basic_ofstream_char_vbtable;
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
+        LONG tmp;
+
+        first.strbuf = strbuf;
+        num_get_char_get_long(numget, &last, first, last, &base->base, &state, &tmp);
+
+        if(!(state&IOSTATE_failbit) && tmp==(LONG)((short)tmp))
+            *v = tmp;
+        else
+            state |= IOSTATE_failbit;
     }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_filebuf_char_ctor_file(&this->filebuf, file);
-    basic_ostream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ofstream_char_vtable;
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor_name, 20)
-basic_ofstream_char* __thiscall basic_ofstream_char_ctor_name(basic_ofstream_char *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAG@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAG@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ushort, 8)
+basic_istream_char* __thiscall basic_istream_char_read_ushort(basic_istream_char *this, unsigned short *v)
 {
-    TRACE("(%p %s %d %d %d)\n", this, name, mode, prot, virt_init);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
+
+    TRACE("(%p %p)\n", this, v);
 
-    basic_ofstream_char_ctor(this, virt_init);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+        first.strbuf = strbuf;
+        num_get_char_get_ushort(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_char_sentry_destroy(this);
+
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_ctor_name_wchar, 20)
-basic_ofstream_char* __thiscall basic_ofstream_char_ctor_name_wchar(basic_ofstream_char *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAH@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAH@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_int, 8)
+basic_istream_char* __thiscall basic_istream_char_read_int(basic_istream_char *this, int *v)
 {
-    TRACE("(%p %s %d %d %d)\n", this, debugstr_w(name), mode, prot, virt_init);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
+
+    TRACE("(%p %p)\n", this, v);
 
-    basic_ofstream_char_ctor(this, virt_init);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(!basic_filebuf_char_open_wchar(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+        first.strbuf = strbuf;
+        num_get_char_get_long(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_char_sentry_destroy(this);
+
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_ofstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_dtor, 4)
-void __thiscall basic_ofstream_char_dtor(basic_ios_char *base)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAI@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAI@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_uint, 8)
+basic_istream_char* __thiscall basic_istream_char_read_uint(basic_istream_char *this, unsigned int *v)
 {
-    basic_ofstream_char *this = basic_ofstream_char_from_basic_ios(base);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %p)\n", this, v);
 
-    basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base));
-    basic_filebuf_char_dtor(&this->filebuf);
-}
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-/* ??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_vbase_dtor, 4)
-void __thiscall basic_ofstream_char_vbase_dtor(basic_ofstream_char *this)
-{
-    TRACE("(%p)\n", this);
+        first.strbuf = strbuf;
+        num_get_char_get_uint(numget, &last, first, last, &base->base, &state, v);
+    }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ofstream_char_dtor(basic_ofstream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base));
+    basic_ios_char_setstate(base, state);
+    return this;
 }
 
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_vector_dtor, 8)
-basic_ofstream_char* __thiscall basic_ofstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAJ@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAJ@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_long, 8)
+basic_istream_char* __thiscall basic_istream_char_read_long(basic_istream_char *this, LONG *v)
 {
-    basic_ofstream_char *this = basic_ofstream_char_from_basic_ios(base);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %p)\n", this, v);
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_ofstream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ofstream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        first.strbuf = strbuf;
+        num_get_char_get_long(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_char_sentry_destroy(this);
 
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ?close@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ?close@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_close, 4)
-void __thiscall basic_ofstream_char_close(basic_ofstream_char *this)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAK@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAK@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ulong, 8)
+basic_istream_char* __thiscall basic_istream_char_read_ulong(basic_istream_char *this, ULONG *v)
 {
-    TRACE("(%p)\n", this);
-
-    if(!basic_filebuf_char_close(&this->filebuf)) {
-        basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ?is_open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_is_open, 4)
-MSVCP_bool __thiscall basic_ofstream_char_is_open(const basic_ofstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return basic_filebuf_char_is_open(&this->filebuf);
-}
+    TRACE("(%p %p)\n", this, v);
 
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_open, 16)
-void __thiscall basic_ofstream_char_open(basic_ofstream_char *this,
-        const char *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+        first.strbuf = strbuf;
+        num_get_char_get_ulong(numget, &last, first, last, &base->base, &state, v);
     }
-}
+    basic_istream_char_sentry_destroy(this);
 
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_open_old, 12)
-void __thiscall basic_ofstream_char_open_old(basic_ofstream_char *this,
-        const char *name, unsigned int mode)
-{
-    basic_ofstream_char_open(this, name, mode, _SH_DENYNO);
+    basic_ios_char_setstate(base, state);
+    return this;
 }
 
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_open_wchar, 16)
-void __thiscall basic_ofstream_char_open_wchar(basic_ofstream_char *this,
-        const wchar_t *name, int mode, int prot)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAM@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAM@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_float, 8)
+basic_istream_char* __thiscall basic_istream_char_read_float(basic_istream_char *this, float *v)
 {
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    if(!basic_filebuf_char_open_wchar(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_char *basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
+    TRACE("(%p %p)\n", this, v);
 
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEAAXPEB_WI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_open_wchar_old, 12)
-void __thiscall basic_ofstream_char_open_wchar_old(basic_ofstream_char *this,
-        const wchar_t *name, unsigned int mode)
-{
-    basic_ofstream_char_open_wchar(this, name, mode, _SH_DENYNO);
-}
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-/* ?rdbuf@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
-/* ?rdbuf@?$basic_ofstream@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_char_rdbuf, 4)
-basic_filebuf_char* __thiscall basic_ofstream_char_rdbuf(const basic_ofstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_filebuf_char*)&this->filebuf;
-}
+        first.strbuf = strbuf;
+        num_get_char_get_float(numget, &last, first, last, &base->base, &state, v);
+    }
+    basic_istream_char_sentry_destroy(this);
 
-static inline basic_ios_wchar* basic_ofstream_wchar_to_basic_ios(basic_ofstream_wchar *ptr)
-{
-    return (basic_ios_wchar*)((char*)ptr+basic_ofstream_wchar_vbtable[1]);
+    basic_ios_char_setstate(base, state);
+    return this;
 }
 
-static inline basic_ofstream_wchar* basic_ofstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAN@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAN@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_double, 8)
+basic_istream_char* __thiscall basic_istream_char_read_double(basic_istream_char *this, double *v)
 {
-    return (basic_ofstream_wchar*)((char*)ptr-basic_ofstream_wchar_vbtable[1]);
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@XZ */
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_ctor, 8)
-basic_ofstream_wchar* __thiscall basic_ofstream_wchar_ctor(basic_ofstream_wchar *this, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %d)\n", this, virt_init);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(virt_init) {
-        this->base.vbtable = basic_ofstream_wchar_vbtable;
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
+        first.strbuf = strbuf;
+        num_get_char_get_double(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_filebuf_wchar_ctor(&this->filebuf);
-    basic_ostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ofstream_wchar_vtable;
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@XZ */
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_short_ctor, 8)
-basic_ofstream_wchar* __thiscall basic_ofstream_short_ctor(basic_ofstream_wchar *this, MSVCP_bool virt_init)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAO@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAO@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ldouble, 8)
+basic_istream_char* __thiscall basic_istream_char_read_ldouble(basic_istream_char *this, double *v)
 {
-    basic_ofstream_wchar_ctor(this, virt_init);
-    basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ofstream_short_vtable;
-    return this;
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_ctor_file, 12)
-basic_ofstream_wchar* __thiscall basic_ofstream_wchar_ctor_file(
-        basic_ofstream_wchar *this, FILE *file, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %p %d)\n", this, file, virt_init);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(virt_init) {
-        this->base.vbtable = basic_ofstream_wchar_vbtable;
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
+        first.strbuf = strbuf;
+        num_get_char_get_ldouble(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_filebuf_wchar_ctor_file(&this->filebuf, file);
-    basic_ostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ofstream_wchar_vtable;
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_short_ctor_file, 12)
-basic_ofstream_wchar* __thiscall basic_ofstream_short_ctor_file(
-        basic_ofstream_wchar *this, FILE *file, MSVCP_bool virt_init)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AAPAX@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_ptr, 8)
+basic_istream_char* __thiscall basic_istream_char_read_ptr(basic_istream_char *this, void **v)
 {
-    basic_ofstream_wchar_ctor_file(this, file, virt_init);
-    basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ofstream_short_vtable;
-    return this;
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_ctor_name, 20)
-basic_ofstream_wchar* __thiscall basic_ofstream_wchar_ctor_name(basic_ofstream_wchar *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    TRACE("(%p %s %d %d %d)\n", this, name, mode, prot, virt_init);
+    TRACE("(%p %p)\n", this, v);
 
-    basic_ofstream_wchar_ctor(this, virt_init);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+        first.strbuf = strbuf;
+        num_get_char_get_void(numget, &last, first, last, &base->base, &state, v);
     }
-    return this;
-}
+    basic_istream_char_sentry_destroy(this);
 
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_short_ctor_name, 20)
-basic_ofstream_wchar* __thiscall basic_ofstream_short_ctor_name(basic_ofstream_wchar *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    basic_ofstream_wchar_ctor_name(this, name, mode, prot, virt_init);
-    basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ofstream_short_vtable;
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_ctor_name_wchar, 20)
-basic_ofstream_wchar* __thiscall basic_ofstream_wchar_ctor_name_wchar(basic_ofstream_wchar *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_J@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_int64, 8)
+basic_istream_char* __thiscall basic_istream_char_read_int64(basic_istream_char *this, __int64 *v)
 {
-    TRACE("(%p %s %d %d %d)\n", this, debugstr_w(name), mode, prot, virt_init);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
+
+    TRACE("(%p %p)\n", this, v);
 
-    basic_ofstream_wchar_ctor(this, virt_init);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-    if(!basic_filebuf_wchar_open_wchar(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+        first.strbuf = strbuf;
+        num_get_char_get_int64(numget, &last, first, last, &base->base, &state, v);
     }
-    return this;
-}
+    basic_istream_char_sentry_destroy(this);
 
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_short_ctor_name_wchar, 20)
-basic_ofstream_wchar* __thiscall basic_ofstream_short_ctor_name_wchar(basic_ofstream_wchar *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    basic_ofstream_wchar_ctor_name_wchar(this, name, mode, prot, virt_init);
-    basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ofstream_short_vtable;
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ??1?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_ofstream@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_ofstream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_dtor, 4)
-void __thiscall basic_ofstream_wchar_dtor(basic_ios_wchar *base)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_K@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_K@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_uint64, 8)
+basic_istream_char* __thiscall basic_istream_char_read_uint64(basic_istream_char *this, unsigned __int64 *v)
 {
-    basic_ofstream_wchar *this = basic_ofstream_wchar_from_basic_ios(base);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %p)\n", this, v);
 
-    basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base));
-    basic_filebuf_wchar_dtor(&this->filebuf);
-}
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-/* ??_D?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ??_D?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_vbase_dtor, 4)
-void __thiscall basic_ofstream_wchar_vbase_dtor(basic_ofstream_wchar *this)
-{
-    TRACE("(%p)\n", this);
+        first.strbuf = strbuf;
+        num_get_char_get_uint64(numget, &last, first, last, &base->base, &state, v);
+    }
+    basic_istream_char_sentry_destroy(this);
 
-    basic_ofstream_wchar_dtor(basic_ofstream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(&this->base));
+    basic_ios_char_setstate(base, state);
+    return this;
 }
 
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_vector_dtor, 8)
-basic_ofstream_wchar* __thiscall basic_ofstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@AA_N@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@AEA_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_bool, 8)
+basic_istream_char* __thiscall basic_istream_char_read_bool(basic_istream_char *this, MSVCP_bool *v)
 {
-    basic_ofstream_wchar *this = basic_ofstream_wchar_from_basic_ios(base);
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %p)\n", this, v);
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        basic_streambuf_char *strbuf = basic_ios_char_rdbuf_get(base);
+        const num_get *numget = num_get_char_use_facet(strbuf->loc);
+        istreambuf_iterator_char first={0}, last={0};
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_ofstream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ofstream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        first.strbuf = strbuf;
+        num_get_char_get_bool(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_char_sentry_destroy(this);
 
+    basic_ios_char_setstate(base, state);
     return this;
 }
 
-/* ?close@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ?close@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ?close@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ?close@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_close, 4)
-void __thiscall basic_ofstream_wchar_close(basic_ofstream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-
-    if(!basic_filebuf_wchar_close(&this->filebuf)) {
-        basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
-
-/* ?is_open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
-/* ?is_open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_is_open, 4)
-MSVCP_bool __thiscall basic_ofstream_wchar_is_open(const basic_ofstream_wchar *this)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_streambuf, 8)
+basic_istream_char* __thiscall basic_istream_char_read_streambuf(
+        basic_istream_char *this, basic_streambuf_char *streambuf)
 {
-    TRACE("(%p)\n", this);
-    return basic_filebuf_wchar_is_open(&this->filebuf);
-}
+    basic_ios_char *base = basic_istream_char_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_failbit;
+    int c = '\n';
 
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBDHH@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_open, 16)
-void __thiscall basic_ofstream_wchar_open(basic_ofstream_wchar *this,
-        const char *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
+    TRACE("(%p %p)\n", this, streambuf);
 
-    if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+    if(basic_istream_char_sentry_create(this, FALSE)) {
+        for(c = basic_streambuf_char_sgetc(basic_ios_char_rdbuf_get(base)); c!=EOF;
+                c = basic_streambuf_char_snextc(basic_ios_char_rdbuf_get(base))) {
+            state = IOSTATE_goodbit;
+            if(basic_streambuf_char_sputc(streambuf, c) == EOF)
+                break;
+        }
     }
+    basic_istream_char_sentry_destroy(this);
+
+    basic_ios_char_setstate(base, state | (c==EOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    return this;
 }
 
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBDI@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_open_old, 12)
-void __thiscall basic_ofstream_wchar_open_old(basic_ofstream_wchar *this,
-        const char *name, unsigned int mode)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func, 8)
+basic_istream_char* __thiscall basic_istream_char_read_func(basic_istream_char *this,
+        basic_istream_char* (__cdecl *pfunc)(basic_istream_char*))
 {
-    basic_ofstream_wchar_open(this, name, mode, _SH_DENYNO);
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(this);
+    return this;
 }
 
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEB_WHH@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_open_wchar, 16)
-void __thiscall basic_ofstream_wchar_open_wchar(basic_ofstream_wchar *this,
-        const wchar_t *name, int mode, int prot)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@DU?$char_traits@D@std@@@1@AAV21@@Z@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@DU?$char_traits@D@std@@@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func_basic_ios, 8)
+basic_istream_char* __thiscall basic_istream_char_read_func_basic_ios(basic_istream_char *this,
+        basic_ios_char* (__cdecl *pfunc)(basic_ios_char*))
 {
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
-
-    if(!basic_filebuf_wchar_open_wchar(&this->filebuf, name, mode|OPENMODE_out, prot)) {
-        basic_ios_wchar *basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(basic_istream_char_get_basic_ios(this));
+    return this;
 }
 
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEB_WI@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEAAXPEB_WI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_open_wchar_old, 12)
-void __thiscall basic_ofstream_wchar_open_wchar_old(basic_ofstream_wchar *this,
-        const wchar_t *name, unsigned int mode)
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
+/* ??5?$basic_istream@DU?$char_traits@D@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_char_read_func_ios_base, 8)
+basic_istream_char* __thiscall basic_istream_char_read_func_ios_base(basic_istream_char *this,
+        ios_base* (__cdecl *pfunc)(ios_base*))
 {
-    basic_ofstream_wchar_open_wchar(this, name, mode, _SH_DENYNO);
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(&basic_istream_char_get_basic_ios(this)->base);
+    return this;
 }
 
-/* ?rdbuf@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_ofstream@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
-/* ?rdbuf@?$basic_ofstream@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ofstream_wchar_rdbuf, 4)
-basic_filebuf_wchar* __thiscall basic_ofstream_wchar_rdbuf(const basic_ofstream_wchar *this)
+/* Caution: basic_istream uses virtual inheritance. */
+static inline basic_ios_wchar* basic_istream_wchar_get_basic_ios(basic_istream_wchar *this)
 {
-    TRACE("(%p)\n", this);
-    return (basic_filebuf_wchar*)&this->filebuf;
+    return (basic_ios_wchar*)((char*)this+this->vbtable[1]);
 }
 
-static inline basic_ios_char* basic_ifstream_char_to_basic_ios(basic_ifstream_char *ptr)
+static inline basic_ios_wchar* basic_istream_wchar_to_basic_ios(basic_istream_wchar *ptr)
 {
-    return (basic_ios_char*)((char*)ptr+basic_ifstream_char_vbtable[1]);
+    return (basic_ios_wchar*)((char*)ptr+basic_istream_wchar_vbtable[1]);
 }
 
-static inline basic_ifstream_char* basic_ifstream_char_from_basic_ios(basic_ios_char *ptr)
+static inline basic_istream_wchar* basic_istream_wchar_from_basic_ios(basic_ios_wchar *ptr)
 {
-    return (basic_ifstream_char*)((char*)ptr-basic_ifstream_char_vbtable[1]);
+    return (basic_istream_wchar*)((char*)ptr-basic_istream_wchar_vbtable[1]);
 }
 
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@XZ */
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor, 8)
-basic_ifstream_char* __thiscall basic_ifstream_char_ctor(basic_ifstream_char *this, MSVCP_bool virt_init)
+/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */
+/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N1@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor_init, 20)
+basic_istream_wchar* __thiscall basic_istream_wchar_ctor_init(basic_istream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
 {
-    basic_ios_char *basic_ios;
+    basic_ios_wchar *base;
 
-    TRACE("(%p %d)\n", this, virt_init);
+    TRACE("(%p %p %d %d %d)\n", this, strbuf, isstd, noinit, virt_init);
 
     if(virt_init) {
-        this->base.vbtable = basic_ifstream_char_vbtable;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
+        this->vbtable = basic_istream_wchar_vbtable;
+        base = basic_istream_wchar_get_basic_ios(this);
+        basic_ios_wchar_ctor(base);
     }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
+        base = basic_istream_wchar_get_basic_ios(this);
     }
 
-    basic_filebuf_char_ctor(&this->filebuf);
-    basic_istream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ifstream_char_vtable;
+    base->base.vtable = &MSVCP_basic_istream_wchar_vtable;
+    this->count = 0;
+    if(!noinit)
+        basic_ios_wchar_init(base, strbuf, isstd);
     return this;
 }
 
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor_file, 12)
-basic_ifstream_char* __thiscall basic_ifstream_char_ctor_file(
-        basic_ifstream_char *this, FILE *file, MSVCP_bool virt_init)
+/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z */
+/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N1@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor_init, 20)
+basic_istream_wchar* __thiscall basic_istream_short_ctor_init(basic_istream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool noinit, MSVCP_bool virt_init)
 {
-    basic_ios_char *basic_ios;
-
-    TRACE("(%p %p %d)\n", this, file, virt_init);
+    basic_istream_wchar_ctor_init(this, strbuf, isstd, noinit, virt_init);
+    basic_istream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_istream_short_vtable;
+    return this;
+}
 
-    if(virt_init) {
-        this->base.vbtable = basic_ifstream_char_vbtable;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
-    }
+/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
+/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor, 16)
+basic_istream_wchar* __thiscall basic_istream_wchar_ctor(basic_istream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
+{
+    return basic_istream_wchar_ctor_init(this, strbuf, isstd, FALSE, virt_init);
+}
 
-    basic_filebuf_char_ctor_file(&this->filebuf, file);
-    basic_istream_char_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ifstream_char_vtable;
-    return this;
+/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
+/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor, 16)
+basic_istream_wchar* __thiscall basic_istream_short_ctor(basic_istream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool isstd, MSVCP_bool virt_init)
+{
+    return basic_istream_short_ctor_init(this, strbuf, isstd, FALSE, virt_init);
 }
 
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor_name, 20)
-basic_ifstream_char* __thiscall basic_ifstream_char_ctor_name(basic_ifstream_char *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
+/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE@W4_Uninitialized@1@@Z */
+/* ??0?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ctor_uninitialized, 12)
+basic_istream_wchar* __thiscall basic_istream_wchar_ctor_uninitialized(
+        basic_istream_wchar *this, int uninitialized, MSVCP_bool virt_init)
 {
-    TRACE("(%p %s %d %d %d)\n", this, name, mode, prot, virt_init);
+    basic_ios_wchar *base;
 
-    basic_ifstream_char_ctor(this, virt_init);
+    TRACE("(%p %d %d)\n", this, uninitialized, virt_init);
 
-    if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+    if(virt_init) {
+        this->vbtable = basic_istream_wchar_vbtable;
+        base = basic_istream_wchar_get_basic_ios(this);
+        basic_ios_wchar_ctor(base);
+    }else {
+        base = basic_istream_wchar_get_basic_ios(this);
     }
+
+    base->base.vtable = &MSVCP_basic_istream_wchar_vtable;
+    ios_base_Addstd(&base->base);
     return this;
 }
 
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_ctor_name_wchar, 20)
-basic_ifstream_char* __thiscall basic_ifstream_char_ctor_name_wchar(basic_ifstream_char *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
+/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QAE@W4_Uninitialized@1@@Z */
+/* ??0?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA@W4_Uninitialized@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_ctor_uninitialized, 12)
+basic_istream_wchar* __thiscall basic_istream_short_ctor_uninitialized(
+        basic_istream_wchar *this, int uninitialized, MSVCP_bool virt_init)
 {
-    TRACE("(%p %s %d %d %d)\n", this, debugstr_w(name), mode, prot, virt_init);
-
-    basic_ifstream_char_ctor(this, virt_init);
-
-    if(!basic_filebuf_char_open_wchar(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
+    basic_istream_wchar_ctor_uninitialized(this, uninitialized, virt_init);
+    basic_istream_wchar_get_basic_ios(this)->base.vtable = &MSVCP_basic_istream_short_vtable;
     return this;
 }
 
-/* ??1?$basic_ifstream@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_ifstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_dtor, 4)
-void __thiscall basic_ifstream_char_dtor(basic_ios_char *base)
+/* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
+/* ??1?$basic_istream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
+/* ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UAE@XZ */
+/* ??1?$basic_istream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_dtor, 4)
+void __thiscall basic_istream_wchar_dtor(basic_ios_wchar *base)
 {
-    basic_ifstream_char *this = basic_ifstream_char_from_basic_ios(base);
+    basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base);
 
+    /* don't destroy virtual base here */
     TRACE("(%p)\n", this);
-
-    basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base));
-    basic_filebuf_char_dtor(&this->filebuf);
 }
 
-/* ??_D?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_vbase_dtor, 4)
-void __thiscall basic_ifstream_char_vbase_dtor(basic_ifstream_char *this)
+/* ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
+/* ??_D?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
+/* ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ */
+/* ??_D?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vbase_dtor, 4)
+void __thiscall basic_istream_wchar_vbase_dtor(basic_istream_wchar *this)
 {
     TRACE("(%p)\n", this);
-
-    basic_ifstream_char_dtor(basic_ifstream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base));
+    basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(this));
+    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(this));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_vector_dtor, 8)
-basic_ifstream_char* __thiscall basic_ifstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_vector_dtor, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
 {
-    basic_ifstream_char *this = basic_ifstream_char_from_basic_ios(base);
+    basic_istream_wchar *this = basic_istream_wchar_from_basic_ios(base);
 
     TRACE("(%p %x)\n", this, flags);
 
@@ -10025,10 +6565,10 @@ basic_ifstream_char* __thiscall basic_ifstream_char_vector_dtor(basic_ios_char *
         INT_PTR i, *ptr = (INT_PTR *)this-1;
 
         for(i=*ptr-1; i>=0; i--)
-            basic_ifstream_char_vbase_dtor(this+i);
+            basic_istream_wchar_vbase_dtor(this+i);
         MSVCRT_operator_delete(ptr);
     } else {
-        basic_ifstream_char_vbase_dtor(this);
+        basic_istream_wchar_vbase_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -10036,1812 +6576,1238 @@ basic_ifstream_char* __thiscall basic_ifstream_char_vector_dtor(basic_ios_char *
     return this;
 }
 
-/* ?close@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ?close@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_close, 4)
-void __thiscall basic_ifstream_char_close(basic_ifstream_char *this)
-{
-    TRACE("(%p)\n", this);
-
-    if(!basic_filebuf_char_close(&this->filebuf)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
-
-/* ?is_open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_is_open, 4)
-MSVCP_bool __thiscall basic_ifstream_char_is_open(const basic_ifstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return basic_filebuf_char_is_open(&this->filebuf);
-}
-
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_open, 16)
-void __thiscall basic_ifstream_char_open(basic_ifstream_char *this,
-        const char *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
-
-    if(!basic_filebuf_char_open(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
-
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_open_old, 12)
-void __thiscall basic_ifstream_char_open_old(basic_ifstream_char *this,
-        const char *name, unsigned int mode)
-{
-    basic_ifstream_char_open(this, name, mode, _SH_DENYNO);
-}
-
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_open_wchar, 16)
-void __thiscall basic_ifstream_char_open_wchar(basic_ifstream_char *this,
-        const wchar_t *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
-
-    if(!basic_filebuf_char_open_wchar(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
-
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEAAXPEB_WI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_open_wchar_old, 12)
-void __thiscall basic_ifstream_char_open_wchar_old(basic_ifstream_char *this,
-        const wchar_t *name, unsigned int mode)
-{
-    basic_ifstream_char_open_wchar(this, name, mode, _SH_DENYNO);
-}
-
-/* ?rdbuf@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
-/* ?rdbuf@?$basic_ifstream@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_char_rdbuf, 4)
-basic_filebuf_char* __thiscall basic_ifstream_char_rdbuf(const basic_ifstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_filebuf_char*)&this->filebuf;
-}
-
-static inline basic_ios_wchar* basic_ifstream_wchar_to_basic_ios(basic_ifstream_wchar *ptr)
-{
-    return (basic_ios_wchar*)((char*)ptr+basic_ifstream_wchar_vbtable[1]);
-}
-
-static inline basic_ifstream_wchar* basic_ifstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
-{
-    return (basic_ifstream_wchar*)((char*)ptr-basic_ifstream_wchar_vbtable[1]);
-}
-
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@XZ */
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_ctor, 8)
-basic_ifstream_wchar* __thiscall basic_ifstream_wchar_ctor(basic_ifstream_wchar *this, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *basic_ios;
-
-    TRACE("(%p %d)\n", this, virt_init);
-
-    if(virt_init) {
-        this->base.vbtable = basic_ifstream_wchar_vbtable;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-    }
-
-    basic_filebuf_wchar_ctor(&this->filebuf);
-    basic_istream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ifstream_wchar_vtable;
-    return this;
-}
-
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@XZ */
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_short_ctor, 8)
-basic_ifstream_wchar* __thiscall basic_ifstream_short_ctor(basic_ifstream_wchar *this, MSVCP_bool virt_init)
-{
-    basic_ifstream_wchar_ctor(this, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ifstream_short_vtable;
-    return this;
-}
-
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_ctor_file, 12)
-basic_ifstream_wchar* __thiscall basic_ifstream_wchar_ctor_file(
-        basic_ifstream_wchar *this, FILE *file, MSVCP_bool virt_init)
+/* ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z */
+/* ?_Ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z */
+/* ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z */
+/* ?_Ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar__Ipfx, 8)
+MSVCP_bool __thiscall basic_istream_wchar__Ipfx(basic_istream_wchar *this, MSVCP_bool noskip)
 {
-    basic_ios_wchar *basic_ios;
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
 
-    TRACE("(%p %p %d)\n", this, file, virt_init);
+    TRACE("(%p %d)\n", this, noskip);
 
-    if(virt_init) {
-        this->base.vbtable = basic_ifstream_wchar_vbtable;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
+    if(!ios_base_good(&base->base)) {
+        basic_ios_wchar_setstate(base, IOSTATE_failbit);
+        return FALSE;
     }
 
-    basic_filebuf_wchar_ctor_file(&this->filebuf, file);
-    basic_istream_wchar_ctor(&this->base, &this->filebuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ifstream_wchar_vtable;
-    return this;
-}
-
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_short_ctor_file, 12)
-basic_ifstream_wchar* __thiscall basic_ifstream_short_ctor_file(
-        basic_ifstream_wchar *this, FILE *file, MSVCP_bool virt_init)
-{
-    basic_ifstream_wchar_ctor_file(this, file, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ifstream_short_vtable;
-    return this;
-}
+    if(basic_ios_wchar_tie_get(base))
+        basic_ostream_wchar_flush(basic_ios_wchar_tie_get(base));
 
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_ctor_name, 20)
-basic_ifstream_wchar* __thiscall basic_ifstream_wchar_ctor_name(basic_ifstream_wchar *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    TRACE("(%p %s %d %d %d)\n", this, name, mode, prot, virt_init);
+    if(!noskip && (ios_base_flags_get(&base->base) & FMTFLAG_skipws)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        const ctype_wchar *ctype = ctype_wchar_use_facet(base->strbuf->loc);
+        int ch;
 
-    basic_ifstream_wchar_ctor(this, virt_init);
+        for(ch = basic_streambuf_wchar_sgetc(strbuf); ;
+                ch = basic_streambuf_wchar_snextc(strbuf)) {
+            if(ch == WEOF) {
+                basic_ios_wchar_setstate(base, IOSTATE_eofbit);
+                return FALSE;
+            }
 
-    if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+            if(!ctype_wchar_is_ch(ctype, _SPACE|_BLANK, ch))
+                break;
+        }
     }
-    return this;
-}
 
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_short_ctor_name, 20)
-basic_ifstream_wchar* __thiscall basic_ifstream_short_ctor_name(basic_ifstream_wchar *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    basic_ifstream_wchar_ctor_name(this, name, mode, prot, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ifstream_short_vtable;
-    return this;
-}
-
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_ctor_name_wchar, 20)
-basic_ifstream_wchar* __thiscall basic_ifstream_wchar_ctor_name_wchar(basic_ifstream_wchar *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    TRACE("(%p %s %d %d %d)\n", this, debugstr_w(name), mode, prot, virt_init);
-
-    basic_ifstream_wchar_ctor(this, virt_init);
-
-    if(!basic_filebuf_wchar_open_wchar(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
-    return this;
+    return TRUE;
 }
 
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_short_ctor_name_wchar, 20)
-basic_ifstream_wchar* __thiscall basic_ifstream_short_ctor_name_wchar(basic_ifstream_wchar *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
+/* ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE_N_N@Z */
+/* ?ipfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_N_N@Z */
+/* ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE_N_N@Z */
+/* ?ipfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_N_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ipfx, 8)
+MSVCP_bool __thiscall basic_istream_wchar_ipfx(basic_istream_wchar *this, MSVCP_bool noskip)
 {
-    basic_ifstream_wchar_ctor_name_wchar(this, name, mode, prot, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ifstream_short_vtable;
-    return this;
+    return basic_istream_wchar__Ipfx(this, noskip);
 }
 
-/* ??1?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_ifstream@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_ifstream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_dtor, 4)
-void __thiscall basic_ifstream_wchar_dtor(basic_ios_wchar *base)
+/* ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
+/* ?isfx@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
+/* ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEXXZ */
+/* ?isfx@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_isfx, 4)
+void __thiscall basic_istream_wchar_isfx(basic_istream_wchar *this)
 {
-    basic_ifstream_wchar *this = basic_ifstream_wchar_from_basic_ios(base);
-
     TRACE("(%p)\n", this);
-
-    basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base));
-    basic_filebuf_wchar_dtor(&this->filebuf);
 }
 
-/* ??_D?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ??_D?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_D?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_vbase_dtor, 4)
-void __thiscall basic_ifstream_wchar_vbase_dtor(basic_ifstream_wchar *this)
+static BOOL basic_istream_wchar_sentry_create(basic_istream_wchar *istr, MSVCP_bool noskip)
 {
-    TRACE("(%p)\n", this);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istr);
+
+    if(basic_ios_wchar_rdbuf_get(base))
+        basic_streambuf_wchar__Lock(base->strbuf);
 
-    basic_ifstream_wchar_dtor(basic_ifstream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base));
+    return basic_istream_wchar_ipfx(istr, noskip);
 }
 
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_vector_dtor, 8)
-basic_ifstream_wchar* __thiscall basic_ifstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+static void basic_istream_wchar_sentry_destroy(basic_istream_wchar *istr)
 {
-    basic_ifstream_wchar *this = basic_ifstream_wchar_from_basic_ios(base);
-
-    TRACE("(%p %x)\n", this, flags);
-
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
-
-        for(i=*ptr-1; i>=0; i--)
-            basic_ifstream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ifstream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istr);
 
-    return this;
+    if(basic_ios_wchar_rdbuf_get(base))
+        basic_streambuf_wchar__Unlock(base->strbuf);
 }
 
-/* ?close@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ?close@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ?close@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ?close@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_close, 4)
-void __thiscall basic_ifstream_wchar_close(basic_ifstream_wchar *this)
+/* ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QBEHXZ */
+/* ?gcount@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEBA_JXZ */
+/* ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QBEHXZ */
+/* ?gcount@?$basic_istream@GU?$char_traits@G@std@@@std@@QEBA_JXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_gcount, 4)
+int __thiscall basic_istream_wchar_gcount(const basic_istream_wchar *this)
 {
     TRACE("(%p)\n", this);
-
-    if(!basic_filebuf_wchar_close(&this->filebuf)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
+    return this->count;
 }
 
-/* ?is_open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
-/* ?is_open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_is_open, 4)
-MSVCP_bool __thiscall basic_ifstream_wchar_is_open(const basic_ifstream_wchar *this)
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get, 4)
+unsigned short __thiscall basic_istream_wchar_get(basic_istream_wchar *this)
 {
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int ret;
+
     TRACE("(%p)\n", this);
-    return basic_filebuf_wchar_is_open(&this->filebuf);
-}
 
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBDHH@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_open, 16)
-void __thiscall basic_ifstream_wchar_open(basic_ifstream_wchar *this,
-        const char *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
+    this->count = 0;
 
-    if(!basic_filebuf_wchar_open(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+    if(!basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_istream_wchar_sentry_destroy(this);
+        return WEOF;
     }
-}
 
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBDI@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_open_old, 12)
-void __thiscall basic_ifstream_wchar_open_old(basic_ifstream_wchar *this,
-        const char *name, unsigned int mode)
-{
-    basic_ifstream_wchar_open(this, name, mode, _SH_DENYNO);
+    ret = basic_streambuf_wchar_sbumpc(basic_ios_wchar_rdbuf_get(base));
+    basic_istream_wchar_sentry_destroy(this);
+    if(ret == WEOF)
+        basic_ios_wchar_setstate(base, IOSTATE_eofbit|IOSTATE_failbit);
+    else
+        this->count++;
+
+    return ret;
 }
 
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEB_WHH@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_open_wchar, 16)
-void __thiscall basic_ifstream_wchar_open_wchar(basic_ifstream_wchar *this,
-        const wchar_t *name, int mode, int prot)
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AA_W@Z */
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEA_W@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAG@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAG@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_ch, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_get_ch(basic_istream_wchar *this, wchar_t *ch)
 {
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
+    unsigned short ret;
 
-    if(!basic_filebuf_wchar_open_wchar(&this->filebuf, name, mode|OPENMODE_in, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
+    TRACE("(%p %p)\n", this, ch);
 
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEB_WI@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEAAXPEB_WI@Z */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_open_wchar_old, 12)
-void __thiscall basic_ifstream_wchar_open_wchar_old(basic_ifstream_wchar *this,
-        const wchar_t *name, unsigned int mode)
-{
-    basic_ifstream_wchar_open_wchar(this, name, mode, _SH_DENYNO);
+    ret = basic_istream_wchar_get(this);
+    if(ret != WEOF)
+        *ch = (wchar_t)ret;
+    return this;
 }
 
-/* ?rdbuf@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_ifstream@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
-/* ?rdbuf@?$basic_ifstream@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ifstream_wchar_rdbuf, 4)
-basic_filebuf_wchar* __thiscall basic_ifstream_wchar_rdbuf(const basic_ifstream_wchar *this)
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH_W@Z */
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGHG@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_str_delim, 20)
+basic_istream_wchar* __thiscall basic_istream_wchar_get_str_delim(basic_istream_wchar *this, wchar_t *str, streamsize count, wchar_t delim)
 {
-    TRACE("(%p)\n", this);
-    return (basic_filebuf_wchar*)&this->filebuf;
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    unsigned short ch = delim;
 
-static inline basic_ios_char* basic_fstream_char_to_basic_ios(basic_fstream_char *ptr)
-{
-    return (basic_ios_char*)((char*)ptr+basic_fstream_char_vbtable1[1]);
-}
+    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
 
-static inline basic_fstream_char* basic_fstream_char_from_basic_ios(basic_ios_char *ptr)
-{
-    return (basic_fstream_char*)((char*)ptr-basic_fstream_char_vbtable1[1]);
-}
+    this->count = 0;
 
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@XZ */
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor, 8)
-basic_fstream_char* __thiscall basic_fstream_char_ctor(basic_fstream_char *this, MSVCP_bool virt_init)
-{
-    basic_ios_char *basic_ios;
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
 
-    TRACE("(%p %d)\n", this, virt_init);
+        for(ch = basic_streambuf_wchar_sgetc(strbuf); count>1;
+                ch = basic_streambuf_wchar_snextc(strbuf)) {
+            if(ch==WEOF || ch==delim)
+                break;
 
-    if(virt_init) {
-        this->base.base1.vbtable = basic_fstream_char_vbtable1;
-        this->base.base2.vbtable = basic_fstream_char_vbtable2;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
+            *str++ = ch;
+            this->count++;
+            count--;
+        }
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_filebuf_char_ctor(&this->filebuf);
-    basic_iostream_char_ctor(&this->base, &this->filebuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_fstream_char_vtable;
+    basic_ios_wchar_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
+            (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
+    if(count > 0)
+        *str = 0;
     return this;
 }
 
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor_file, 12)
-basic_fstream_char* __thiscall basic_fstream_char_ctor_file(basic_fstream_char *this,
-        FILE *file, MSVCP_bool virt_init)
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_str, 16)
+basic_istream_wchar* __thiscall basic_istream_wchar_get_str(basic_istream_wchar *this, wchar_t *str, streamsize count)
 {
-    basic_ios_char *basic_ios;
+    return basic_istream_wchar_get_str_delim(this, str, count, '\n');
+}
 
-    TRACE("(%p %p %d)\n", this, file, virt_init);
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z */
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@_W@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@G@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_streambuf_delim, 12)
+basic_istream_wchar* __thiscall basic_istream_wchar_get_streambuf_delim(basic_istream_wchar *this, basic_streambuf_wchar *strbuf, wchar_t delim)
+{
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    unsigned short ch = delim;
 
-    if(virt_init) {
-        this->base.base1.vbtable = basic_fstream_char_vbtable1;
-        this->base.base2.vbtable = basic_fstream_char_vbtable2;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-    }
+    TRACE("(%p %p %c)\n", this, strbuf, delim);
 
-    basic_filebuf_char_ctor_file(&this->filebuf, file);
-    basic_iostream_char_ctor(&this->base, &this->filebuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_fstream_char_vtable;
-    return this;
-}
+    this->count = 0;
 
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@PBDHH@Z */
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@PEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor_name, 20)
-basic_fstream_char* __thiscall basic_fstream_char_ctor_name(basic_fstream_char *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    TRACE("(%p %s %d %d %d)\n", this, name, mode, prot, virt_init);
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_streambuf_wchar *strbuf_read = basic_ios_wchar_rdbuf_get(base);
 
-    basic_fstream_char_ctor(this, virt_init);
+        for(ch = basic_streambuf_wchar_sgetc(strbuf_read); ;
+                ch = basic_streambuf_wchar_snextc(strbuf_read)) {
+            if(ch==WEOF || ch==delim)
+                break;
 
-    if(!basic_filebuf_char_open(&this->filebuf, name, mode, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+            if(basic_streambuf_wchar_sputc(strbuf, ch) == WEOF)
+                break;
+            this->count++;
+        }
     }
+    basic_istream_wchar_sentry_destroy(this);
+
+    basic_ios_wchar_setstate(base, (!this->count ? IOSTATE_failbit : IOSTATE_goodbit) |
+            (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
     return this;
 }
 
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_ctor_name_wchar, 20)
-basic_fstream_char* __thiscall basic_fstream_char_ctor_name_wchar(basic_fstream_char *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@AAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z */
+/* ?get@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@2@@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@AAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z */
+/* ?get@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@AEAV?$basic_streambuf@GU?$char_traits@G@std@@@2@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_get_streambuf, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_get_streambuf(basic_istream_wchar *this, basic_streambuf_wchar *strbuf)
 {
-    TRACE("(%p %s %d %d %d)\n", this, debugstr_w(name), mode, prot, virt_init);
-
-    basic_fstream_char_ctor(this, virt_init);
-
-    if(!basic_filebuf_char_open_wchar(&this->filebuf, name, mode, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
-    return this;
+    return basic_istream_wchar_get_streambuf_delim(this, strbuf, '\n');
 }
 
-/* ??1?$basic_fstream@DU?$char_traits@D@std@@@std@@UAE@XZ */
-/* ??1?$basic_fstream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_dtor, 4)
-void __thiscall basic_fstream_char_dtor(basic_ios_char *base)
+/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH_W@Z */
+/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J_W@Z */
+/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGHG@Z */
+/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_JG@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_getline_delim, 20)
+basic_istream_wchar* __thiscall basic_istream_wchar_getline_delim(basic_istream_wchar *this, wchar_t *str, streamsize count, wchar_t delim)
 {
-    basic_fstream_char *this = basic_fstream_char_from_basic_ios(base);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    unsigned short ch = delim;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %p %s %c)\n", this, str, wine_dbgstr_longlong(count), delim);
 
-    basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base));
-    basic_filebuf_char_dtor(&this->filebuf);
-}
+    this->count = 0;
 
-/* ??_D?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ??_D?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_vbase_dtor, 4)
-void __thiscall basic_fstream_char_vbase_dtor(basic_fstream_char *this)
-{
-    TRACE("(%p)\n", this);
+    if(basic_istream_wchar_sentry_create(this, TRUE) && count>0) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
 
-    basic_fstream_char_dtor(basic_fstream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1));
-}
+        while(count > 1) {
+            ch = basic_streambuf_wchar_sbumpc(strbuf);
 
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_vector_dtor, 8)
-basic_fstream_char* __thiscall basic_fstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
-{
-    basic_fstream_char *this = basic_fstream_char_from_basic_ios(base);
+            if(ch==WEOF || ch==delim)
+                break;
 
-    TRACE("(%p %x)\n", this, flags);
+            *str++ = ch;
+            this->count++;
+            count--;
+        }
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+        if(ch == delim)
+            this->count++;
+        else if(ch != WEOF) {
+            ch = basic_streambuf_wchar_sgetc(strbuf);
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_fstream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_fstream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+            if(ch == delim) {
+                basic_streambuf_wchar__Gninc(strbuf);
+                this->count++;
+            }
+        }
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, (ch==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit) |
+            (!this->count || (ch!=delim && ch!=WEOF) ? IOSTATE_failbit : IOSTATE_goodbit));
+    if(count > 0)
+        *str = 0;
     return this;
 }
 
-/* ?close@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXXZ */
-/* ?close@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_close, 4)
-void __thiscall basic_fstream_char_close(basic_fstream_char *this)
+/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
+/* ?getline@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
+/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
+/* ?getline@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_getline, 16)
+basic_istream_wchar* __thiscall basic_istream_wchar_getline(basic_istream_wchar *this, wchar_t *str, streamsize count)
 {
-    TRACE("(%p)\n", this);
-
-    if(!basic_filebuf_char_close(&this->filebuf)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
-    }
+    return basic_istream_wchar_getline_delim(this, str, count, '\n');
 }
 
-/* ?is_open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_is_open, 4)
-MSVCP_bool __thiscall basic_fstream_char_is_open(const basic_fstream_char *this)
+/* ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@HG@Z */
+/* ?ignore@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JG@Z */
+/* ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@HG@Z */
+/* ?ignore@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JG@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_ignore, 16)
+basic_istream_wchar* __thiscall basic_istream_wchar_ignore(basic_istream_wchar *this, streamsize count, unsigned short delim)
 {
-    TRACE("(%p)\n", this);
-    return basic_filebuf_char_is_open(&this->filebuf);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    unsigned short ch = delim;
 
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_open, 16)
-void __thiscall basic_fstream_char_open(basic_fstream_char *this,
-        const char *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
+    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(count), delim);
+
+    this->count = 0;
+
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
 
-    if(!basic_filebuf_char_open(&this->filebuf, name, mode, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+        while(count > 0) {
+            ch = basic_streambuf_wchar_sbumpc(strbuf);
+
+            if(ch==WEOF || ch==delim)
+                break;
+
+            this->count++;
+            if(count != INT_MAX)
+                count--;
+        }
     }
-}
+    basic_istream_wchar_sentry_destroy(this);
 
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_open_old, 12)
-void __thiscall basic_fstream_char_open_old(basic_fstream_char *this,
-        const char *name, unsigned int mode)
-{
-    basic_fstream_char_open(this, name, mode, _SH_DENYNO);
+    if(ch == WEOF)
+        basic_ios_wchar_setstate(base, IOSTATE_eofbit);
+    return this;
 }
 
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_open_wchar, 16)
-void __thiscall basic_fstream_char_open_wchar(basic_fstream_char *this,
-        const wchar_t *name, int mode, int prot)
+/* ?ws@std@@YAAAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AAV21@@Z */
+/* ?ws@std@@YAAEAV?$basic_istream@_WU?$char_traits@_W@std@@@1@AEAV21@@Z */
+/* ?ws@std@@YAAAV?$basic_istream@GU?$char_traits@G@std@@@1@AAV21@@Z */
+/* ?ws@std@@YAAEAV?$basic_istream@GU?$char_traits@G@std@@@1@AEAV21@@Z */
+basic_istream_wchar* __cdecl ws_basic_istream_wchar(basic_istream_wchar *istream)
 {
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(istream);
+    unsigned short ch = '\n';
+
+    TRACE("(%p)\n", istream);
+
+    if(basic_istream_wchar_sentry_create(istream, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        const ctype_wchar *ctype = ctype_wchar_use_facet(strbuf->loc);
 
-    if(!basic_filebuf_char_open_wchar(&this->filebuf, name, mode, prot)) {
-        basic_ios_char *basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_setstate(basic_ios, IOSTATE_failbit);
+        for(ch = basic_streambuf_wchar_sgetc(strbuf); ctype_wchar_is_ch(ctype, _SPACE, ch);
+                ch = basic_streambuf_wchar_snextc(strbuf)) {
+            if(ch == WEOF)
+                break;
+        }
     }
+    basic_istream_wchar_sentry_destroy(istream);
+
+    if(ch == WEOF)
+        basic_ios_wchar_setstate(base, IOSTATE_eofbit);
+    return istream;
 }
 
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEAAXPEB_WI@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_open_wchar_old, 12)
-void __thiscall basic_fstream_char_open_wchar_old(basic_fstream_char *this,
-        const wchar_t *name, unsigned int mode)
+/* ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEGXZ */
+/* ?peek@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAGXZ */
+/* ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEGXZ */
+/* ?peek@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAGXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_peek, 4)
+unsigned short __thiscall basic_istream_wchar_peek(basic_istream_wchar *this)
 {
-    basic_fstream_char_open_wchar(this, name, mode, _SH_DENYNO);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    unsigned short ret = WEOF;
 
-/* ?rdbuf@?$basic_fstream@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
-/* ?rdbuf@?$basic_fstream@DU?$char_traits@D@std@@@std@@QEBAPEAV?$basic_filebuf@DU?$char_traits@D@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_char_rdbuf, 4)
-basic_filebuf_char* __thiscall basic_fstream_char_rdbuf(const basic_fstream_char *this)
-{
     TRACE("(%p)\n", this);
-    return (basic_filebuf_char*)&this->filebuf;
-}
 
-static inline basic_ios_wchar* basic_fstream_wchar_to_basic_ios(basic_fstream_wchar *ptr)
-{
-    return (basic_ios_wchar*)((char*)ptr+basic_fstream_wchar_vbtable1[1]);
-}
+    this->count = 0;
 
-static inline basic_fstream_wchar* basic_fstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
-{
-    return (basic_fstream_wchar*)((char*)ptr-basic_fstream_wchar_vbtable1[1]);
+    if(basic_istream_wchar_sentry_create(this, TRUE))
+        ret = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base));
+    basic_istream_wchar_sentry_destroy(this);
+    return ret;
 }
 
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@XZ */
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_ctor, 8)
-basic_fstream_wchar* __thiscall basic_fstream_wchar_ctor(basic_fstream_wchar *this, MSVCP_bool virt_init)
+/* ?_Read_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WIH@Z */
+/* ?_Read_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_K_J@Z */
+/* ?_Read_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGIH@Z */
+/* ?_Read_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_K_J@Z */
+static basic_istream_wchar* basic_istream_wchar__Read_s(basic_istream_wchar *this, wchar_t *str, MSVCP_size_t size, streamsize count)
 {
-    basic_ios_wchar *basic_ios;
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-    TRACE("(%p %d)\n", this, virt_init);
+    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
 
-    if(virt_init) {
-        this->base.base1.vbtable = basic_fstream_wchar_vbtable1;
-        this->base.base2.vbtable = basic_fstream_wchar_vbtable2;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_ctor(basic_ios);
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+
+        this->count = basic_streambuf_wchar__Sgetn_s(strbuf, str, size, count);
+        if(this->count != count)
+            state |= IOSTATE_failbit | IOSTATE_eofbit;
     }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
+        this->count = 0;
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_filebuf_wchar_ctor(&this->filebuf);
-    basic_iostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_fstream_wchar_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@XZ */
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_short_ctor, 8)
-basic_fstream_wchar* __thiscall basic_fstream_short_ctor(basic_fstream_wchar *this, MSVCP_bool virt_init)
+/* ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@PA_WH@Z */
+/* ?read@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@PEA_W_J@Z */
+/* ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@PAGH@Z */
+/* ?read@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@PEAG_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read, 16)
+basic_istream_wchar* __thiscall basic_istream_wchar_read(basic_istream_wchar *this, wchar_t *str, streamsize count)
 {
-    basic_fstream_wchar_ctor(this, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_fstream_short_vtable;
-    return this;
+    return basic_istream_wchar__Read_s(this, str, count, count);
 }
 
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_ctor_file, 12)
-basic_fstream_wchar* __thiscall basic_fstream_wchar_ctor_file(basic_fstream_wchar *this,
-        FILE *file, MSVCP_bool virt_init)
+/* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WIH@Z */
+/* ?_Readsome_s@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_K_J@Z */
+/* ?_Readsome_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHPAGIH@Z */
+/* ?_Readsome_s@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_K_J@Z */
+static streamsize basic_istream_wchar__Readsome_s(basic_istream_wchar *this, wchar_t *str, MSVCP_size_t size, streamsize count)
 {
-    basic_ios_wchar *basic_ios;
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-    TRACE("(%p %p %d)\n", this, file, virt_init);
+    TRACE("(%p %p %lu %s)\n", this, str, size, wine_dbgstr_longlong(count));
 
-    if(virt_init) {
-        this->base.base1.vbtable = basic_fstream_wchar_vbtable1;
-        this->base.base2.vbtable = basic_fstream_wchar_vbtable2;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_ctor(basic_ios);
+    this->count = 0;
+
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        streamsize avail = basic_streambuf_wchar_in_avail(basic_ios_wchar_rdbuf_get(base));
+        if(avail > count)
+            avail = count;
+
+        if(avail == -1)
+            state |= IOSTATE_eofbit;
+        else if(avail > 0)
+            basic_istream_wchar__Read_s(this, str, size, avail);
     }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
+        state |= IOSTATE_failbit;
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_filebuf_wchar_ctor_file(&this->filebuf, file);
-    basic_iostream_wchar_ctor(&this->base, &this->filebuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_fstream_wchar_vtable;
-    return this;
+    basic_ios_wchar_setstate(base, state);
+    return this->count;
 }
 
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@PAU_iobuf@@@Z */
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@PEAU_iobuf@@@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_short_ctor_file, 12)
-basic_fstream_wchar* __thiscall basic_fstream_short_ctor_file(basic_fstream_wchar *this,
-        FILE *file, MSVCP_bool virt_init)
+/* ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHPA_WH@Z */
+/* ?readsome@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA_JPEA_W_J@Z */
+/* ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHPAGH@Z */
+/* ?readsome@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA_JPEAG_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_readsome, 16)
+streamsize __thiscall basic_istream_wchar_readsome(basic_istream_wchar *this, wchar_t *str, streamsize count)
 {
-    basic_fstream_wchar_ctor_file(this, file, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_fstream_short_vtable;
-    return this;
+    return basic_istream_wchar__Readsome_s(this, str, count, count);
 }
 
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_ctor_name, 20)
-basic_fstream_wchar* __thiscall basic_fstream_wchar_ctor_name(basic_fstream_wchar *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
+/* ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@_W@Z */
+/* ?putback@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_W@Z */
+/* ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@G@Z */
+/* ?putback@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@G@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_putback, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_putback(basic_istream_wchar *this, wchar_t ch)
 {
-    TRACE("(%p %s %d %d %d)\n", this, name, mode, prot, virt_init);
-
-    basic_fstream_wchar_ctor(this, virt_init);
-
-    if(!basic_filebuf_wchar_open(&this->filebuf, name, mode, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
-    return this;
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@PEBGHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_short_ctor_name, 20)
-basic_fstream_wchar* __thiscall basic_fstream_short_ctor_name(basic_fstream_wchar *this,
-        const char *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    basic_fstream_wchar_ctor_name(this, name, mode, prot, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_fstream_short_vtable;
-    return this;
-}
+    TRACE("(%p %c)\n", this, ch);
 
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_ctor_name_wchar, 20)
-basic_fstream_wchar* __thiscall basic_fstream_wchar_ctor_name_wchar(basic_fstream_wchar *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    TRACE("(%p %s %d %d %d)\n", this, debugstr_w(name), mode, prot, virt_init);
+    this->count = 0;
 
-    basic_fstream_wchar_ctor(this, virt_init);
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
 
-    if(!basic_filebuf_wchar_open_wchar(&this->filebuf, name, mode, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+        if(!ios_base_good(&base->base))
+            state |= IOSTATE_failbit;
+        else if(!strbuf || basic_streambuf_wchar_sputbackc(strbuf, ch)==WEOF)
+            state |= IOSTATE_badbit;
     }
-    return this;
-}
+    basic_istream_wchar_sentry_destroy(this);
 
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@PBGHH@Z */
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@PEBGHH@Z */
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QAE@PB_WHH@Z */
-/* ??0?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAA@PEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_short_ctor_name_wchar, 20)
-basic_fstream_wchar* __thiscall basic_fstream_short_ctor_name_wchar(basic_fstream_wchar *this,
-        const wchar_t *name, int mode, int prot, MSVCP_bool virt_init)
-{
-    basic_fstream_wchar_ctor_name_wchar(this, name, mode, prot, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_fstream_short_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??1?$basic_fstream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
-/* ??1?$basic_fstream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
-/* ??1?$basic_fstream@GU?$char_traits@G@std@@@std@@UAE@XZ */
-/* ??1?$basic_fstream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_dtor, 4)
-void __thiscall basic_fstream_wchar_dtor(basic_ios_wchar *base)
+/* ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@XZ */
+/* ?unget@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@XZ */
+/* ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@XZ */
+/* ?unget@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@XZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_unget, 4)
+basic_istream_wchar* __thiscall basic_istream_wchar_unget(basic_istream_wchar *this)
 {
-    basic_fstream_wchar *this = basic_fstream_wchar_from_basic_ios(base);
-
-    TRACE("(%p)\n", this);
-
-    basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(&this->base));
-    basic_filebuf_wchar_dtor(&this->filebuf);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_goodbit;
 
-/* ??_D?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ??_D?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ??_D?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ??_D?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_vbase_dtor, 4)
-void __thiscall basic_fstream_wchar_vbase_dtor(basic_fstream_wchar *this)
-{
     TRACE("(%p)\n", this);
 
-    basic_fstream_wchar_dtor(basic_fstream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base.base1));
-}
-
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_vector_dtor, 8)
-basic_fstream_wchar* __thiscall basic_fstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
-{
-    basic_fstream_wchar *this = basic_fstream_wchar_from_basic_ios(base);
-
-    TRACE("(%p %x)\n", this, flags);
+    this->count = 0;
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_fstream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_fstream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        if(!ios_base_good(&base->base))
+            state |= IOSTATE_failbit;
+        else if(!strbuf || basic_streambuf_wchar_sungetc(strbuf)==WEOF)
+            state |= IOSTATE_badbit;
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?close@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
-/* ?close@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
-/* ?close@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXXZ */
-/* ?close@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_close, 4)
-void __thiscall basic_fstream_wchar_close(basic_fstream_wchar *this)
+/* ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEHXZ */
+/* ?sync@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAHXZ */
+/* ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEHXZ */
+/* ?sync@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAHXZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_sync, 4)
+int __thiscall basic_istream_wchar_sync(basic_istream_wchar *this)
 {
-    TRACE("(%p)\n", this);
-
-    if(!basic_filebuf_wchar_close(&this->filebuf)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
 
-/* ?is_open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEBA_NXZ */
-/* ?is_open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QBE_NXZ */
-/* ?is_open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_is_open, 4)
-MSVCP_bool __thiscall basic_fstream_wchar_is_open(const basic_fstream_wchar *this)
-{
     TRACE("(%p)\n", this);
-    return basic_filebuf_wchar_is_open(&this->filebuf);
-}
 
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBDHH@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXPBDHH@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_open, 16)
-void __thiscall basic_fstream_wchar_open(basic_fstream_wchar *this,
-        const char *name, int mode, int prot)
-{
-    TRACE("(%p %s %d %d)\n", this, name, mode, prot);
+    if(!strbuf)
+        return -1;
 
-    if(!basic_filebuf_wchar_open(&this->filebuf, name, mode, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        if(basic_streambuf_wchar_pubsync(strbuf) != -1) {
+            basic_istream_wchar_sentry_destroy(this);
+            return 0;
+        }
     }
-}
+    basic_istream_wchar_sentry_destroy(this);
 
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBDI@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXPBDI@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXPEBDI@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_open_old, 12)
-void __thiscall basic_fstream_wchar_open_old(basic_fstream_wchar *this,
-        const char *name, unsigned int mode)
-{
-    basic_fstream_wchar_open(this, name, mode, _SH_DENYNO);
+    basic_ios_wchar_setstate(base, IOSTATE_badbit);
+    return -1;
 }
 
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEB_WHH@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXPBGHH@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXPEBGHH@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXPB_WHH@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXPEB_WHH@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_open_wchar, 16)
-void __thiscall basic_fstream_wchar_open_wchar(basic_fstream_wchar *this,
-        const wchar_t *name, int mode, int prot)
+/* ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAE?AV?$fpos@H@2@XZ */
+/* ?tellg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
+/* ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAE?AV?$fpos@H@2@XZ */
+/* ?tellg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAA?AV?$fpos@H@2@XZ */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_tellg, 8)
+fpos_int* __thiscall basic_istream_wchar_tellg(basic_istream_wchar *this, fpos_int *ret)
 {
-    TRACE("(%p %s %d %d)\n", this, debugstr_w(name), mode, prot);
+    TRACE("(%p %p)\n", this, ret);
 
-    if(!basic_filebuf_wchar_open_wchar(&this->filebuf, name, mode, prot)) {
-        basic_ios_wchar *basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_setstate(basic_ios, IOSTATE_failbit);
-    }
-}
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+        if(!ios_base_fail(&base->base)) {
+            basic_streambuf_wchar_pubseekoff(basic_ios_wchar_rdbuf_get(base),
+                    ret, 0, SEEKDIR_cur, OPENMODE_in);
+            basic_istream_wchar_sentry_destroy(this);
 
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEAAXPEB_WI@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXPBGI@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXPEBGI@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QAEXPB_WI@Z */
-/* ?open@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEAAXPEB_WI@Z */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_open_wchar_old, 12)
-void __thiscall basic_fstream_wchar_open_wchar_old(basic_fstream_wchar *this,
-        const wchar_t *name, unsigned int mode)
-{
-    basic_fstream_wchar_open_wchar(this, name, mode, _SH_DENYNO);
-}
+            if(ret->off==0 && ret->pos==-1 && ret->state==0)
+                basic_ios_wchar_setstate(base, IOSTATE_failbit);
+            return ret;
+        }
+    }
+    basic_istream_wchar_sentry_destroy(this);
 
-/* ?rdbuf@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QBEPAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_fstream@_WU?$char_traits@_W@std@@@std@@QEBAPEAV?$basic_filebuf@_WU?$char_traits@_W@std@@@2@XZ */
-/* ?rdbuf@?$basic_fstream@GU?$char_traits@G@std@@@std@@QBEPAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
-/* ?rdbuf@?$basic_fstream@GU?$char_traits@G@std@@@std@@QEBAPEAV?$basic_filebuf@GU?$char_traits@G@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_fstream_wchar_rdbuf, 4)
-basic_filebuf_wchar* __thiscall basic_fstream_wchar_rdbuf(const basic_fstream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_filebuf_wchar*)&this->filebuf;
+    ret->off = 0;
+    ret->pos = -1;
+    ret->state = 0;
+    return ret;
 }
 
-static inline basic_ios_char* basic_ostringstream_char_to_basic_ios(basic_ostringstream_char *ptr)
+/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@JH@Z */
+/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@_JH@Z */
+/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@JH@Z */
+/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@_JH@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_seekg, 16)
+basic_istream_wchar* __thiscall basic_istream_wchar_seekg(basic_istream_wchar *this, streamoff off, int dir)
 {
-    return (basic_ios_char*)((char*)ptr+basic_ostringstream_char_vbtable[1]);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
 
-static inline basic_ostringstream_char* basic_ostringstream_char_from_basic_ios(basic_ios_char *ptr)
-{
-    return (basic_ostringstream_char*)((char*)ptr-basic_ostringstream_char_vbtable[1]);
-}
+    TRACE("(%p %s %d)\n", this, wine_dbgstr_longlong(off), dir);
 
-/* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-/* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor_str, 16)
-basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor_str(basic_ostringstream_char *this,
-        const basic_string_char *str, int mode, MSVCP_bool virt_init)
-{
-    basic_ios_char *basic_ios;
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        if(!ios_base_fail(&base->base)) {
+            basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+            fpos_int ret;
 
-    TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
+            basic_streambuf_wchar_pubseekoff(strbuf, &ret, off, dir, OPENMODE_in);
+            basic_istream_wchar_sentry_destroy(this);
 
-    if(virt_init) {
-        this->base.vbtable = basic_ostringstream_char_vbtable;
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
+            if(ret.off==0 && ret.pos==-1 && ret.state==0)
+                basic_ios_wchar_setstate(base, IOSTATE_failbit);
+            else
+                basic_ios_wchar_clear(base, IOSTATE_goodbit);
+            return this;
+        }
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_char_ctor_str(&this->strbuf, str, mode|OPENMODE_out);
-    basic_ostream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ostringstream_char_vtable;
+    basic_ios_wchar_setstate(base, IOSTATE_failbit);
     return this;
 }
 
-/* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
-/* ??0?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor_mode, 12)
-basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor_mode(
-        basic_ostringstream_char *this, int mode, MSVCP_bool virt_init)
+/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
+/* ?seekg@?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
+/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV12@V?$fpos@H@2@@Z */
+/* ?seekg@?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV12@V?$fpos@H@2@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_seekg_fpos, 28)
+basic_istream_wchar* __thiscall basic_istream_wchar_seekg_fpos(basic_istream_wchar *this, fpos_int pos)
 {
-    basic_ios_char *basic_ios;
-
-    TRACE("(%p %d %d)\n", this, mode, virt_init);
-
-    if(virt_init) {
-        this->base.vbtable = basic_ostringstream_char_vbtable;
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_char_get_basic_ios(&this->base);
-    }
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
 
-    basic_stringbuf_char_ctor_mode(&this->strbuf, mode|OPENMODE_out);
-    basic_ostream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ostringstream_char_vtable;
-    return this;
-}
+    TRACE("(%p %s)\n", this, debugstr_fpos_int(&pos));
 
-/* ??_F?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_F?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_ctor, 8)
-basic_ostringstream_char* __thiscall basic_ostringstream_char_ctor(
-        basic_ostringstream_char *this, MSVCP_bool virt_init)
-{
-    return basic_ostringstream_char_ctor_mode(this, 0, virt_init);
-}
+    if(basic_istream_wchar_sentry_create(this, TRUE)) {
+        if(!ios_base_fail(&base->base)) {
+            basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+            fpos_int ret;
 
-/* ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
-/* ??1?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_dtor, 4)
-void __thiscall basic_ostringstream_char_dtor(basic_ios_char *base)
-{
-    basic_ostringstream_char *this = basic_ostringstream_char_from_basic_ios(base);
+            basic_streambuf_wchar_pubseekpos(strbuf, &ret, pos, OPENMODE_in);
+            basic_istream_wchar_sentry_destroy(this);
 
-    TRACE("(%p)\n", this);
+            if(ret.off==0 && ret.pos==-1 && ret.state==0)
+                basic_ios_wchar_setstate(base, IOSTATE_failbit);
+            else
+                basic_ios_wchar_clear(base, IOSTATE_goodbit);
+            return this;
+        }
+    }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_char_dtor(&this->strbuf);
-    basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base));
+    basic_ios_wchar_setstate(base, IOSTATE_failbit);
+    return this;
 }
 
-/* ??_D?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_D?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_vbase_dtor, 4)
-void __thiscall basic_ostringstream_char_vbase_dtor(basic_ostringstream_char *this)
+static basic_istream_wchar* basic_istream_read_short(basic_istream_wchar *this, short *v, const num_get *numget)
 {
-    TRACE("(%p)\n", this);
-
-    basic_ostringstream_char_dtor(basic_ostringstream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_ostream_char_get_basic_ios(&this->base));
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_vector_dtor, 8)
-basic_ostringstream_char* __thiscall basic_ostringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
-{
-    basic_ostringstream_char *this = basic_ostringstream_char_from_basic_ios(base);
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %x)\n", this, flags);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
+        LONG tmp;
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+        first.strbuf = strbuf;
+        num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, &tmp);
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_ostringstream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ostringstream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        if(!(state&IOSTATE_failbit) && tmp==(LONG)((short)tmp))
+            *v = tmp;
+        else
+            state |= IOSTATE_failbit;
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?rdbuf@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?rdbuf@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_rdbuf, 4)
-basic_stringbuf_char* __thiscall basic_ostringstream_char_rdbuf(const basic_ostringstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_stringbuf_char*)&this->strbuf;
-}
-
-/* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-/* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_str_set, 8)
-void __thiscall basic_ostringstream_char_str_set(basic_ostringstream_char *this, const basic_string_char *str)
-{
-    TRACE("(%p %p)\n", this, str);
-    basic_stringbuf_char_str_set(&this->strbuf, str);
-}
-
-/* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?str@?$basic_ostringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_char_str_get, 8)
-basic_string_char* __thiscall basic_ostringstream_char_str_get(const basic_ostringstream_char *this, basic_string_char *ret)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAF@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAF@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_short, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_short(basic_istream_wchar *this, short *v)
 {
-    TRACE("(%p %p)\n", this, ret);
-    return basic_stringbuf_char_str_get(&this->strbuf, ret);
+    return basic_istream_read_short(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_ios_wchar* basic_ostringstream_wchar_to_basic_ios(basic_ostringstream_wchar *ptr)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAF@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAF@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_short, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_short(basic_istream_wchar *this, short *v)
 {
-    return (basic_ios_wchar*)((char*)ptr+basic_ostringstream_wchar_vbtable[1]);
+    return basic_istream_read_short(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_ostringstream_wchar* basic_ostringstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAG@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAG@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ushort, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_ushort(basic_istream_wchar *this, unsigned short *v)
 {
-    return (basic_ostringstream_wchar*)((char*)ptr-basic_ostringstream_wchar_vbtable[1]);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-/* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_ctor_str, 16)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_ctor_str(basic_ostringstream_wchar *this,
-        const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        const num_get *numget = num_get_wchar_use_facet(strbuf->loc);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-    if(virt_init) {
-        this->base.vbtable = basic_ostringstream_wchar_vbtable;
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
+        first.strbuf = strbuf;
+        num_get_wchar_get_ushort(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_wchar_ctor_str(&this->strbuf, str, mode|OPENMODE_out);
-    basic_ostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ostringstream_wchar_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-/* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_short_ctor_str, 16)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_short_ctor_str(basic_ostringstream_wchar *this,
-        const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
+static basic_istream_wchar* basic_istream_read_int(basic_istream_wchar *this, int *v, const num_get *numget)
 {
-    basic_ostringstream_wchar_ctor_str(this, str, mode, virt_init);
-    basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ostringstream_short_vtable;
-    return this;
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
-/* ??0?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_ctor_mode, 12)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_ctor_mode(
-        basic_ostringstream_wchar *this, int mode, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %d %d)\n", this, mode, virt_init);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-    if(virt_init) {
-        this->base.vbtable = basic_ostringstream_wchar_vbtable;
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_ostream_wchar_get_basic_ios(&this->base);
+        first.strbuf = strbuf;
+        num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_wchar_ctor_mode(&this->strbuf, mode|OPENMODE_out);
-    basic_ostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_ostringstream_wchar_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
-/* ??0?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_short_ctor_mode, 12)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_short_ctor_mode(
-        basic_ostringstream_wchar *this, int mode, MSVCP_bool virt_init)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAH@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAH@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_int, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_int(basic_istream_wchar *this, int *v)
 {
-    basic_ostringstream_wchar_ctor_mode(this, mode, virt_init);
-    basic_ostream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_ostringstream_short_vtable;
-    return this;
+    return basic_istream_read_int(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??_F?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_F?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_ctor, 8)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_ctor(
-        basic_ostringstream_wchar *this, MSVCP_bool virt_init)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAH@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAH@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_int, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_int(basic_istream_wchar *this, int *v)
 {
-    return basic_ostringstream_wchar_ctor_mode(this, 0, virt_init);
+    return basic_istream_read_int(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??_F?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_F?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_short_ctor, 8)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_short_ctor(
-        basic_ostringstream_wchar *this, MSVCP_bool virt_init)
+static basic_istream_wchar* basic_istream_read_uint(basic_istream_wchar *this, unsigned int *v, const num_get *numget)
 {
-    return basic_ostringstream_short_ctor_mode(this, 0, virt_init);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??1?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
-/* ??1?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
-/* ??1?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
-/* ??1?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_dtor, 4)
-void __thiscall basic_ostringstream_wchar_dtor(basic_ios_wchar *base)
-{
-    basic_ostringstream_wchar *this = basic_ostringstream_wchar_from_basic_ios(base);
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p)\n", this);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
+
+        first.strbuf = strbuf;
+        num_get_wchar_get_uint(numget, &last, first, last, &base->base, &state, v);
+    }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_wchar_dtor(&this->strbuf);
-    basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base));
+    basic_ios_wchar_setstate(base, state);
+    return this;
 }
 
-/* ??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_D?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-/* ??_D?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_D?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_vbase_dtor, 4)
-void __thiscall basic_ostringstream_wchar_vbase_dtor(basic_ostringstream_wchar *this)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAI@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAI@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_uint, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_uint(basic_istream_wchar *this, unsigned int *v)
 {
-    TRACE("(%p)\n", this);
+    return basic_istream_read_uint(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+}
 
-    basic_ostringstream_wchar_dtor(basic_ostringstream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_ostream_wchar_get_basic_ios(&this->base));
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAI@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAI@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_uint, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_uint(basic_istream_wchar *this, unsigned int *v)
+{
+    return basic_istream_read_uint(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_vector_dtor, 8)
-basic_ostringstream_wchar* __thiscall basic_ostringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+static basic_istream_wchar* basic_istream_read_long(basic_istream_wchar *this, LONG *v, const num_get *numget)
 {
-    basic_ostringstream_wchar *this = basic_ostringstream_wchar_from_basic_ios(base);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %p)\n", this, v);
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_ostringstream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_ostringstream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        first.strbuf = strbuf;
+        num_get_wchar_get_long(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?rdbuf@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?rdbuf@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?rdbuf@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?rdbuf@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_rdbuf, 4)
-basic_stringbuf_wchar* __thiscall basic_ostringstream_wchar_rdbuf(const basic_ostringstream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_stringbuf_wchar*)&this->strbuf;
-}
-
-/* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-/* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_str_set, 8)
-void __thiscall basic_ostringstream_wchar_str_set(basic_ostringstream_wchar *this, const basic_string_wchar *str)
-{
-    TRACE("(%p %p)\n", this, str);
-    basic_stringbuf_wchar_str_set(&this->strbuf, str);
-}
-
-/* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_ostringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?str@?$basic_ostringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_ostringstream_wchar_str_get, 8)
-basic_string_wchar* __thiscall basic_ostringstream_wchar_str_get(const basic_ostringstream_wchar *this, basic_string_wchar *ret)
-{
-    TRACE("(%p %p)\n", this, ret);
-    return basic_stringbuf_wchar_str_get(&this->strbuf, ret);
-}
-
-static inline basic_ios_char* basic_istringstream_char_to_basic_ios(basic_istringstream_char *ptr)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_long, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_long(basic_istream_wchar *this, LONG *v)
 {
-    return (basic_ios_char*)((char*)ptr+basic_istringstream_char_vbtable[1]);
+    return basic_istream_read_long(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_istringstream_char* basic_istringstream_char_from_basic_ios(basic_ios_char *ptr)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAJ@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAJ@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_long, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_long(basic_istream_wchar *this, LONG *v)
 {
-    return (basic_istringstream_char*)((char*)ptr-basic_istringstream_char_vbtable[1]);
+    return basic_istream_read_long(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-/* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor_str, 16)
-basic_istringstream_char* __thiscall basic_istringstream_char_ctor_str(basic_istringstream_char *this,
-        const basic_string_char *str, int mode, MSVCP_bool virt_init)
+static basic_istream_wchar* basic_istream_read_ulong(basic_istream_wchar *this, ULONG *v, const num_get *numget)
 {
-    basic_ios_char *basic_ios;
-
-    TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
-
-    if(virt_init) {
-        this->base.vbtable = basic_istringstream_char_vbtable;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
-    }
-
-    basic_stringbuf_char_ctor_str(&this->strbuf, str, mode|OPENMODE_in);
-    basic_istream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_istringstream_char_vtable;
-    return this;
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
-/* ??0?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor_mode, 12)
-basic_istringstream_char* __thiscall basic_istringstream_char_ctor_mode(
-        basic_istringstream_char *this, int mode, MSVCP_bool virt_init)
-{
-    basic_ios_char *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %d %d)\n", this, mode, virt_init);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-    if(virt_init) {
-        this->base.vbtable = basic_istringstream_char_vbtable;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base);
+        first.strbuf = strbuf;
+        num_get_wchar_get_ulong(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_char_ctor_mode(&this->strbuf, mode|OPENMODE_in);
-    basic_istream_char_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_istringstream_char_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??_F?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_F?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_ctor, 8)
-basic_istringstream_char* __thiscall basic_istringstream_char_ctor(
-        basic_istringstream_char *this, MSVCP_bool virt_init)
-{
-    return basic_istringstream_char_ctor_mode(this, 0, virt_init);
-}
-
-/* ??1?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
-/* ??1?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_dtor, 4)
-void __thiscall basic_istringstream_char_dtor(basic_ios_char *base)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAK@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAK@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ulong, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_ulong(basic_istream_wchar *this, ULONG *v)
 {
-    basic_istringstream_char *this = basic_istringstream_char_from_basic_ios(base);
-
-    TRACE("(%p)\n", this);
-
-    basic_stringbuf_char_dtor(&this->strbuf);
-    basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base));
+    return basic_istream_read_ulong(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??_D?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_D?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_vbase_dtor, 4)
-void __thiscall basic_istringstream_char_vbase_dtor(basic_istringstream_char *this)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAK@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAK@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ulong, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_ulong(basic_istream_wchar *this, ULONG *v)
 {
-    TRACE("(%p)\n", this);
-
-    basic_istringstream_char_dtor(basic_istringstream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base));
+    return basic_istream_read_ulong(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_vector_dtor, 8)
-basic_istringstream_char* __thiscall basic_istringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
+static basic_istream_wchar* basic_istream_read_float(basic_istream_wchar *this, float *v, const num_get *numget)
 {
-    basic_istringstream_char *this = basic_istringstream_char_from_basic_ios(base);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %p)\n", this, v);
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_istringstream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_istringstream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        first.strbuf = strbuf;
+        num_get_wchar_get_float(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?rdbuf@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?rdbuf@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_rdbuf, 4)
-basic_stringbuf_char* __thiscall basic_istringstream_char_rdbuf(const basic_istringstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_stringbuf_char*)&this->strbuf;
-}
-
-/* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-/* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_str_set, 8)
-void __thiscall basic_istringstream_char_str_set(basic_istringstream_char *this, const basic_string_char *str)
-{
-    TRACE("(%p %p)\n", this, str);
-    basic_stringbuf_char_str_set(&this->strbuf, str);
-}
-
-/* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?str@?$basic_istringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_char_str_get, 8)
-basic_string_char* __thiscall basic_istringstream_char_str_get(const basic_istringstream_char *this, basic_string_char *ret)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAM@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAM@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_float, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_float(basic_istream_wchar *this, float *v)
 {
-    TRACE("(%p %p)\n", this, ret);
-    return basic_stringbuf_char_str_get(&this->strbuf, ret);
+    return basic_istream_read_float(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_ios_wchar* basic_istringstream_wchar_to_basic_ios(basic_istringstream_wchar *ptr)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAM@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAM@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_float, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_float(basic_istream_wchar *this, float *v)
 {
-    return (basic_ios_wchar*)((char*)ptr+basic_istringstream_wchar_vbtable[1]);
+    return basic_istream_read_float(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_istringstream_wchar* basic_istringstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
+static basic_istream_wchar* basic_istream_read_double(basic_istream_wchar *this, double *v, const num_get *numget)
 {
-    return (basic_istringstream_wchar*)((char*)ptr-basic_istringstream_wchar_vbtable[1]);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-/* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_ctor_str, 16)
-basic_istringstream_wchar* __thiscall basic_istringstream_wchar_ctor_str(basic_istringstream_wchar *this,
-        const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
-{
-    basic_ios_wchar *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-    if(virt_init) {
-        this->base.vbtable = basic_istringstream_wchar_vbtable;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
+        first.strbuf = strbuf;
+        num_get_wchar_get_double(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_wchar_ctor_str(&this->strbuf, str, mode|OPENMODE_in);
-    basic_istream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_istringstream_wchar_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-/* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_short_ctor_str, 16)
-basic_istringstream_wchar* __thiscall basic_istringstream_short_ctor_str(basic_istringstream_wchar *this,
-        const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAN@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAN@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_double, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_double(basic_istream_wchar *this, double *v)
 {
-    basic_istringstream_wchar_ctor_str(this, str, mode, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_istringstream_short_vtable;
-    return this;
+    return basic_istream_read_double(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
-/* ??0?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_ctor_mode, 12)
-basic_istringstream_wchar* __thiscall basic_istringstream_wchar_ctor_mode(
-        basic_istringstream_wchar *this, int mode, MSVCP_bool virt_init)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAN@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAN@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_double, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_double(basic_istream_wchar *this, double *v)
 {
-    basic_ios_wchar *basic_ios;
+    return basic_istream_read_double(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+}
 
-    TRACE("(%p %d %d)\n", this, mode, virt_init);
+static basic_istream_wchar* basic_istream_read_ldouble(basic_istream_wchar *this, double *v, const num_get *numget)
+{
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    if(virt_init) {
-        this->base.vbtable = basic_istringstream_wchar_vbtable;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base);
+    TRACE("(%p %p)\n", this, v);
+
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
+
+        first.strbuf = strbuf;
+        num_get_wchar_get_ldouble(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_wchar_ctor_mode(&this->strbuf, mode|OPENMODE_in);
-    basic_istream_wchar_ctor(&this->base, &this->strbuf.base, FALSE, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_istringstream_wchar_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
-/* ??0?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_short_ctor_mode, 12)
-basic_istringstream_wchar* __thiscall basic_istringstream_short_ctor_mode(
-        basic_istringstream_wchar *this, int mode, MSVCP_bool virt_init)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAO@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAO@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ldouble, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_ldouble(basic_istream_wchar *this, double *v)
 {
-    basic_istringstream_wchar_ctor_mode(this, mode, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base)->base.vtable = &MSVCP_basic_istringstream_short_vtable;
-    return this;
+    return basic_istream_read_ldouble(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??_F?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_F?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_ctor, 8)
-basic_istringstream_wchar* __thiscall basic_istringstream_wchar_ctor(
-        basic_istringstream_wchar *this, MSVCP_bool virt_init)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAO@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAO@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ldouble, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_ldouble(basic_istream_wchar *this, double *v)
 {
-    return basic_istringstream_wchar_ctor_mode(this, 0, virt_init);
+    return basic_istream_read_ldouble(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??_F?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_F?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_short_ctor, 8)
-basic_istringstream_wchar* __thiscall basic_istringstream_short_ctor(
-        basic_istringstream_wchar *this, MSVCP_bool virt_init)
+static basic_istream_wchar* basic_istream_read_ptr(basic_istream_wchar *this, void **v, const num_get *numget)
 {
-    return basic_istringstream_short_ctor_mode(this, 0, virt_init);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??1?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
-/* ??1?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
-/* ??1?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
-/* ??1?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_dtor, 4)
-void __thiscall basic_istringstream_wchar_dtor(basic_ios_wchar *base)
-{
-    basic_istringstream_wchar *this = basic_istringstream_wchar_from_basic_ios(base);
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p)\n", this);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
+
+        first.strbuf = strbuf;
+        num_get_wchar_get_void(numget, &last, first, last, &base->base, &state, v);
+    }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_wchar_dtor(&this->strbuf);
-    basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base));
+    basic_ios_wchar_setstate(base, state);
+    return this;
 }
 
-/* ??_D?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_D?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-/* ??_D?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_D?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_vbase_dtor, 4)
-void __thiscall basic_istringstream_wchar_vbase_dtor(basic_istringstream_wchar *this)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AAPAX@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_ptr, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_ptr(basic_istream_wchar *this, void **v)
 {
-    TRACE("(%p)\n", this);
+    return basic_istream_read_ptr(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+}
 
-    basic_istringstream_wchar_dtor(basic_istringstream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base));
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AAPAX@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEAPEAX@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_ptr, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_ptr(basic_istream_wchar *this, void **v)
+{
+    return basic_istream_read_ptr(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_vector_dtor, 8)
-basic_istringstream_wchar* __thiscall basic_istringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+static basic_istream_wchar* basic_istream_read_int64(basic_istream_wchar *this, __int64 *v, const num_get *numget)
 {
-    basic_istringstream_wchar *this = basic_istringstream_wchar_from_basic_ios(base);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p %x)\n", this, flags);
+    TRACE("(%p %p)\n", this, v);
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_istringstream_wchar_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_istringstream_wchar_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+        first.strbuf = strbuf;
+        num_get_wchar_get_int64(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ?rdbuf@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?rdbuf@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?rdbuf@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?rdbuf@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_rdbuf, 4)
-basic_stringbuf_wchar* __thiscall basic_istringstream_wchar_rdbuf(const basic_istringstream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_stringbuf_wchar*)&this->strbuf;
-}
-
-/* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-/* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_str_set, 8)
-void __thiscall basic_istringstream_wchar_str_set(basic_istringstream_wchar *this, const basic_string_wchar *str)
-{
-    TRACE("(%p %p)\n", this, str);
-    basic_stringbuf_wchar_str_set(&this->strbuf, str);
-}
-
-/* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_istringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?str@?$basic_istringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_istringstream_wchar_str_get, 8)
-basic_string_wchar* __thiscall basic_istringstream_wchar_str_get(const basic_istringstream_wchar *this, basic_string_wchar *ret)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_J@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_int64, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_int64(basic_istream_wchar *this, __int64 *v)
 {
-    TRACE("(%p %p)\n", this, ret);
-    return basic_stringbuf_wchar_str_get(&this->strbuf, ret);
+    return basic_istream_read_int64(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_ios_char* basic_stringstream_char_to_basic_ios(basic_stringstream_char *ptr)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_J@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_J@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_int64, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_int64(basic_istream_wchar *this, __int64 *v)
 {
-    return (basic_ios_char*)((char*)ptr+basic_stringstream_char_vbtable1[1]);
+    return basic_istream_read_int64(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-static inline basic_stringstream_char* basic_stringstream_char_from_basic_ios(basic_ios_char *ptr)
+static basic_istream_wchar* basic_istream_read_uint64(basic_istream_wchar *this, unsigned __int64 *v, const num_get *numget)
 {
-    return (basic_stringstream_char*)((char*)ptr-basic_stringstream_char_vbtable1[1]);
-}
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-/* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-/* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor_str, 16)
-basic_stringstream_char* __thiscall basic_stringstream_char_ctor_str(basic_stringstream_char *this,
-        const basic_string_char *str, int mode, MSVCP_bool virt_init)
-{
-    basic_ios_char *basic_ios;
+    TRACE("(%p %p)\n", this, v);
 
-    TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
 
-    if(virt_init) {
-        this->base.base1.vbtable = basic_stringstream_char_vbtable1;
-        this->base.base2.vbtable = basic_stringstream_char_vbtable2;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
+        first.strbuf = strbuf;
+        num_get_wchar_get_uint64(numget, &last, first, last, &base->base, &state, v);
     }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_stringbuf_char_ctor_str(&this->strbuf, str, mode);
-    basic_iostream_char_ctor(&this->base, &this->strbuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_stringstream_char_vtable;
+    basic_ios_wchar_setstate(base, state);
     return this;
 }
 
-/* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@H@Z */
-/* ??0?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor_mode, 12)
-basic_stringstream_char* __thiscall basic_stringstream_char_ctor_mode(
-        basic_stringstream_char *this, int mode, MSVCP_bool virt_init)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_K@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_K@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_uint64, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_uint64(basic_istream_wchar *this, unsigned __int64 *v)
 {
-    basic_ios_char *basic_ios;
-
-    TRACE("(%p %d %d)\n", this, mode, virt_init);
-
-    if(virt_init) {
-        this->base.base1.vbtable = basic_stringstream_char_vbtable1;
-        this->base.base2.vbtable = basic_stringstream_char_vbtable2;
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-        basic_ios_char_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_char_get_basic_ios(&this->base.base1);
-    }
-
-    basic_stringbuf_char_ctor_mode(&this->strbuf, mode);
-    basic_iostream_char_ctor(&this->base, &this->strbuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_stringstream_char_vtable;
-    return this;
+    return basic_istream_read_uint64(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??_F?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_F?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_ctor, 8)
-basic_stringstream_char* __thiscall basic_stringstream_char_ctor(
-        basic_stringstream_char *this, MSVCP_bool virt_init)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_K@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_K@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_uint64, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_uint64(basic_istream_wchar *this, unsigned __int64 *v)
 {
-    return basic_stringstream_char_ctor_mode(
-            this, OPENMODE_out|OPENMODE_in, virt_init);
+    return basic_istream_read_uint64(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-/* ??1?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UAE@XZ */
-/* ??1?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_dtor, 4)
-void __thiscall basic_stringstream_char_dtor(basic_ios_char *base)
+static basic_istream_wchar* basic_istream_read_bool(basic_istream_wchar *this, MSVCP_bool *v, const num_get *numget)
 {
-    basic_stringstream_char *this = basic_stringstream_char_from_basic_ios(base);
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    int state = IOSTATE_goodbit;
 
-    TRACE("(%p)\n", this);
+    TRACE("(%p %p)\n", this, v);
+
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        basic_streambuf_wchar *strbuf = basic_ios_wchar_rdbuf_get(base);
+        istreambuf_iterator_wchar first={0}, last={0};
+
+        first.strbuf = strbuf;
+        num_get_wchar_get_bool(numget, &last, first, last, &base->base, &state, v);
+    }
+    basic_istream_wchar_sentry_destroy(this);
 
-    basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(&this->base));
-    basic_stringbuf_char_dtor(&this->strbuf);
+    basic_ios_wchar_setstate(base, state);
+    return this;
 }
 
-/* ??_D?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ??_D?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_vbase_dtor, 4)
-void __thiscall basic_stringstream_char_vbase_dtor(basic_stringstream_char *this)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@AA_N@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@AEA_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_bool, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_bool(basic_istream_wchar *this, MSVCP_bool *v)
 {
-    TRACE("(%p)\n", this);
-
-    basic_stringstream_char_dtor(basic_stringstream_char_to_basic_ios(this));
-    basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base.base1));
+    return basic_istream_read_bool(this, v, num_get_wchar_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_vector_dtor, 8)
-basic_stringstream_char* __thiscall basic_stringstream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@AA_N@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@AEA_N@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_short_read_bool, 8)
+basic_istream_wchar* __thiscall basic_istream_short_read_bool(basic_istream_wchar *this, MSVCP_bool *v)
 {
-    basic_stringstream_char *this = basic_stringstream_char_from_basic_ios(base);
+    return basic_istream_read_bool(this, v, num_get_short_use_facet(
+                basic_istream_wchar_get_basic_ios(this)->strbuf->loc));
+}
 
-    TRACE("(%p %x)\n", this, flags);
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_streambuf, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_streambuf(
+        basic_istream_wchar *this, basic_streambuf_wchar *streambuf)
+{
+    basic_ios_wchar *base = basic_istream_wchar_get_basic_ios(this);
+    IOSB_iostate state = IOSTATE_failbit;
+    unsigned short c = '\n';
 
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
+    TRACE("(%p %p)\n", this, streambuf);
 
-        for(i=*ptr-1; i>=0; i--)
-            basic_stringstream_char_vbase_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        basic_stringstream_char_vbase_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
+    if(basic_istream_wchar_sentry_create(this, FALSE)) {
+        for(c = basic_streambuf_wchar_sgetc(basic_ios_wchar_rdbuf_get(base)); c!=WEOF;
+                c = basic_streambuf_wchar_snextc(basic_ios_wchar_rdbuf_get(base))) {
+            state = IOSTATE_goodbit;
+            if(basic_streambuf_wchar_sputc(streambuf, c) == WEOF)
+                break;
+        }
     }
+    basic_istream_wchar_sentry_destroy(this);
 
+    basic_ios_wchar_setstate(base, state | (c==WEOF ? IOSTATE_eofbit : IOSTATE_goodbit));
     return this;
 }
 
-/* ?rdbuf@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?rdbuf@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEAV?$basic_stringbuf@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_rdbuf, 4)
-basic_stringbuf_char* __thiscall basic_stringstream_char_rdbuf(const basic_stringstream_char *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_stringbuf_char*)&this->strbuf;
-}
-
-/* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-/* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_str_set, 8)
-void __thiscall basic_stringstream_char_str_set(basic_stringstream_char *this, const basic_string_char *str)
-{
-    TRACE("(%p %p)\n", this, str);
-    basic_stringbuf_char_str_set(&this->strbuf, str);
-}
-
-/* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?str@?$basic_stringstream@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_char_str_get, 8)
-basic_string_char* __thiscall basic_stringstream_char_str_get(const basic_stringstream_char *this, basic_string_char *ret)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV01@AAV01@@Z@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV01@AEAV01@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_func(basic_istream_wchar *this,
+        basic_istream_wchar* (__cdecl *pfunc)(basic_istream_wchar*))
 {
-    TRACE("(%p %p)\n", this, ret);
-    return basic_stringbuf_char_str_get(&this->strbuf, ret);
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(this);
+    return this;
 }
 
-static inline basic_ios_wchar* basic_stringstream_wchar_to_basic_ios(basic_stringstream_wchar *ptr)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AAV21@@Z@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@_WU?$char_traits@_W@std@@@1@AEAV21@@Z@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAV?$basic_ios@GU?$char_traits@G@std@@@1@AAV21@@Z@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAV?$basic_ios@GU?$char_traits@G@std@@@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func_basic_ios, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_func_basic_ios(basic_istream_wchar *this,
+        basic_ios_wchar* (__cdecl *pfunc)(basic_ios_wchar*))
 {
-    return (basic_ios_wchar*)((char*)ptr+basic_stringstream_wchar_vbtable1[1]);
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(basic_istream_wchar_get_basic_ios(this));
+    return this;
 }
 
-static inline basic_stringstream_wchar* basic_stringstream_wchar_from_basic_ios(basic_ios_wchar *ptr)
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
+/* ??5?$basic_istream@_WU?$char_traits@_W@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QAEAAV01@P6AAAVios_base@1@AAV21@@Z@Z */
+/* ??5?$basic_istream@GU?$char_traits@G@std@@@std@@QEAAAEAV01@P6AAEAVios_base@1@AEAV21@@Z@Z */
+DEFINE_THISCALL_WRAPPER(basic_istream_wchar_read_func_ios_base, 8)
+basic_istream_wchar* __thiscall basic_istream_wchar_read_func_ios_base(
+        basic_istream_wchar *this, ios_base* (__cdecl *pfunc)(ios_base*))
 {
-    return (basic_stringstream_wchar*)((char*)ptr-basic_stringstream_wchar_vbtable1[1]);
+    TRACE("(%p %p)\n", this, pfunc);
+    pfunc(&basic_istream_wchar_get_basic_ios(this)->base);
+    return this;
 }
 
-/* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-/* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_ctor_str, 16)
-basic_stringstream_wchar* __thiscall basic_stringstream_wchar_ctor_str(basic_stringstream_wchar *this,
-        const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
+static inline basic_ios_char* basic_iostream_char_to_basic_ios(basic_iostream_char *ptr)
 {
-    basic_ios_wchar *basic_ios;
-
-    TRACE("(%p %p %d %d)\n", this, str, mode, virt_init);
-
-    if(virt_init) {
-        this->base.base1.vbtable = basic_stringstream_wchar_vbtable1;
-        this->base.base2.vbtable = basic_stringstream_wchar_vbtable2;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_ctor(basic_ios);
-    }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-    }
-
-    basic_stringbuf_wchar_ctor_str(&this->strbuf, str, mode);
-    basic_iostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_stringstream_wchar_vtable;
-    return this;
+    return (basic_ios_char*)((char*)ptr+basic_iostream_char_vbtable1[1]);
 }
 
-/* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-/* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@1@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_short_ctor_str, 16)
-basic_stringstream_wchar* __thiscall basic_stringstream_short_ctor_str(basic_stringstream_wchar *this,
-        const basic_string_wchar *str, int mode, MSVCP_bool virt_init)
+static inline basic_iostream_char* basic_iostream_char_from_basic_ios(basic_ios_char *ptr)
 {
-    basic_stringstream_wchar_ctor_str(this, str, mode, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_stringstream_short_vtable;
-    return this;
+    return (basic_iostream_char*)((char*)ptr-basic_iostream_char_vbtable1[1]);
 }
 
-/* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@H@Z */
-/* ??0?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_ctor_mode, 12)
-basic_stringstream_wchar* __thiscall basic_stringstream_wchar_ctor_mode(
-        basic_stringstream_wchar *this, int mode, MSVCP_bool virt_init)
+/* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QAE@PAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+/* ??0?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAA@PEAV?$basic_streambuf@DU?$char_traits@D@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_iostream_char_ctor, 12)
+basic_iostream_char* __thiscall basic_iostream_char_ctor(basic_iostream_char *this, basic_streambuf_char *strbuf, MSVCP_bool virt_init)
 {
-    basic_ios_wchar *basic_ios;
+    basic_ios_char *basic_ios;
 
-    TRACE("(%p %d %d)\n", this, mode, virt_init);
+    TRACE("(%p %p %d)\n", this, strbuf, virt_init);
 
     if(virt_init) {
-        this->base.base1.vbtable = basic_stringstream_wchar_vbtable1;
-        this->base.base2.vbtable = basic_stringstream_wchar_vbtable2;
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
-        basic_ios_wchar_ctor(basic_ios);
+        this->base1.vbtable = basic_iostream_char_vbtable1;
+        this->base2.vbtable = basic_iostream_char_vbtable2;
+        basic_ios = basic_istream_char_get_basic_ios(&this->base1);
+        basic_ios_char_ctor(basic_ios);
     }else {
-        basic_ios = basic_istream_wchar_get_basic_ios(&this->base.base1);
+        basic_ios = basic_istream_char_get_basic_ios(&this->base1);
     }
 
-    basic_stringbuf_wchar_ctor_mode(&this->strbuf, mode);
-    basic_iostream_wchar_ctor(&this->base, &this->strbuf.base, FALSE);
-    basic_ios->base.vtable = &MSVCP_basic_stringstream_wchar_vtable;
-    return this;
-}
+    basic_ios->base.vtable = &MSVCP_basic_iostream_char_vtable;
 
-/* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@H@Z */
-/* ??0?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@H@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_short_ctor_mode, 12)
-basic_stringstream_wchar* __thiscall basic_stringstream_short_ctor_mode(
-        basic_stringstream_wchar *this, int mode, MSVCP_bool virt_init)
-{
-    basic_stringstream_wchar_ctor_mode(this, mode, virt_init);
-    basic_istream_wchar_get_basic_ios(&this->base.base1)->base.vtable = &MSVCP_basic_stringstream_short_vtable;
+    basic_istream_char_ctor(&this->base1, strbuf, FALSE, FALSE);
+    basic_ostream_char_ctor_uninitialized(&this->base2, 0, FALSE, FALSE);
     return this;
 }
 
-/* ??_F?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_F?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_ctor, 8)
-basic_stringstream_wchar* __thiscall basic_stringstream_wchar_ctor(
-        basic_stringstream_wchar *this, MSVCP_bool virt_init)
-{
-    return basic_stringstream_wchar_ctor_mode(
-            this, OPENMODE_out|OPENMODE_in, virt_init);
-}
-
-/* ??_F?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_F?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_short_ctor, 8)
-basic_stringstream_wchar* __thiscall basic_stringstream_short_ctor(
-        basic_stringstream_wchar *this, MSVCP_bool virt_init)
-{
-    return basic_stringstream_short_ctor_mode(
-            this, OPENMODE_out|OPENMODE_in, virt_init);
-}
-
-/* ??1?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UAE@XZ */
-/* ??1?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@UEAA@XZ */
-/* ??1?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UAE@XZ */
-/* ??1?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_dtor, 4)
-void __thiscall basic_stringstream_wchar_dtor(basic_ios_wchar *base)
+/* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UAE@XZ */
+/* ??1?$basic_iostream@DU?$char_traits@D@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_iostream_char_dtor, 4)
+void __thiscall basic_iostream_char_dtor(basic_ios_char *base)
 {
-    basic_stringstream_wchar *this = basic_stringstream_wchar_from_basic_ios(base);
+    basic_iostream_char *this = basic_iostream_char_from_basic_ios(base);
 
     TRACE("(%p)\n", this);
-
-    basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(&this->base));
-    basic_stringbuf_wchar_dtor(&this->strbuf);
+    basic_ostream_char_dtor(basic_ostream_char_to_basic_ios(&this->base2));
+    basic_istream_char_dtor(basic_istream_char_to_basic_ios(&this->base1));
 }
 
-/* ??_D?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ??_D?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-/* ??_D?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ??_D?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_vbase_dtor, 4)
-void __thiscall basic_stringstream_wchar_vbase_dtor(basic_stringstream_wchar *this)
+/* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QAEXXZ */
+/* ??_D?$basic_iostream@DU?$char_traits@D@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_iostream_char_vbase_dtor, 4)
+void __thiscall basic_iostream_char_vbase_dtor(basic_iostream_char *this)
 {
     TRACE("(%p)\n", this);
-
-    basic_stringstream_wchar_dtor(basic_stringstream_wchar_to_basic_ios(this));
-    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base.base1));
+    basic_iostream_char_dtor(basic_iostream_char_to_basic_ios(this));
+    basic_ios_char_dtor(basic_istream_char_get_basic_ios(&this->base1));
 }
 
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_vector_dtor, 8)
-basic_stringstream_wchar* __thiscall basic_stringstream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(basic_iostream_char_vector_dtor, 8)
+basic_iostream_char* __thiscall basic_iostream_char_vector_dtor(basic_ios_char *base, unsigned int flags)
 {
-    basic_stringstream_wchar *this = basic_stringstream_wchar_from_basic_ios(base);
+    basic_iostream_char *this = basic_iostream_char_from_basic_ios(base);
 
     TRACE("(%p %x)\n", this, flags);
 
@@ -11850,10 +7816,10 @@ basic_stringstream_wchar* __thiscall basic_stringstream_wchar_vector_dtor(basic_
         INT_PTR i, *ptr = (INT_PTR *)this-1;
 
         for(i=*ptr-1; i>=0; i--)
-            basic_stringstream_wchar_vbase_dtor(this+i);
+            basic_iostream_char_vbase_dtor(this+i);
         MSVCRT_operator_delete(ptr);
     } else {
-        basic_stringstream_wchar_vbase_dtor(this);
+        basic_iostream_char_vbase_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -11861,179 +7827,95 @@ basic_stringstream_wchar* __thiscall basic_stringstream_wchar_vector_dtor(basic_
     return this;
 }
 
-/* ?rdbuf@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?rdbuf@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEAV?$basic_stringbuf@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?rdbuf@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?rdbuf@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEAV?$basic_stringbuf@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_rdbuf, 4)
-basic_stringbuf_wchar* __thiscall basic_stringstream_wchar_rdbuf(const basic_stringstream_wchar *this)
-{
-    TRACE("(%p)\n", this);
-    return (basic_stringbuf_wchar*)&this->strbuf;
-}
-
-/* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXABV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEBV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-/* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEBV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_str_set, 8)
-void __thiscall basic_stringstream_wchar_str_set(basic_stringstream_wchar *this, const basic_string_wchar *str)
+static inline basic_ios_wchar* basic_iostream_wchar_to_basic_ios(basic_iostream_wchar *ptr)
 {
-    TRACE("(%p %p)\n", this, str);
-    basic_stringbuf_wchar_str_set(&this->strbuf, str);
+    return (basic_ios_wchar*)((char*)ptr+basic_iostream_wchar_vbtable1[1]);
 }
 
-/* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_stringstream@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?str@?$basic_stringstream@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_stringstream_wchar_str_get, 8)
-basic_string_wchar* __thiscall basic_stringstream_wchar_str_get(const basic_stringstream_wchar *this, basic_string_wchar *ret)
+static inline basic_iostream_wchar* basic_iostream_wchar_from_basic_ios(basic_ios_wchar *ptr)
 {
-    TRACE("(%p %p)\n", this, ret);
-    return basic_stringbuf_wchar_str_get(&this->strbuf, ret);
+    return (basic_iostream_wchar*)((char*)ptr-basic_iostream_wchar_vbtable1[1]);
 }
 
-/* ?_Init@strstreambuf@std@@IAEXHPAD0H@Z */
-/* ?_Init@strstreambuf@std@@IEAAX_JPEAD1H@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf__Init, 24)
-void __thiscall strstreambuf__Init(strstreambuf *this, streamsize len, char *g, char *p, int mode)
+/* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAE@PAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+/* ??0?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAA@PEAV?$basic_streambuf@_WU?$char_traits@_W@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_ctor, 12)
+basic_iostream_wchar* __thiscall basic_iostream_wchar_ctor(basic_iostream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool virt_init)
 {
-    TRACE("(%p %s %p %p %d)\n", this, wine_dbgstr_longlong(len), g, p, mode);
+    basic_ios_wchar *basic_ios;
 
-    this->minsize = 32;
-    this->endsave = NULL;
-    this->strmode = mode;
-    this->palloc = NULL;
-    this->pfree = NULL;
+    TRACE("(%p %p %d)\n", this, strbuf, virt_init);
 
-    if(!g) {
-        this->strmode |= STRSTATE_Dynamic;
-        if(len > this->minsize)
-            this->minsize = len;
-        this->seekhigh = NULL;
-        return;
+    if(virt_init) {
+        this->base1.vbtable = basic_iostream_wchar_vbtable1;
+        this->base2.vbtable = basic_iostream_wchar_vbtable2;
+        basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
+        basic_ios_wchar_ctor(basic_ios);
+    }else {
+        basic_ios = basic_istream_wchar_get_basic_ios(&this->base1);
     }
 
-    if(len < 0)
-        len = INT_MAX;
-    else if(!len)
-        len = strlen(g);
-
-    this->seekhigh = g+len;
-    basic_streambuf_char_setg(&this->base, g, g, p ? p : this->seekhigh);
-    if(p)
-        basic_streambuf_char_setp(&this->base, p, this->seekhigh);
-}
-
-/* ??0strstreambuf@std@@QAE@PACH0@Z */
-/* ??0strstreambuf@std@@QEAA@PEAC_J0@Z */
-/* ??0strstreambuf@std@@QAE@PADH0@Z */
-/* ??0strstreambuf@std@@QEAA@PEAD_J0@Z */
-/* ??0strstreambuf@std@@QAE@PAEH0@Z */
-/* ??0strstreambuf@std@@QEAA@PEAE_J0@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_ctor_get_put, 20)
-strstreambuf* __thiscall strstreambuf_ctor_get_put(strstreambuf *this, char *g, streamsize len, char *p)
-{
-    TRACE("(%p %p %s %p)\n", this, g, wine_dbgstr_longlong(len), p);
-
-    basic_streambuf_char_ctor(&this->base);
-    this->base.vtable = &MSVCP_strstreambuf_vtable;
-
-    strstreambuf__Init(this, len, g, p, 0);
-    return this;
-}
-
-/* ??0strstreambuf@std@@QAE@H@Z */
-/* ??0strstreambuf@std@@QEAA@_J@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_ctor_len, 12)
-strstreambuf* __thiscall strstreambuf_ctor_len(strstreambuf *this, streamsize len)
-{
-    return strstreambuf_ctor_get_put(this, NULL, len, NULL);
-}
-
-/* ??0strstreambuf@std@@QAE@P6APAXI@ZP6AXPAX@Z@Z */
-/* ??0strstreambuf@std@@QEAA@P6APEAX_K@ZP6AXPEAX@Z@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_ctor_alloc, 12)
-strstreambuf* __thiscall strstreambuf_ctor_alloc(strstreambuf *this, void* (__cdecl *palloc)(MSVCP_size_t), void (__cdecl *pfree)(void*))
-{
-    TRACE("(%p %p %p)\n", this, palloc, pfree);
+    basic_istream_wchar_ctor(&this->base1, strbuf, FALSE, FALSE);
+    basic_ostream_wchar_ctor_uninitialized(&this->base2, 0, FALSE, FALSE);
 
-    strstreambuf_ctor_get_put(this, NULL, 0, NULL);
-    this->palloc = palloc;
-    this->pfree = pfree;
+    basic_ios->base.vtable = &MSVCP_basic_iostream_wchar_vtable;
     return this;
 }
 
-/* ??0strstreambuf@std@@QAE@PBCH@Z */
-/* ??0strstreambuf@std@@QEAA@PEBC_J@Z */
-/* ??0strstreambuf@std@@QAE@PBDH@Z */
-/* ??0strstreambuf@std@@QEAA@PEBD_J@Z */
-/* ??0strstreambuf@std@@QAE@PBEH@Z */
-/* ??0strstreambuf@std@@QEAA@PEBE_J@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_ctor_get, 16)
-strstreambuf* __thiscall strstreambuf_ctor_get(strstreambuf *this, const char *g, streamsize len)
+/* ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QAE@PAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+/* ??0?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAA@PEAV?$basic_streambuf@GU?$char_traits@G@std@@@1@@Z */
+DEFINE_THISCALL_WRAPPER(basic_iostream_short_ctor, 12)
+basic_iostream_wchar* __thiscall basic_iostream_short_ctor(basic_iostream_wchar *this,
+        basic_streambuf_wchar *strbuf, MSVCP_bool virt_init)
 {
-    TRACE("(%p %p %s)\n", this, g, wine_dbgstr_longlong(len));
-
-    strstreambuf_ctor_get_put(this, NULL, 0, NULL);
-    this->strmode |= STRSTATE_Constant;
+    basic_iostream_wchar_ctor(this, strbuf, virt_init);
+    basic_istream_wchar_get_basic_ios(&this->base1)->base.vtable = &MSVCP_basic_iostream_short_vtable;
     return this;
 }
 
-/* ??_Fstrstreambuf@std@@QAEXXZ */
-/* ??_Fstrstreambuf@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(strstreambuf_ctor, 4)
-strstreambuf* __thiscall strstreambuf_ctor(strstreambuf *this)
+/* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UAE@XZ */
+/* ??1?$basic_iostream@_WU?$char_traits@_W@std@@@std@@UEAA@XZ */
+/* ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UAE@XZ */
+/* ??1?$basic_iostream@GU?$char_traits@G@std@@@std@@UEAA@XZ */
+DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_dtor, 4)
+void __thiscall basic_iostream_wchar_dtor(basic_ios_wchar *base)
 {
-    return strstreambuf_ctor_get_put(this, NULL, 0, NULL);
-}
+    basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base);
 
-/* ?_Tidy@strstreambuf@std@@IAEXXZ */
-/* ?_Tidy@strstreambuf@std@@IEAAXXZ */
-DEFINE_THISCALL_WRAPPER(strstreambuf__Tidy, 4)
-void __thiscall strstreambuf__Tidy(strstreambuf *this)
-{
     TRACE("(%p)\n", this);
-
-    if((this->strmode & STRSTATE_Allocated) && !(this->strmode & STRSTATE_Frozen)) {
-        if(this->pfree)
-            this->pfree(basic_streambuf_char_eback(&this->base));
-        else
-            MSVCRT_operator_delete(basic_streambuf_char_eback(&this->base));
-    }
-
-    this->endsave = NULL;
-    this->seekhigh = NULL;
-    this->strmode &= ~(STRSTATE_Allocated | STRSTATE_Frozen);
-    basic_streambuf_char_setg(&this->base, NULL, NULL, NULL);
-    basic_streambuf_char_setp(&this->base, NULL, NULL);
+    basic_ostream_wchar_dtor(basic_ostream_wchar_to_basic_ios(&this->base2));
+    basic_istream_wchar_dtor(basic_istream_wchar_to_basic_ios(&this->base1));
 }
 
-/* ??1strstreambuf@std@@UAE@XZ */
-/* ??1strstreambuf@std@@UEAA@XZ */
-DEFINE_THISCALL_WRAPPER(strstreambuf_dtor, 4)
-void __thiscall strstreambuf_dtor(strstreambuf *this)
+/* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QAEXXZ */
+/* ??_D?$basic_iostream@_WU?$char_traits@_W@std@@@std@@QEAAXXZ */
+/* ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QAEXXZ */
+/* ??_D?$basic_iostream@GU?$char_traits@G@std@@@std@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vbase_dtor, 4)
+void __thiscall basic_iostream_wchar_vbase_dtor(basic_iostream_wchar *this)
 {
     TRACE("(%p)\n", this);
-
-    strstreambuf__Tidy(this);
-    basic_streambuf_char_dtor(&this->base);
+    basic_iostream_wchar_dtor(basic_iostream_wchar_to_basic_ios(this));
+    basic_ios_wchar_dtor(basic_istream_wchar_get_basic_ios(&this->base1));
 }
 
-DEFINE_THISCALL_WRAPPER(strstreambuf_vector_dtor, 8)
-strstreambuf* __thiscall strstreambuf_vector_dtor(strstreambuf *this, unsigned int flags)
+DEFINE_THISCALL_WRAPPER(basic_iostream_wchar_vector_dtor, 8)
+basic_iostream_wchar* __thiscall basic_iostream_wchar_vector_dtor(basic_ios_wchar *base, unsigned int flags)
 {
+    basic_iostream_wchar *this = basic_iostream_wchar_from_basic_ios(base);
+
     TRACE("(%p %x)\n", this, flags);
+
     if(flags & 2) {
         /* we have an array, with the number of elements stored before the first object */
         INT_PTR i, *ptr = (INT_PTR *)this-1;
 
         for(i=*ptr-1; i>=0; i--)
-            strstreambuf_dtor(this+i);
+            basic_iostream_wchar_vbase_dtor(this+i);
         MSVCRT_operator_delete(ptr);
     } else {
-        strstreambuf_dtor(this);
+        basic_iostream_wchar_vbase_dtor(this);
         if(flags & 1)
             MSVCRT_operator_delete(this);
     }
@@ -12041,231 +7923,6 @@ strstreambuf* __thiscall strstreambuf_vector_dtor(strstreambuf *this, unsigned i
     return this;
 }
 
-/* ?freeze@strstreambuf@std@@QAEX_N@Z */
-/* ?freeze@strstreambuf@std@@QEAAX_N@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_freeze, 8)
-void __thiscall strstreambuf_freeze(strstreambuf *this, MSVCP_bool freeze)
-{
-    TRACE("(%p %d)\n", this, freeze);
-
-    if(!freeze == !(this->strmode *STRSTATE_Frozen))
-        return;
-
-    if(freeze) {
-        this->strmode |= STRSTATE_Frozen;
-        this->endsave = basic_streambuf_char_epptr(&this->base);
-        basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base),
-                basic_streambuf_char_pptr(&this->base), basic_streambuf_char_eback(&this->base));
-    }else {
-        this->strmode &= ~STRSTATE_Frozen;
-        basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base),
-                basic_streambuf_char_pptr(&this->base), this->endsave);
-    }
-}
-
-/* ?str@strstreambuf@std@@QAEPADXZ */
-/* ?str@strstreambuf@std@@QEAAPEADXZ */
-DEFINE_THISCALL_WRAPPER(strstreambuf_str, 4)
-char* __thiscall strstreambuf_str(strstreambuf *this)
-{
-    TRACE("(%p)\n", this);
-
-    strstreambuf_freeze(this, TRUE);
-    return basic_streambuf_char_gptr(&this->base);
-}
-
-/* ?pcount@strstreambuf@std@@QBEHXZ */
-/* ?pcount@strstreambuf@std@@QEBA_JXZ */
-DEFINE_THISCALL_WRAPPER(strstreambuf_pcount, 4)
-streamsize __thiscall strstreambuf_pcount(const strstreambuf *this)
-{
-    char *ppos = basic_streambuf_char_pptr(&this->base);
-
-    TRACE("(%p)\n", this);
-
-    return ppos ? ppos-basic_streambuf_char_pbase(&this->base) : 0;
-}
-
-/* ?overflow@strstreambuf@std@@MAEHH@Z */
-/* ?overflow@strstreambuf@std@@MEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_overflow, 8)
-int __thiscall strstreambuf_overflow(strstreambuf *this, int c)
-{
-    MSVCP_size_t old_size, size;
-    char *ptr, *buf;
-
-    TRACE("(%p %d)\n", this, c);
-
-    if(c == EOF)
-        return !EOF;
-
-    if(this->strmode & STRSTATE_Frozen)
-        return EOF;
-
-    ptr = basic_streambuf_char_pptr(&this->base);
-    if(ptr && ptr<basic_streambuf_char_epptr(&this->base))
-        return (unsigned char)(*basic_streambuf_char__Pninc(&this->base) = c);
-
-    if(!(this->strmode & STRSTATE_Dynamic) || (this->strmode & STRSTATE_Constant))
-        return EOF;
-
-    ptr = basic_streambuf_char_eback(&this->base);
-    old_size = ptr ? basic_streambuf_char_epptr(&this->base) - ptr : 0;
-
-    size = old_size + old_size/2;
-    if(size < this->minsize)
-        size = this->minsize;
-
-    if(this->palloc)
-        buf = this->palloc(size);
-    else
-        buf = MSVCRT_operator_new(size);
-    if(!buf)
-        return EOF;
-
-    memcpy(buf, ptr, old_size);
-    if(this->strmode & STRSTATE_Allocated) {
-        if(this->pfree)
-            this->pfree(ptr);
-        else
-            MSVCRT_operator_delete(ptr);
-    }
-
-    this->strmode |= STRSTATE_Allocated;
-    if(!old_size) {
-        this->seekhigh = buf;
-        basic_streambuf_char_setp(&this->base, buf, buf+size);
-        basic_streambuf_char_setg(&this->base, buf, buf, buf);
-    }else {
-        this->seekhigh = this->seekhigh-ptr+buf;
-        basic_streambuf_char_setp_next(&this->base, basic_streambuf_char_pbase(&this->base)-ptr+buf,
-                basic_streambuf_char_pptr(&this->base)-ptr+buf, buf+size);
-        basic_streambuf_char_setg(&this->base, buf, basic_streambuf_char_gptr(&this->base)-ptr+buf,
-                basic_streambuf_char_pptr(&this->base));
-    }
-
-    return (unsigned char)(*basic_streambuf_char__Pninc(&this->base) = c);
-}
-
-/* ?pbackfail@strstreambuf@std@@MAEHH@Z */
-/* ?pbackfail@strstreambuf@std@@MEAAHH@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_pbackfail, 8)
-int __thiscall strstreambuf_pbackfail(strstreambuf *this, int c)
-{
-    char *ptr = basic_streambuf_char_gptr(&this->base);
-
-    TRACE("(%p %d)\n", this, c);
-
-    if(ptr<=basic_streambuf_char_eback(&this->base)
-            || ((this->strmode & STRSTATE_Constant) && c!=ptr[-1]))
-        return EOF;
-
-    basic_streambuf_char_gbump(&this->base, -1);
-    if(c == EOF)
-        return !EOF;
-    if(this->strmode & STRSTATE_Constant)
-        return (unsigned char)c;
-
-    return (unsigned char)(ptr[0] = c);
-}
-
-/* ?seekoff@strstreambuf@std@@MAE?AV?$fpos@H@2@JHH@Z */
-/* ?seekoff@strstreambuf@std@@MEAA?AV?$fpos@H@2@_JHH@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_seekoff, 24)
-fpos_int* __thiscall strstreambuf_seekoff(strstreambuf *this, fpos_int *ret, streamoff off, int way, int mode)
-{
-    char *eback = basic_streambuf_char_eback(&this->base);
-    char *pptr = basic_streambuf_char_pptr(&this->base);
-    char *gptr = basic_streambuf_char_gptr(&this->base);
-
-    TRACE("(%p %p %s %d %d)\n", this, ret, wine_dbgstr_longlong(off), way, mode);
-
-    ret->off = 0;
-    ret->state = 0;
-
-    if(pptr > this->seekhigh)
-        this->seekhigh = pptr;
-
-    if((mode & OPENMODE_in) && gptr) {
-        if(way==SEEKDIR_cur && !(mode & OPENMODE_out))
-            off += gptr-eback;
-        else if(way == SEEKDIR_end)
-            off += this->seekhigh-eback;
-        else if(way != SEEKDIR_beg)
-            off = -1;
-
-        if(off<0 || off>this->seekhigh-eback) {
-            off = -1;
-        }else {
-            basic_streambuf_char_gbump(&this->base, eback-gptr+off);
-            if((mode & OPENMODE_out) && pptr) {
-                basic_streambuf_char_setp_next(&this->base, eback,
-                        gptr, basic_streambuf_char_epptr(&this->base));
-            }
-        }
-    }else if((mode & OPENMODE_out) && pptr) {
-        if(way == SEEKDIR_cur)
-            off += pptr-eback;
-        else if(way == SEEKDIR_end)
-            off += this->seekhigh-eback;
-        else if(way != SEEKDIR_beg)
-            off = -1;
-
-         if(off<0 || off>this->seekhigh-eback)
-             off = -1;
-         else
-             basic_streambuf_char_pbump(&this->base, eback-pptr+off);
-    }else {
-        off = -1;
-    }
-
-    ret->pos = off;
-    return ret;
-}
-
-/* ?seekpos@strstreambuf@std@@MAE?AV?$fpos@H@2@V32@H@Z */
-/* ?seekpos@strstreambuf@std@@MEAA?AV?$fpos@H@2@V32@H@Z */
-DEFINE_THISCALL_WRAPPER(strstreambuf_seekpos, 36)
-fpos_int* __thiscall strstreambuf_seekpos(strstreambuf *this, fpos_int *ret, fpos_int pos, int mode)
-{
-    TRACE("(%p %p %s %d)\n", this, ret, debugstr_fpos_int(&pos), mode);
-
-    if(pos.off==0 && pos.pos==-1 && pos.state==0) {
-        *ret = pos;
-        return ret;
-    }
-
-    return strstreambuf_seekoff(this, ret, pos.off, SEEKDIR_beg, mode);
-}
-
-/* ?underflow@strstreambuf@std@@MAEHXZ */
-/* ?underflow@strstreambuf@std@@MEAAHXZ */
-DEFINE_THISCALL_WRAPPER(strstreambuf_underflow, 4)
-int __thiscall strstreambuf_underflow(strstreambuf *this)
-{
-    char *gptr = basic_streambuf_char_gptr(&this->base);
-    char *pptr;
-
-    TRACE("(%p)\n", this);
-
-    if(!gptr)
-        return EOF;
-
-    if(gptr < basic_streambuf_char_egptr(&this->base))
-        return (unsigned char)(*gptr);
-
-    pptr = basic_streambuf_char_gptr(&this->base);
-    if(pptr > this->seekhigh)
-        this->seekhigh = pptr;
-
-    if(this->seekhigh <= gptr)
-        return EOF;
-
-    basic_streambuf_char_setg(&this->base, basic_streambuf_char_eback(&this->base),
-            gptr, this->seekhigh);
-    return (unsigned char)(*gptr);
-}
-
 static void __cdecl setprecision_func(ios_base *base, streamsize prec)
 {
     ios_base_precision_set(base, prec);
@@ -12486,9 +8143,6 @@ void init_io(void *base)
     init_basic_filebuf_char_rtti(base);
     init_basic_filebuf_wchar_rtti(base);
     init_basic_filebuf_short_rtti(base);
-    init_basic_stringbuf_char_rtti(base);
-    init_basic_stringbuf_wchar_rtti(base);
-    init_basic_stringbuf_short_rtti(base);
     init_basic_ostream_char_rtti(base);
     init_basic_ostream_wchar_rtti(base);
     init_basic_ostream_short_rtti(base);
@@ -12498,25 +8152,6 @@ void init_io(void *base)
     init_basic_iostream_char_rtti(base);
     init_basic_iostream_wchar_rtti(base);
     init_basic_iostream_short_rtti(base);
-    init_basic_ofstream_char_rtti(base);
-    init_basic_ofstream_wchar_rtti(base);
-    init_basic_ofstream_short_rtti(base);
-    init_basic_ifstream_char_rtti(base);
-    init_basic_ifstream_wchar_rtti(base);
-    init_basic_ifstream_short_rtti(base);
-    init_basic_fstream_char_rtti(base);
-    init_basic_fstream_wchar_rtti(base);
-    init_basic_fstream_short_rtti(base);
-    init_basic_ostringstream_char_rtti(base);
-    init_basic_ostringstream_wchar_rtti(base);
-    init_basic_ostringstream_short_rtti(base);
-    init_basic_istringstream_char_rtti(base);
-    init_basic_istringstream_wchar_rtti(base);
-    init_basic_istringstream_short_rtti(base);
-    init_basic_stringstream_char_rtti(base);
-    init_basic_stringstream_wchar_rtti(base);
-    init_basic_stringstream_short_rtti(base);
-    init_strstreambuf_rtti(base);
 #endif
 
     basic_filebuf_char_ctor_file(&filebuf_char_stdin, stdin);
diff --git a/dlls/msvcp100/locale.c b/dlls/msvcp100/locale.c
index ccf62971cba..d1832eabe3a 100644
--- a/dlls/msvcp100/locale.c
+++ b/dlls/msvcp100/locale.c
@@ -41,7 +41,7 @@ char* __cdecl _Getmonths(void);
 void* __cdecl _Gettnames(void);
 unsigned int __cdecl ___lc_codepage_func(void);
 LCID* __cdecl ___lc_handle_func(void);
-const locale_facet* __thiscall locale__Getfacet(const locale*, MSVCP_size_t);
+static const locale_facet* locale__Getfacet(const locale*, MSVCP_size_t);
 
 typedef int category;
 
@@ -207,7 +207,6 @@ typedef struct
 } facets_elem;
 static struct list lazy_facets = LIST_INIT(lazy_facets);
 
-/* Not exported from msvcp90 */
 /* ?facet_Register@facet@locale@std@@CAXPAV123@@Z */
 /* ?facet_Register@facet@locale@std@@CAXPEAV123@@Z */
 static void __cdecl locale_facet_register(locale_facet *add)
@@ -222,16 +221,6 @@ static void __cdecl locale_facet_register(locale_facet *add)
     list_add_head(&lazy_facets, &head->entry);
 }
 
-/* Not exported from msvcp90 */
-/* ?_Register@facet@locale@std@@QAEXXZ */
-/* ?_Register@facet@locale@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(locale_facet__Register, 4)
-void __thiscall locale_facet__Register(locale_facet *this)
-{
-    TRACE("(%p)\n", this);
-    locale_facet_register(this);
-}
-
 /* Not exported from msvcp90 */
 /* ??_7facet@locale@std@@6B@ */
 extern const vtable_ptr MSVCP_locale_facet_vtable;
@@ -439,14 +428,6 @@ _Locinfo* __thiscall _Locinfo_ctor_cat_cstr(_Locinfo *this, int category, const
     return _Locinfo__Locinfo_ctor_cat_cstr(this, category, locstr);
 }
 
-/* ??0_Locinfo@std@@QAE@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
-/* ??0_Locinfo@std@@QEAA@AEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@1@@Z */
-DEFINE_THISCALL_WRAPPER(_Locinfo_ctor_bstr, 8)
-_Locinfo* __thiscall _Locinfo_ctor_bstr(_Locinfo *this, const basic_string_char *locstr)
-{
-    return _Locinfo__Locinfo_ctor_cat_cstr(this, 1/*FIXME*/, MSVCP_basic_string_char_c_str(locstr));
-}
-
 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@PBD@Z */
 /* ?_Locinfo_ctor@_Locinfo@std@@SAXPEAV12@PEBD@Z */
 _Locinfo* __cdecl _Locinfo__Locinfo_ctor_cstr(_Locinfo *locinfo, const char *locstr)
@@ -685,17 +666,6 @@ const struct lconv* __thiscall _Locinfo__Getlconv(const _Locinfo *this)
     return localeconv();
 }
 
-/* ?_Getname@_Locinfo@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?_Getname@_Locinfo@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(_Locinfo__Getname, 8)
-basic_string_char* __thiscall _Locinfo__Getname(const _Locinfo *this, basic_string_char *ret)
-{
-    TRACE("(%p)\n", this);
-
-    MSVCP_basic_string_char_copy_ctor(ret, &this->newlocname);
-    return ret;
-}
-
 /* ?_Gettnames@_Locinfo@std@@QBE?AV_Timevec@2@XZ */
 /* ?_Gettnames@_Locinfo@std@@QEBA?AV_Timevec@2@XZ */
 DEFINE_THISCALL_WRAPPER(_Locinfo__Gettnames, 8)
@@ -713,58 +683,9 @@ locale_id collate_char_id = {0};
 /* ??_7?$collate@D@std@@6B@ */
 extern const vtable_ptr MSVCP_collate_char_vtable;
 
-/* ?_Init@?$collate@D@std@@IAEXABV_Locinfo@2@@Z */
-/* ?_Init@?$collate@D@std@@IEAAXAEBV_Locinfo@2@@Z */
-DEFINE_THISCALL_WRAPPER(collate_char__Init, 8)
-void __thiscall collate_char__Init(collate *this, const _Locinfo *locinfo)
-{
-    TRACE("(%p %p)\n", this, locinfo);
-    _Locinfo__Getcoll(locinfo, &this->coll);
-}
-
-/* ??0?$collate@D@std@@IAE@PBDI@Z */
-/* ??0?$collate@D@std@@IEAA@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_char_ctor_name, 12)
-collate* __thiscall collate_char_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
-{
-    _Locinfo locinfo;
-
-    TRACE("(%p %s %lu)\n", this, name, refs);
-
-    locale_facet_ctor_refs(&this->facet, refs);
-    this->facet.vtable = &MSVCP_collate_char_vtable;
-
-    _Locinfo_ctor_cstr(&locinfo, name);
-    collate_char__Init(this, &locinfo);
-    _Locinfo_dtor(&locinfo);
-    return this;
-}
-
-/* ??0?$collate@D@std@@QAE@ABV_Locinfo@1@I@Z */
-/* ??0?$collate@D@std@@QEAA@AEBV_Locinfo@1@_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_char_ctor_locinfo, 12)
-collate* __thiscall collate_char_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
-{
-    TRACE("(%p %p %lu)\n", this, locinfo, refs);
-
-    locale_facet_ctor_refs(&this->facet, refs);
-    this->facet.vtable = &MSVCP_collate_char_vtable;
-    collate_char__Init(this, locinfo);
-    return this;
-}
-
-/* ??0?$collate@D@std@@QAE@I@Z */
-/* ??0?$collate@D@std@@QEAA@_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_char_ctor_refs, 8)
-collate* __thiscall collate_char_ctor_refs(collate *this, MSVCP_size_t refs)
-{
-    return collate_char_ctor_name(this, "C", refs);
-}
-
 /* ??1?$collate@D@std@@MAE@XZ */
 /* ??1?$collate@D@std@@MEAA@XZ */
-DEFINE_THISCALL_WRAPPER(collate_char_dtor, 4)
-void __thiscall collate_char_dtor(collate *this)
+static void collate_char_dtor(collate *this)
 {
     TRACE("(%p)\n", this);
 }
@@ -789,14 +710,6 @@ collate* __thiscall collate_char_vector_dtor(collate *this, unsigned int flags)
     return this;
 }
 
-/* ??_F?$collate@D@std@@QAEXXZ */
-/* ??_F?$collate@D@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(collate_char_ctor, 4)
-collate* __thiscall collate_char_ctor(collate *this)
-{
-    return collate_char_ctor_name(this, "C", 0);
-}
-
 /* _Strcoll */
 int __cdecl _Strcoll(const char *first1, const char *last1, const char *first2,
         const char *last2, const _Collvec *coll)
@@ -825,16 +738,6 @@ int __thiscall collate_char_do_compare(const collate *this, const char *first1,
     return _Strcoll(first1, last1, first2, last2, &this->coll);
 }
 
-/* ?compare@?$collate@D@std@@QBEHPBD000@Z */
-/* ?compare@?$collate@D@std@@QEBAHPEBD000@Z */
-DEFINE_THISCALL_WRAPPER(collate_char_compare, 20)
-int __thiscall collate_char_compare(const collate *this, const char *first1,
-        const char *last1, const char *first2, const char *last2)
-{
-    TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
-    return call_collate_char_do_compare(this, first1, last1, first2, last2);
-}
-
 /* ?do_hash@?$collate@D@std@@MBEJPBD0@Z */
 /* ?do_hash@?$collate@D@std@@MEBAJPEBD0@Z */
 DEFINE_THISCALL_WRAPPER(collate_char_do_hash, 12)
@@ -852,16 +755,6 @@ LONG __thiscall collate_char_do_hash(const collate *this,
     return ret;
 }
 
-/* ?hash@?$collate@D@std@@QBEJPBD0@Z */
-/* ?hash@?$collate@D@std@@QEBAJPEBD0@Z */
-DEFINE_THISCALL_WRAPPER(collate_char_hash, 12)
-LONG __thiscall collate_char_hash(const collate *this,
-        const char *first, const char *last)
-{
-    TRACE("(%p %p %p)\n", this, first, last);
-    return call_collate_char_do_hash(this, first, last);
-}
-
 /* ?do_transform@?$collate@D@std@@MBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
 /* ?do_transform@?$collate@D@std@@MEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
 DEFINE_THISCALL_WRAPPER(collate_char_do_transform, 16)
@@ -872,16 +765,6 @@ basic_string_char* __thiscall collate_char_do_transform(const collate *this,
     return ret;
 }
 
-/* ?transform@?$collate@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD0@Z */
-/* ?transform@?$collate@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD0@Z */
-DEFINE_THISCALL_WRAPPER(collate_char_transform, 16)
-basic_string_char* __thiscall collate_char_transform(const collate *this,
-        basic_string_char *ret, const char *first, const char *last)
-{
-    FIXME("(%p %p %p) stub\n", this, first, last);
-    return ret;
-}
-
 /* ?id@?$collate@_W@std@@2V0locale@2@A */
 locale_id collate_wchar_id = {0};
 /* ?id@?$collate@G@std@@2V0locale@2@A */
@@ -892,92 +775,11 @@ extern const vtable_ptr MSVCP_collate_wchar_vtable;
 /* ??_7?$collate@G@std@@6B@ */
 extern const vtable_ptr MSVCP_collate_short_vtable;
 
-/* ?_Init@?$collate@_W@std@@IAEXABV_Locinfo@2@@Z */
-/* ?_Init@?$collate@_W@std@@IEAAXAEBV_Locinfo@2@@Z */
-/* ?_Init@?$collate@G@std@@IAEXABV_Locinfo@2@@Z */
-/* ?_Init@?$collate@G@std@@IEAAXAEBV_Locinfo@2@@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar__Init, 8)
-void __thiscall collate_wchar__Init(collate *this, const _Locinfo *locinfo)
-{
-    TRACE("(%p %p)\n", this, locinfo);
-    _Locinfo__Getcoll(locinfo, &this->coll);
-}
-
-/* ??0?$collate@_W@std@@IAE@PBDI@Z */
-/* ??0?$collate@_W@std@@IEAA@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_name, 12)
-collate* __thiscall collate_wchar_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
-{
-    _Locinfo locinfo;
-
-    TRACE("(%p %s %lu)\n", this, name, refs);
-
-    locale_facet_ctor_refs(&this->facet, refs);
-    this->facet.vtable = &MSVCP_collate_wchar_vtable;
-
-    _Locinfo_ctor_cstr(&locinfo, name);
-    collate_wchar__Init(this, &locinfo);
-    _Locinfo_dtor(&locinfo);
-    return this;
-}
-
-/* ??0?$collate@G@std@@IAE@PBDI@Z */
-/* ??0?$collate@G@std@@IEAA@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_short_ctor_name, 12)
-collate* __thiscall collate_short_ctor_name(collate *this, const char *name, MSVCP_size_t refs)
-{
-    collate *ret = collate_wchar_ctor_name(this, name, refs);
-    ret->facet.vtable = &MSVCP_collate_short_vtable;
-    return ret;
-}
-
-/* ??0?$collate@_W@std@@QAE@ABV_Locinfo@1@I@Z */
-/* ??0?$collate@_W@std@@QEAA@AEBV_Locinfo@1@_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_locinfo, 12)
-collate* __thiscall collate_wchar_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
-{
-    TRACE("(%p %p %lu)\n", this, locinfo, refs);
-
-    locale_facet_ctor_refs(&this->facet, refs);
-    this->facet.vtable = &MSVCP_collate_wchar_vtable;
-    collate_wchar__Init(this, locinfo);
-    return this;
-}
-
-/* ??0?$collate@G@std@@QAE@ABV_Locinfo@1@I@Z */
-/* ??0?$collate@G@std@@QEAA@AEBV_Locinfo@1@_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_short_ctor_locinfo, 12)
-collate* __thiscall collate_short_ctor_locinfo(collate *this, _Locinfo *locinfo, MSVCP_size_t refs)
-{
-    collate *ret = collate_wchar_ctor_locinfo(this, locinfo, refs);
-    ret->facet.vtable = &MSVCP_collate_short_vtable;
-    return ret;
-}
-
-/* ??0?$collate@_W@std@@QAE@I@Z */
-/* ??0?$collate@_W@std@@QEAA@_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar_ctor_refs, 8)
-collate* __thiscall collate_wchar_ctor_refs(collate *this, MSVCP_size_t refs)
-{
-    return collate_wchar_ctor_name(this, "C", refs);
-}
-
-/* ??0?$collate@G@std@@QAE@I@Z */
-/* ??0?$collate@G@std@@QEAA@_K@Z */
-DEFINE_THISCALL_WRAPPER(collate_short_ctor_refs, 8)
-collate* __thiscall collate_short_ctor_refs(collate *this, MSVCP_size_t refs)
-{
-    collate *ret = collate_wchar_ctor_refs(this, refs);
-    ret->facet.vtable = &MSVCP_collate_short_vtable;
-    return ret;
-}
-
 /* ??1?$collate@_W@std@@MAE@XZ */
 /* ??1?$collate@_W@std@@MEAA@XZ */
 /* ??1?$collate@G@std@@MAE@XZ */
 /* ??1?$collate@G@std@@MEAA@XZ */
-DEFINE_THISCALL_WRAPPER(collate_wchar_dtor, 4)
-void __thiscall collate_wchar_dtor(collate *this)
+static void collate_wchar_dtor(collate *this)
 {
     TRACE("(%p)\n", this);
 }
@@ -1002,24 +804,6 @@ collate* __thiscall collate_wchar_vector_dtor(collate *this, unsigned int flags)
     return this;
 }
 
-/* ??_F?$collate@_W@std@@QAEXXZ */
-/* ??_F?$collate@_W@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(collate_wchar_ctor, 4)
-collate* __thiscall collate_wchar_ctor(collate *this)
-{
-    return collate_wchar_ctor_name(this, "C", 0);
-}
-
-/* ??_F?$collate@G@std@@QAEXXZ */
-/* ??_F?$collate@G@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(collate_short_ctor, 4)
-collate* __thiscall collate_short_ctor(collate *this)
-{
-    collate *ret = collate_wchar_ctor(this);
-    ret->facet.vtable = &MSVCP_collate_short_vtable;
-    return ret;
-}
-
 /* _Wcscoll */
 int __cdecl _Wcscoll(const wchar_t *first1, const wchar_t *last1, const wchar_t *first2,
         const wchar_t *last2, const _Collvec *coll)
@@ -1050,18 +834,6 @@ int __thiscall collate_wchar_do_compare(const collate *this, const wchar_t *firs
     return _Wcscoll(first1, last1, first2, last2, &this->coll);
 }
 
-/* ?compare@?$collate@_W@std@@QBEHPB_W000@Z */
-/* ?compare@?$collate@_W@std@@QEBAHPEB_W000@Z */
-/* ?compare@?$collate@G@std@@QBEHPBG000@Z */
-/* ?compare@?$collate@G@std@@QEBAHPEBG000@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar_compare, 20)
-int __thiscall collate_wchar_compare(const collate *this, const wchar_t *first1,
-        const wchar_t *last1, const wchar_t *first2, const wchar_t *last2)
-{
-    TRACE("(%p %p %p %p %p)\n", this, first1, last1, first2, last2);
-    return call_collate_wchar_do_compare(this, first1, last1, first2, last2);
-}
-
 /* ?do_hash@?$collate@_W@std@@MBEJPB_W0@Z */
 /* ?do_hash@?$collate@_W@std@@MEBAJPEB_W0@Z */
 /* ?do_hash@?$collate@G@std@@MBEJPBG0@Z */
@@ -1081,18 +853,6 @@ LONG __thiscall collate_wchar_do_hash(const collate *this,
     return ret;
 }
 
-/* ?hash@?$collate@_W@std@@QBEJPB_W0@Z */
-/* ?hash@?$collate@_W@std@@QEBAJPEB_W0@Z */
-/* ?hash@?$collate@G@std@@QBEJPBG0@Z */
-/* ?hash@?$collate@G@std@@QEBAJPEBG0@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar_hash, 12)
-LONG __thiscall collate_wchar_hash(const collate *this,
-        const wchar_t *first, const wchar_t *last)
-{
-    TRACE("(%p %p %p)\n", this, first, last);
-    return call_collate_wchar_do_hash(this, first, last);
-}
-
 /* ?do_transform@?$collate@_W@std@@MBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
 /* ?do_transform@?$collate@_W@std@@MEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
 /* ?do_transform@?$collate@G@std@@MBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
@@ -1105,18 +865,6 @@ basic_string_wchar* __thiscall collate_wchar_do_transform(const collate *this,
     return ret;
 }
 
-/* ?transform@?$collate@_W@std@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W0@Z */
-/* ?transform@?$collate@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W0@Z */
-/* ?transform@?$collate@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG0@Z */
-/* ?transform@?$collate@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG0@Z */
-DEFINE_THISCALL_WRAPPER(collate_wchar_transform, 16)
-basic_string_wchar* __thiscall collate_wchar_transform(const collate *this,
-        basic_string_wchar *ret, const wchar_t *first, const wchar_t *last)
-{
-    FIXME("(%p %p %p) stub\n", this, first, last);
-    return ret;
-}
-
 /* ??_7ctype_base@std@@6B@ */
 extern const vtable_ptr MSVCP_ctype_base_vtable;
 
@@ -1170,12 +918,6 @@ ctype_base* __thiscall ctype_base_vector_dtor(ctype_base *this, unsigned int fla
     return this;
 }
 
-/* ?_Xran@ctype_base@std@@KAXXZ */
-static void __cdecl ctype_base__Xran(void)
-{
-    throw_exception(EXCEPTION_OUT_OF_RANGE, "out of range in ctype<T>");
-}
-
 /* ?id@?$ctype@D@std@@2V0locale@2@A */
 locale_id ctype_char_id = {0};
 /* ?table_size@?$ctype@D@std@@2IB */
@@ -1305,17 +1047,6 @@ const char* __thiscall ctype_char_do_narrow(const ctype_char *this,
     return last;
 }
 
-/* ?_Do_narrow_s@?$ctype@D@std@@MBEPBDPBD0DPADI@Z */
-/* ?_Do_narrow_s@?$ctype@D@std@@MEBAPEBDPEBD0DPEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_char__Do_narrow_s, 24)
-const char* __thiscall ctype_char__Do_narrow_s(const ctype_char *this, const char *first,
-        const char *last, char unused, char *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
-    memcpy_s(dest, size, first, last-first);
-    return last;
-}
-
 /* ?narrow@?$ctype@D@std@@QBEDDD@Z */
 /* ?narrow@?$ctype@D@std@@QEBADDD@Z */
 DEFINE_THISCALL_WRAPPER(ctype_char_narrow_ch, 12)
@@ -1335,16 +1066,6 @@ const char* __thiscall ctype_char_narrow(const ctype_char *this,
     return call_ctype_char_do_narrow(this, first, last, dflt, dest);
 }
 
-/* ?_Narrow_s@?$ctype@D@std@@QBEPBDPBD0DPADI@Z */
-/* ?_Narrow_s@?$ctype@D@std@@QEBAPEBDPEBD0DPEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_char__Narrow_s, 24)
-const char* __thiscall ctype_char__Narrow_s(const ctype_char *this, const char *first,
-        const char *last, char dflt, char *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
-    return ctype_char__Do_narrow_s(this, first, last, dflt, dest, size);
-}
-
 /* ?do_widen@?$ctype@D@std@@MBEDD@Z */
 /* ?do_widen@?$ctype@D@std@@MEBADD@Z */
 DEFINE_THISCALL_WRAPPER(ctype_char_do_widen_ch, 8)
@@ -1370,17 +1091,6 @@ const char* __thiscall ctype_char_do_widen(const ctype_char *this,
     return last;
 }
 
-/* ?_Do_widen_s@?$ctype@D@std@@MBEPBDPBD0PADI@Z */
-/* ?_Do_widen_s@?$ctype@D@std@@MEBAPEBDPEBD0PEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_char__Do_widen_s, 20)
-const char* __thiscall ctype_char__Do_widen_s(const ctype_char *this,
-        const char *first, const char *last, char *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
-    memcpy_s(dest, size, first, last-first);
-    return last;
-}
-
 /* ?widen@?$ctype@D@std@@QBEDD@Z */
 /* ?widen@?$ctype@D@std@@QEBADD@Z */
 DEFINE_THISCALL_WRAPPER(ctype_char_widen_ch, 8)
@@ -1400,16 +1110,6 @@ const char* __thiscall ctype_char_widen(const ctype_char *this,
     return call_ctype_char_do_widen(this, first, last, dest);
 }
 
-/* ?_Widen_s@?$ctype@D@std@@QBEPBDPBD0PADI@Z */
-/* ?_Widen_s@?$ctype@D@std@@QEBAPEBDPEBD0PEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_char__Widen_s, 20)
-const char* __thiscall ctype_char__Widen_s(const ctype_char *this,
-        const char *first, const char *last, char *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
-    return ctype_char__Do_widen_s(this, first, last, dest, size);
-}
-
 /* ?_Getcat@?$ctype@D@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
 /* ?_Getcat@?$ctype@D@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
 MSVCP_size_t __cdecl ctype_char__Getcat(const locale_facet **facet, const locale *loc)
@@ -1679,15 +1379,6 @@ const char* __thiscall ctype_char_scan_not(const ctype_char *this, short mask, c
     return first;
 }
 
-/* ?table@?$ctype@D@std@@IBEPBFXZ */
-/* ?table@?$ctype@D@std@@IEBAPEBFXZ */
-DEFINE_THISCALL_WRAPPER(ctype_char_table, 4)
-const short* __thiscall ctype_char_table(const ctype_char *this)
-{
-    TRACE("(%p)\n", this);
-    return this->ctype.table;
-}
-
 /* ?id@?$ctype@_W@std@@2V0locale@2@A */
 locale_id ctype_wchar_id = {0};
 /* ?id@?$ctype@G@std@@2V0locale@2@A */
@@ -1762,25 +1453,6 @@ ctype_wchar* __thiscall ctype_short_ctor_refs(ctype_wchar *this, MSVCP_size_t re
     return ret;
 }
 
-/* ??0?$ctype@G@std@@IAE@PBDI@Z */
-/* ??0?$ctype@G@std@@IEAA@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_short_ctor_name, 12)
-ctype_wchar* __thiscall ctype_short_ctor_name(ctype_wchar *this,
-    const char *name, MSVCP_size_t refs)
-{
-    _Locinfo locinfo;
-
-    TRACE("(%p %s %lu)\n", this, debugstr_a(name), refs);
-
-    ctype_base_ctor_refs(&this->base, refs);
-    this->base.facet.vtable = &MSVCP_ctype_short_vtable;
-
-    _Locinfo_ctor_cstr(&locinfo, name);
-    ctype_wchar__Init(this, &locinfo);
-    _Locinfo_dtor(&locinfo);
-    return this;
-}
-
 /* ??_F?$ctype@_W@std@@QAEXXZ */
 /* ??_F?$ctype@_W@std@@QEAAXXZ */
 DEFINE_THISCALL_WRAPPER(ctype_wchar_ctor, 4)
@@ -1907,22 +1579,6 @@ const wchar_t* __thiscall ctype_wchar_do_narrow(const ctype_wchar *this,
     return last;
 }
 
-/* ?_Do_narrow_s@?$ctype@_W@std@@MBEPB_WPB_W0DPADI@Z */
-/* ?_Do_narrow_s@?$ctype@_W@std@@MEBAPEB_WPEB_W0DPEAD_K@Z */
-/* ?_Do_narrow_s@?$ctype@G@std@@MBEPBGPBG0DPADI@Z */
-/* ?_Do_narrow_s@?$ctype@G@std@@MEBAPEBGPEBG0DPEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_narrow_s, 24)
-const wchar_t* __thiscall ctype_wchar__Do_narrow_s(const ctype_wchar *this,
-        const wchar_t *first, const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
-    /* This function converts all multi-byte characters to dflt,
-     * thanks to it result size is known before converting */
-    if(last-first > size)
-        ctype_base__Xran();
-    return ctype_wchar_do_narrow(this, first, last, dflt, dest);
-}
-
 /* ?narrow@?$ctype@_W@std@@QBED_WD@Z */
 /* ?narrow@?$ctype@_W@std@@QEBAD_WD@Z */
 /* ?narrow@?$ctype@G@std@@QBEDGD@Z */
@@ -1946,18 +1602,6 @@ const wchar_t* __thiscall ctype_wchar_narrow(const ctype_wchar *this,
     return call_ctype_wchar_do_narrow(this, first, last, dflt, dest);
 }
 
-/* ?_Narrow_s@?$ctype@_W@std@@QBEPB_WPB_W0DPADI@Z */
-/* ?_Narrow_s@?$ctype@_W@std@@QEBAPEB_WPEB_W0DPEAD_K@Z */
-/* ?_Narrow_s@?$ctype@G@std@@QBEPBGPBG0DPADI@Z */
-/* ?_Narrow_s@?$ctype@G@std@@QEBAPEBGPEBG0DPEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_wchar__Narrow_s, 24)
-const wchar_t* __thiscall ctype_wchar__Narrow_s(const ctype_wchar *this, const wchar_t *first,
-        const wchar_t *last, char dflt, char *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %d %p %lu)\n", this, first, last, dflt, dest, size);
-    return ctype_wchar__Do_narrow_s(this, first, last, dflt, dest, size);
-}
-
 /* _Mbrtowc */
 int __cdecl _Mbrtowc(wchar_t *out, const char *in, MSVCP_size_t len, int *state, const _Cvtvec *cvt)
 {
@@ -2069,22 +1713,6 @@ const char* __thiscall ctype_wchar_do_widen(const ctype_wchar *this,
     return last;
 }
 
-/* ?_Do_widen_s@?$ctype@_W@std@@MBEPBDPBD0PA_WI@Z */
-/* ?_Do_widen_s@?$ctype@_W@std@@MEBAPEBDPEBD0PEA_W_K@Z */
-/* ?_Do_widen_s@?$ctype@G@std@@MBEPBDPBD0PAGI@Z */
-/* ?_Do_widen_s@?$ctype@G@std@@MEBAPEBDPEBD0PEAG_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_wchar__Do_widen_s, 20)
-const char* __thiscall ctype_wchar__Do_widen_s(const ctype_wchar *this,
-        const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
-    /* This function converts all multi-byte characters to WEOF,
-     * thanks to it result size is known before converting */
-    if(size < last-first)
-        ctype_base__Xran();
-    return ctype_wchar_do_widen(this, first, last, dest);
-}
-
 /* ?widen@?$ctype@_W@std@@QBE_WD@Z */
 /* ?widen@?$ctype@_W@std@@QEBA_WD@Z */
 /* ?widen@?$ctype@G@std@@QBEGD@Z */
@@ -2108,18 +1736,6 @@ const char* __thiscall ctype_wchar_widen(const ctype_wchar *this,
     return call_ctype_wchar_do_widen(this, first, last, dest);
 }
 
-/* ?_Widen_s@?$ctype@_W@std@@QBEPBDPBD0PA_WI@Z */
-/* ?_Widen_s@?$ctype@_W@std@@QEBAPEBDPEBD0PEA_W_K@Z */
-/* ?_Widen_s@?$ctype@G@std@@QBEPBDPBD0PAGI@Z */
-/* ?_Widen_s@?$ctype@G@std@@QEBAPEBDPEBD0PEAG_K@Z */
-DEFINE_THISCALL_WRAPPER(ctype_wchar__Widen_s, 20)
-const char* __thiscall ctype_wchar__Widen_s(const ctype_wchar *this,
-        const char *first, const char *last, wchar_t *dest, MSVCP_size_t size)
-{
-    TRACE("(%p %p %p %p %lu)\n", this, first, last, dest, size);
-    return ctype_wchar__Do_widen_s(this, first, last, dest, size);
-}
-
 /* ?_Getcat@?$ctype@_W@std@@SAIPAPBVfacet@locale@2@PBV42@@Z */
 /* ?_Getcat@?$ctype@_W@std@@SA_KPEAPEBVfacet@locale@2@PEBV42@@Z */
 MSVCP_size_t __cdecl ctype_wchar__Getcat(const locale_facet **facet, const locale *loc)
@@ -2871,21 +2487,6 @@ codecvt_wchar* __thiscall codecvt_short_ctor_refs(codecvt_wchar *this, MSVCP_siz
     return this;
 }
 
-/* ??0?$codecvt@GDH@std@@IAE@PBDI@Z */
-/* ??0?$codecvt@GDH@std@@IEAA@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(codecvt_short_ctor_name, 12)
-codecvt_wchar* __thiscall codecvt_short_ctor_name(codecvt_wchar *this, const char *name, MSVCP_size_t refs)
-{
-    _Locinfo locinfo;
-
-    TRACE("(%p %s %ld)\n", this, name, refs);
-
-    _Locinfo_ctor_cstr(&locinfo, name);
-    codecvt_short_ctor_locinfo(this, &locinfo, refs);
-    _Locinfo_dtor(&locinfo);
-    return this;
-}
-
 /* ??_F?$codecvt@_WDH@std@@QAEXXZ */
 /* ??_F?$codecvt@_WDH@std@@QEAAXXZ */
 DEFINE_THISCALL_WRAPPER(codecvt_wchar_ctor, 4)
@@ -3251,8 +2852,7 @@ extern const vtable_ptr MSVCP_numpunct_char_vtable;
 
 /* ?_Init@?$numpunct@D@std@@IAEXABV_Locinfo@2@_N@Z */
 /* ?_Init@?$numpunct@D@std@@IEAAXAEBV_Locinfo@2@_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_char__Init, 12)
-void __thiscall numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo, MSVCP_bool isdef)
+static void numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo, MSVCP_bool isdef)
 {
     int len;
 
@@ -3299,8 +2899,7 @@ void __thiscall numpunct_char__Init(numpunct_char *this, const _Locinfo *locinfo
 
 /* ?_Tidy@?$numpunct@D@std@@AAEXXZ */
 /* ?_Tidy@?$numpunct@D@std@@AEAAXXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char__Tidy, 4)
-void __thiscall numpunct_char__Tidy(numpunct_char *this)
+static void numpunct_char__Tidy(numpunct_char *this)
 {
     TRACE("(%p)\n", this);
 
@@ -3311,8 +2910,7 @@ void __thiscall numpunct_char__Tidy(numpunct_char *this)
 
 /* ??0?$numpunct@D@std@@QAE@ABV_Locinfo@1@I_N@Z */
 /* ??0?$numpunct@D@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_locinfo, 16)
-numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
+static numpunct_char* numpunct_char_ctor_locinfo(numpunct_char *this,
         const _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
 {
     TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
@@ -3324,8 +2922,7 @@ numpunct_char* __thiscall numpunct_char_ctor_locinfo(numpunct_char *this,
 
 /* ??0?$numpunct@D@std@@IAE@PBDI_N@Z */
 /* ??0?$numpunct@D@std@@IEAA@PEBD_K_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_name, 16)
-numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
+static numpunct_char* numpunct_char_ctor_name(numpunct_char *this,
         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
 {
     _Locinfo locinfo;
@@ -3340,27 +2937,9 @@ numpunct_char* __thiscall numpunct_char_ctor_name(numpunct_char *this,
     return this;
 }
 
-/* ??0?$numpunct@D@std@@QAE@I@Z */
-/* ??0?$numpunct@D@std@@QEAA@_K@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_char_ctor_refs, 8)
-numpunct_char* __thiscall numpunct_char_ctor_refs(numpunct_char *this, MSVCP_size_t refs)
-{
-    TRACE("(%p %lu)\n", this, refs);
-    return numpunct_char_ctor_name(this, "C", refs, FALSE);
-}
-
-/* ??_F?$numpunct@D@std@@QAEXXZ */
-/* ??_F?$numpunct@D@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_ctor, 4)
-numpunct_char* __thiscall numpunct_char_ctor(numpunct_char *this)
-{
-    return numpunct_char_ctor_refs(this, 0);
-}
-
 /* ??1?$numpunct@D@std@@MAE@XZ */
 /* ??1?$numpunct@D@std@@MEAA@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_dtor, 4)
-void __thiscall numpunct_char_dtor(numpunct_char *this)
+static void numpunct_char_dtor(numpunct_char *this)
 {
     TRACE("(%p)\n", this);
     numpunct_char__Tidy(this);
@@ -3447,8 +3026,7 @@ char __thiscall numpunct_char_do_decimal_point(const numpunct_char *this)
 
 /* ?decimal_point@?$numpunct@D@std@@QBEDXZ */
 /* ?decimal_point@?$numpunct@D@std@@QEBADXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_decimal_point, 4)
-char __thiscall numpunct_char_decimal_point(const numpunct_char *this)
+static char numpunct_char_decimal_point(const numpunct_char *this)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_char_do_decimal_point(this);
@@ -3467,8 +3045,7 @@ char __thiscall numpunct_char_do_thousands_sep(const numpunct_char *this)
 
 /* ?thousands_sep@?$numpunct@D@std@@QBEDXZ */
 /* ?thousands_sep@?$numpunct@D@std@@QEBADXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_thousands_sep, 4)
-char __thiscall numpunct_char_thousands_sep(const numpunct_char *this)
+static char numpunct_char_thousands_sep(const numpunct_char *this)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_char_do_thousands_sep(this);
@@ -3488,8 +3065,7 @@ basic_string_char* __thiscall numpunct_char_do_grouping(
 
 /* ?grouping@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
 /* ?grouping@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_grouping, 8)
-basic_string_char* __thiscall numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
+static basic_string_char* numpunct_char_grouping(const numpunct_char *this, basic_string_char *ret)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_char_do_grouping(this, ret);
@@ -3509,8 +3085,7 @@ basic_string_char* __thiscall numpunct_char_do_falsename(
 
 /* ?falsename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
 /* ?falsename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_falsename, 8)
-basic_string_char* __thiscall numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
+static basic_string_char* numpunct_char_falsename(const numpunct_char *this, basic_string_char *ret)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_char_do_falsename(this, ret);
@@ -3530,8 +3105,7 @@ basic_string_char* __thiscall numpunct_char_do_truename(
 
 /* ?truename@?$numpunct@D@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
 /* ?truename@?$numpunct@D@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_char_truename, 8)
-basic_string_char* __thiscall numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
+static basic_string_char* numpunct_char_truename(const numpunct_char *this, basic_string_char *ret)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_char_do_truename(this, ret);
@@ -3551,8 +3125,7 @@ extern const vtable_ptr MSVCP_numpunct_short_vtable;
 /* ?_Init@?$numpunct@_W@std@@IEAAXAEBV_Locinfo@2@_N@Z */
 /* ?_Init@?$numpunct@G@std@@IAEXABV_Locinfo@2@_N@Z */
 /* ?_Init@?$numpunct@G@std@@IEAAXAEBV_Locinfo@2@_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar__Init, 12)
-void __thiscall numpunct_wchar__Init(numpunct_wchar *this,
+static void numpunct_wchar__Init(numpunct_wchar *this,
         const _Locinfo *locinfo, MSVCP_bool isdef)
 {
     const char *to_convert;
@@ -3610,8 +3183,7 @@ void __thiscall numpunct_wchar__Init(numpunct_wchar *this,
 /* ?_Tidy@?$numpunct@_W@std@@AEAAXXZ */
 /* ?_Tidy@?$numpunct@G@std@@AAEXXZ */
 /* ?_Tidy@?$numpunct@G@std@@AEAAXXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar__Tidy, 4)
-void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
+static void numpunct_wchar__Tidy(numpunct_wchar *this)
 {
     TRACE("(%p)\n", this);
 
@@ -3622,8 +3194,7 @@ void __thiscall numpunct_wchar__Tidy(numpunct_wchar *this)
 
 /* ??0?$numpunct@_W@std@@QAE@ABV_Locinfo@1@I_N@Z */
 /* ??0?$numpunct@_W@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_locinfo, 16)
-numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
+static numpunct_wchar* numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
         const _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
 {
     TRACE("(%p %p %lu %d)\n", this, locinfo, refs, usedef);
@@ -3635,8 +3206,7 @@ numpunct_wchar* __thiscall numpunct_wchar_ctor_locinfo(numpunct_wchar *this,
 
 /* ??0?$numpunct@G@std@@QAE@ABV_Locinfo@1@I_N@Z */
 /* ??0?$numpunct@G@std@@QEAA@AEBV_Locinfo@1@_K_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_locinfo, 16)
-numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
+static numpunct_wchar* numpunct_short_ctor_locinfo(numpunct_wchar *this,
         const _Locinfo *locinfo, MSVCP_size_t refs, MSVCP_bool usedef)
 {
     numpunct_wchar_ctor_locinfo(this, locinfo, refs, usedef);
@@ -3646,8 +3216,7 @@ numpunct_wchar* __thiscall numpunct_short_ctor_locinfo(numpunct_wchar *this,
 
 /* ??0?$numpunct@_W@std@@IAE@PBDI_N@Z */
 /* ??0?$numpunct@_W@std@@IEAA@PEBD_K_N@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_name, 16)
-numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
+static numpunct_wchar* numpunct_wchar_ctor_name(numpunct_wchar *this,
         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
 {
     _Locinfo locinfo;
@@ -3664,8 +3233,7 @@ numpunct_wchar* __thiscall numpunct_wchar_ctor_name(numpunct_wchar *this,
 
 /* ??0?$numpunct@G@std@@IAE@PBDI_N@Z */
 /* ??0?$numpunct@G@std@@IEAA@PEBD_K_N@Z */
-    DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_name, 16)
-numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
+static numpunct_wchar* numpunct_short_ctor_name(numpunct_wchar *this,
         const char *name, MSVCP_size_t refs, MSVCP_bool usedef)
 {
     numpunct_wchar_ctor_name(this, name, refs, usedef);
@@ -3673,47 +3241,11 @@ numpunct_wchar* __thiscall numpunct_short_ctor_name(numpunct_wchar *this,
     return this;
 }
 
-/* ??0?$numpunct@_W@std@@QAE@I@Z */
-/* ??0?$numpunct@_W@std@@QEAA@_K@Z */
-    DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor_refs, 8)
-numpunct_wchar* __thiscall numpunct_wchar_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
-{
-    TRACE("(%p %lu)\n", this, refs);
-    return numpunct_wchar_ctor_name(this, "C", refs, FALSE);
-}
-
-/* ??0?$numpunct@G@std@@QAE@I@Z */
-/* ??0?$numpunct@G@std@@QEAA@_K@Z */
-DEFINE_THISCALL_WRAPPER(numpunct_short_ctor_refs, 8)
-numpunct_wchar* __thiscall numpunct_short_ctor_refs(numpunct_wchar *this, MSVCP_size_t refs)
-{
-    numpunct_wchar_ctor_refs(this, refs);
-    this->facet.vtable = &MSVCP_numpunct_short_vtable;
-    return this;
-}
-
-/* ??_F?$numpunct@_W@std@@QAEXXZ */
-/* ??_F?$numpunct@_W@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_ctor, 4)
-numpunct_wchar* __thiscall numpunct_wchar_ctor(numpunct_wchar *this)
-{
-    return numpunct_wchar_ctor_refs(this, 0);
-}
-
-/* ??_F?$numpunct@G@std@@QAEXXZ */
-/* ??_F?$numpunct@G@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_short_ctor, 4)
-numpunct_wchar* __thiscall numpunct_short_ctor(numpunct_wchar *this)
-{
-    return numpunct_short_ctor_refs(this, 0);
-}
-
 /* ??1?$numpunct@_W@std@@MAE@XZ */
 /* ??1?$numpunct@_W@std@@MEAA@XZ */
 /* ??1?$numpunct@G@std@@MAE@XZ */
 /* ??1?$numpunct@G@std@@MEAA@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_dtor, 4)
-void __thiscall numpunct_wchar_dtor(numpunct_wchar *this)
+static void numpunct_wchar_dtor(numpunct_wchar *this)
 {
     TRACE("(%p)\n", this);
     numpunct_wchar__Tidy(this);
@@ -3852,8 +3384,7 @@ wchar_t __thiscall numpunct_wchar_do_decimal_point(const numpunct_wchar *this)
 /* ?decimal_point@?$numpunct@_W@std@@QEBA_WXZ */
 /* ?decimal_point@?$numpunct@G@std@@QBEGXZ */
 /* ?decimal_point@?$numpunct@G@std@@QEBAGXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_decimal_point, 4)
-wchar_t __thiscall numpunct_wchar_decimal_point(const numpunct_wchar *this)
+static wchar_t numpunct_wchar_decimal_point(const numpunct_wchar *this)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_wchar_do_decimal_point(this);
@@ -3876,8 +3407,7 @@ wchar_t __thiscall numpunct_wchar_do_thousands_sep(const numpunct_wchar *this)
 /* ?thousands_sep@?$numpunct@_W@std@@QEBA_WXZ */
 /* ?thousands_sep@?$numpunct@G@std@@QBEGXZ */
 /* ?thousands_sep@?$numpunct@G@std@@QEBAGXZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_thousands_sep, 4)
-wchar_t __thiscall numpunct_wchar_thousands_sep(const numpunct_wchar *this)
+static wchar_t numpunct_wchar_thousands_sep(const numpunct_wchar *this)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_wchar_do_thousands_sep(this);
@@ -3900,8 +3430,7 @@ basic_string_char* __thiscall numpunct_wchar_do_grouping(const numpunct_wchar *t
 /* ?grouping@?$numpunct@_W@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
 /* ?grouping@?$numpunct@G@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
 /* ?grouping@?$numpunct@G@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_grouping, 8)
-basic_string_char* __thiscall numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
+static basic_string_char* numpunct_wchar_grouping(const numpunct_wchar *this, basic_string_char *ret)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_wchar_do_grouping(this, ret);
@@ -3924,8 +3453,7 @@ basic_string_wchar* __thiscall numpunct_wchar_do_falsename(const numpunct_wchar
 /* ?falsename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
 /* ?falsename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
 /* ?falsename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_falsename, 8)
-basic_string_wchar* __thiscall numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
+static basic_string_wchar* numpunct_wchar_falsename(const numpunct_wchar *this, basic_string_wchar *ret)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_wchar_do_falsename(this, ret);
@@ -3948,8 +3476,7 @@ basic_string_wchar* __thiscall numpunct_wchar_do_truename(const numpunct_wchar *
 /* ?truename@?$numpunct@_W@std@@QEBA?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
 /* ?truename@?$numpunct@G@std@@QBE?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
 /* ?truename@?$numpunct@G@std@@QEBA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(numpunct_wchar_truename, 8)
-basic_string_wchar* __thiscall numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
+static basic_string_wchar* numpunct_wchar_truename(const numpunct_wchar *this, basic_string_wchar *ret)
 {
     TRACE("(%p)\n", this);
     return call_numpunct_wchar_do_truename(this, ret);
@@ -8055,8 +7582,7 @@ const vtable_ptr MSVCP_locale__Locimp_vtable[] = {
 
 /* ??0locale@std@@AAE@PAV_Locimp@01@@Z */
 /* ??0locale@std@@AEAA@PEAV_Locimp@01@@Z */
-DEFINE_THISCALL_WRAPPER(locale_ctor_locimp, 8)
-locale* __thiscall locale_ctor_locimp(locale *this, locale__Locimp *locimp)
+static locale* locale_ctor_locimp(locale *this, locale__Locimp *locimp)
 {
     TRACE("(%p %p)\n", this, locimp);
     /* Don't change locimp reference counter */
@@ -8099,34 +7625,9 @@ locale__Locimp* __cdecl locale__Init(void)
     return global_locale;
 }
 
-/* ??0locale@std@@QAE@ABV01@0H@Z */
-/* ??0locale@std@@QEAA@AEBV01@0H@Z */
-DEFINE_THISCALL_WRAPPER(locale_ctor_locale_locale, 16)
-locale* __thiscall locale_ctor_locale_locale(locale *this, const locale *loc, const locale *other, category cat)
-{
-    _Locinfo locinfo;
-
-    TRACE("(%p %p %p %d)\n", this, loc, other, cat);
-
-    this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
-    if(!this->ptr) {
-        ERR("Out of memory\n");
-        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
-    }
-    locale__Locimp_copy_ctor(this->ptr, loc->ptr);
-
-    _Locinfo_ctor_cat_cstr(&locinfo, loc->ptr->catmask, MSVCP_basic_string_char_c_str(&loc->ptr->name));
-    _Locinfo__Addcats(&locinfo, cat & other->ptr->catmask, MSVCP_basic_string_char_c_str(&other->ptr->name));
-    locale__Locimp__Makeloc(&locinfo, cat, this->ptr, other);
-    _Locinfo_dtor(&locinfo);
-
-    return this;
-}
-
 /* ??0locale@std@@QAE@ABV01@@Z */
 /* ??0locale@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(locale_copy_ctor, 8)
-locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
+locale* locale_copy_ctor(locale *this, const locale *copy)
 {
     TRACE("(%p %p)\n", this, copy);
     this->ptr = copy->ptr;
@@ -8134,60 +7635,9 @@ locale* __thiscall locale_copy_ctor(locale *this, const locale *copy)
     return this;
 }
 
-/* ??0locale@std@@QAE@ABV01@PBDH@Z */
-/* ??0locale@std@@QEAA@AEBV01@PEBDH@Z */
-DEFINE_THISCALL_WRAPPER(locale_ctor_locale_cstr, 16)
-locale* __thiscall locale_ctor_locale_cstr(locale *this, const locale *loc, const char *locname, category cat)
-{
-    FIXME("(%p %p %s %d) stub\n", this, loc, locname, cat);
-    return NULL;
-}
-
-/* ??0locale@std@@QAE@PBDH@Z */
-/* ??0locale@std@@QEAA@PEBDH@Z */
-DEFINE_THISCALL_WRAPPER(locale_ctor_cstr, 12)
-locale* __thiscall locale_ctor_cstr(locale *this, const char *locname, category cat)
-{
-    _Locinfo locinfo;
-
-    TRACE("(%p %s %d)\n", this, locname, cat);
-
-    this->ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
-    if(!this->ptr) {
-        ERR("Out of memory\n");
-        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
-    }
-    locale__Locimp_ctor(this->ptr);
-
-    locale__Init();
-
-    _Locinfo_ctor_cat_cstr(&locinfo, cat, locname);
-    if(!memcmp(MSVCP_basic_string_char_c_str(&locinfo.newlocname), "*", 2)) {
-        _Locinfo_dtor(&locinfo);
-        MSVCRT_operator_delete(this->ptr);
-        throw_exception(EXCEPTION_RUNTIME_ERROR, "bad locale name");
-    }
-
-    locale__Locimp__Makeloc(&locinfo, cat, this->ptr, NULL);
-    _Locinfo_dtor(&locinfo);
-
-    return this;
-}
-
-/* ??0locale@std@@QAE@W4_Uninitialized@1@@Z */
-/* ??0locale@std@@QEAA@W4_Uninitialized@1@@Z */
-DEFINE_THISCALL_WRAPPER(locale_ctor_uninitialized, 8)
-locale* __thiscall locale_ctor_uninitialized(locale *this, int uninitialized)
-{
-    TRACE("(%p)\n", this);
-    this->ptr = NULL;
-    return this;
-}
-
 /* ??0locale@std@@QAE@XZ */
 /* ??0locale@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(locale_ctor, 4)
-locale* __thiscall locale_ctor(locale *this)
+locale* locale_ctor(locale *this)
 {
     TRACE("(%p)\n", this);
     this->ptr = locale__Init();
@@ -8197,93 +7647,24 @@ locale* __thiscall locale_ctor(locale *this)
 
 /* ??1locale@std@@QAE@XZ */
 /* ??1locale@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(locale_dtor, 4)
-void __thiscall locale_dtor(locale *this)
+void locale_dtor(locale *this)
 {
     TRACE("(%p)\n", this);
     if(this->ptr)
         locale__Locimp_dtor(this->ptr);
 }
 
-DEFINE_THISCALL_WRAPPER(locale_vector_dtor, 8)
-locale* __thiscall locale_vector_dtor(locale *this, unsigned int flags)
-{
-    TRACE("(%p %x)\n", this, flags);
-    if(flags & 2) {
-        /* we have an array, with the number of elements stored before the first object */
-        INT_PTR i, *ptr = (INT_PTR *)this-1;
-
-        for(i=*ptr-1; i>=0; i--)
-            locale_dtor(this+i);
-        MSVCRT_operator_delete(ptr);
-    } else {
-        locale_dtor(this);
-        if(flags & 1)
-            MSVCRT_operator_delete(this);
-    }
-
-    return this;
-}
-
 /* ??4locale@std@@QAEAAV01@ABV01@@Z */
 /* ??4locale@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(locale_operator_assign, 8)
-locale* __thiscall locale_operator_assign(locale *this, const locale *loc)
+locale* locale_operator_assign(locale *this, const locale *loc)
 {
     FIXME("(%p %p) stub\n", this, loc);
     return NULL;
 }
 
-/* ??8locale@std@@QBE_NABV01@@Z */
-/* ??8locale@std@@QEBA_NAEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(locale_operator_equal, 8)
-MSVCP_bool __thiscall locale_operator_equal(const locale *this, const locale *loc)
-{
-    FIXME("(%p %p) stub\n", this, loc);
-    return 0;
-}
-
-/* ??9locale@std@@QBE_NABV01@@Z */
-/* ??9locale@std@@QEBA_NAEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(locale_operator_not_equal, 8)
-MSVCP_bool __thiscall locale_operator_not_equal(const locale *this, locale const *loc)
-{
-    FIXME("(%p %p) stub\n", this, loc);
-    return 0;
-}
-
-/* ?_Addfac@locale@std@@QAEAAV12@PAVfacet@12@II@Z */
-/* ?_Addfac@locale@std@@QEAAAEAV12@PEAVfacet@12@_K1@Z */
-DEFINE_THISCALL_WRAPPER(locale__Addfac, 16)
-locale* __thiscall locale__Addfac(locale *this, locale_facet *facet, MSVCP_size_t id, MSVCP_size_t catmask)
-{
-    TRACE("(%p %p %lu %lu)\n", this, facet, id, catmask);
-
-    if(this->ptr->facet.refs > 1) {
-        locale__Locimp *new_ptr = MSVCRT_operator_new(sizeof(locale__Locimp));
-        if(!new_ptr) {
-            ERR("Out of memory\n");
-            throw_exception(EXCEPTION_BAD_ALLOC, NULL);
-            return NULL;
-        }
-        locale__Locimp_copy_ctor(new_ptr, this->ptr);
-        locale_facet__Decref(&this->ptr->facet);
-        this->ptr = new_ptr;
-    }
-
-    locale__Locimp__Addfac(this->ptr, facet, id);
-
-    if(catmask) {
-        MSVCP_basic_string_char_dtor(&this->ptr->name);
-        MSVCP_basic_string_char_ctor_cstr(&this->ptr->name, "*");
-    }
-    return this;
-}
-
 /* ?_Getfacet@locale@std@@QBEPBVfacet@12@I@Z */
 /* ?_Getfacet@locale@std@@QEBAPEBVfacet@12@_K@Z */
-DEFINE_THISCALL_WRAPPER(locale__Getfacet, 8)
-const locale_facet* __thiscall locale__Getfacet(const locale *this, MSVCP_size_t id)
+static const locale_facet* locale__Getfacet(const locale *this, MSVCP_size_t id)
 {
     locale_facet *fac;
 
@@ -8337,16 +7718,6 @@ locale* __cdecl locale_empty(locale *ret)
     return ret;
 }
 
-/* ?name@locale@std@@QBE?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?name@locale@std@@QEBA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(locale_name, 8)
-basic_string_char* __thiscall locale_name(const locale *this, basic_string_char *ret)
-{
-    TRACE( "(%p)\n", this);
-    MSVCP_basic_string_char_copy_ctor(ret, &this->ptr->name);
-    return ret;
-}
-
 /* ?global@locale@std@@SA?AV12@ABV12@@Z */
 /* ?global@locale@std@@SA?AV12@AEBV12@@Z */
 locale* __cdecl locale_global(locale *ret, const locale *loc)
diff --git a/dlls/msvcp100/math.c b/dlls/msvcp100/math.c
index 37229155235..d13eaef49b7 100644
--- a/dlls/msvcp100/math.c
+++ b/dlls/msvcp100/math.c
@@ -801,15 +801,3 @@ BOOLEAN __cdecl std_numeric_limits_bool_signaling_NaN(void) { return 0; }
 
 /* ?signaling_NaN@?$numeric_limits@_W@std@@SA_WXZ -> public: static wchar_t __cdecl std::numeric_limits<wchar_t>::signaling_NaN(void) */
 WCHAR __cdecl std_numeric_limits_wchar_t_signaling_NaN(void) { return 0; }
-
-/* ??4?$_Ctraits@M@std@@QAEAAV01@ABV01@@Z -> public: class std::_Ctraits<float> & __thiscall std::_Ctraits<float>::operator=(class std::_Ctraits<float> const &) */
-/* ??4?$_Ctraits@M@std@@QEAAAEAV01@AEBV01@@Z -> public: class std::_Ctraits<float> & __ptr64 __cdecl std::_Ctraits<float>::operator=(class std::_Ctraits<float> const & __ptr64) __ptr64 */
-/* ??4?$_Ctraits@N@std@@QAEAAV01@ABV01@@Z -> public: class std::_Ctraits<double> & __thiscall std::_Ctraits<double>::operator=(class std::_Ctraits<double> const &) */
-/* ??4?$_Ctraits@N@std@@QEAAAEAV01@AEBV01@@Z -> public: class std::_Ctraits<double> & __ptr64 __cdecl std::_Ctraits<double>::operator=(class std::_Ctraits<double> const & __ptr64) __ptr64 */
-/* ??4?$_Ctraits@O@std@@QAEAAV01@ABV01@@Z -> public: class std::_Ctraits<long double> & __thiscall std::_Ctraits<long double>::operator=(class std::_Ctraits<long double> const &) */
-/* ??4?$_Ctraits@O@std@@QEAAAEAV01@AEBV01@@Z -> public: class std::_Ctraits<long double> & __ptr64 __cdecl std::_Ctraits<long double>::operator=(class std::_Ctraits<long double> const & __ptr64) __ptr64 */
-DEFINE_THISCALL_WRAPPER( std_Ctraits_op_assign, 8 )
-std_Ctraits * __thiscall std_Ctraits_op_assign( std_Ctraits *this, std_Ctraits *right )
-{
-    return this;
-}
diff --git a/dlls/msvcp100/memory.c b/dlls/msvcp100/memory.c
index 4407cfe3967..a45dce04219 100644
--- a/dlls/msvcp100/memory.c
+++ b/dlls/msvcp100/memory.c
@@ -27,141 +27,29 @@
 #include "winbase.h"
 
 
-/* ?address@?$allocator@D@std@@QBEPADAAD@Z */
-/* ?address@?$allocator@D@std@@QEBAPEADAEAD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_address, 8)
-char* __thiscall MSVCP_allocator_char_address(void *this, char *ptr)
-{
-    return ptr;
-}
-
-/* ?address@?$allocator@D@std@@QBEPBDABD@Z */
-/* ?address@?$allocator@D@std@@QEBAPEBDAEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_const_address, 8)
-const char* __thiscall MSVCP_allocator_char_const_address(void *this, const char *ptr)
-{
-    return ptr;
-}
-
-/* ??0?$allocator@D@std@@QAE@XZ */
-/* ??0?$allocator@D@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_ctor, 4)
-void* __thiscall MSVCP_allocator_char_ctor(void *this)
-{
-    return this;
-}
-
-/* ??0?$allocator@D@std@@QAE@ABV01@@Z */
-/* ??0?$allocator@D@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_copy_ctor, 8)
-void* __thiscall MSVCP_allocator_char_copy_ctor(void *this, const void *copy)
-{
-    return this;
-}
-
-/* ??4?$allocator@D@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$allocator@D@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_assign, 8)
-void* __thiscall MSVCP_allocator_char_assign(void *this, const void *assign)
-{
-    return this;
-}
-
 /* ?deallocate@?$allocator@D@std@@QAEXPADI@Z */
 /* ?deallocate@?$allocator@D@std@@QEAAXPEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_deallocate, 12)
-void __thiscall MSVCP_allocator_char_deallocate(void *this, char *ptr, MSVCP_size_t size)
+void MSVCP_allocator_char_deallocate(void *this, char *ptr, MSVCP_size_t size)
 {
     MSVCRT_operator_delete(ptr);
 }
 
 /* ?allocate@?$allocator@D@std@@QAEPADI@Z */
 /* ?allocate@?$allocator@D@std@@QEAAPEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_allocate, 8)
-char* __thiscall MSVCP_allocator_char_allocate(void *this, MSVCP_size_t count)
+char* MSVCP_allocator_char_allocate(void *this, MSVCP_size_t count)
 {
     return MSVCRT_operator_new(count);
 }
 
-/* ?allocate@?$allocator@D@std@@QAEPADIPBX@Z */
-/* ?allocate@?$allocator@D@std@@QEAAPEAD_KPEBX@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_allocate_hint, 12)
-char* __thiscall MSVCP_allocator_char_allocate_hint(void *this,
-        MSVCP_size_t count, const void *hint)
-{
-    /* Native ignores hint */
-    return MSVCP_allocator_char_allocate(this, count);
-}
-
-/* ?construct@?$allocator@D@std@@QAEXPADABD@Z */
-/* ?construct@?$allocator@D@std@@QEAAXPEADAEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_construct, 12)
-void __thiscall MSVCP_allocator_char_construct(void *this, char *ptr, const char *val)
-{
-    *ptr = *val;
-}
-
-/* ?destroy@?$allocator@D@std@@QAEXPAD@Z */
-/* ?destroy@?$allocator@D@std@@QEAAXPEAD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_destroy, 8)
-void __thiscall MSVCP_allocator_char_destroy(void *this, char *ptr)
-{
-}
-
-/* ?max_size@?$allocator@D@std@@QBEIXZ */
-/* ?max_size@?$allocator@D@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_char_max_size, 4)
-MSVCP_size_t __thiscall MSVCP_allocator_char_max_size(void *this)
+MSVCP_size_t MSVCP_allocator_char_max_size(void *this)
 {
     return UINT_MAX/sizeof(char);
 }
 
-
 /* allocator<wchar_t> */
-/* ?address@?$allocator@_W@std@@QBEPA_WAA_W@Z */
-/* ?address@?$allocator@_W@std@@QEBAPEA_WAEA_W@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_address, 8)
-wchar_t* __thiscall MSVCP_allocator_wchar_address(void *this, wchar_t *ptr)
-{
-    return ptr;
-}
-
-/* ?address@?$allocator@_W@std@@QBEPB_WAB_W@Z */
-/* ?address@?$allocator@_W@std@@QEBAPEB_WAEB_W@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_const_address, 8)
-const wchar_t* __thiscall MSVCP_allocator_wchar_const_address(void *this, const wchar_t *ptr)
-{
-    return ptr;
-}
-
-/* ??0?$allocator@_W@std@@QAE@XZ */
-/* ??0?$allocator@_W@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_ctor, 4)
-void* __thiscall MSVCP_allocator_wchar_ctor(void *this)
-{
-    return this;
-}
-
-/* ??0?$allocator@_W@std@@QAE@ABV01@@Z */
-/* ??0?$allocator@_W@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_copy_ctor, 8)
-void* __thiscall MSVCP_allocator_wchar_copy_ctor(void *this, void *copy)
-{
-    return this;
-}
-
-/* ??4?$allocator@_W@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$allocator@_W@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_assign, 8)
-void* __thiscall MSVCP_allocator_wchar_assign(void *this, void *assign)
-{
-    return this;
-}
-
 /* ?deallocate@?$allocator@_W@std@@QAEXPA_WI@Z */
 /* ?deallocate@?$allocator@_W@std@@QEAAXPEA_W_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_deallocate, 12)
-void __thiscall MSVCP_allocator_wchar_deallocate(void *this,
+void MSVCP_allocator_wchar_deallocate(void *this,
         wchar_t *ptr, MSVCP_size_t size)
 {
     MSVCRT_operator_delete(ptr);
@@ -169,8 +57,7 @@ void __thiscall MSVCP_allocator_wchar_deallocate(void *this,
 
 /* ?allocate@?$allocator@_W@std@@QAEPA_WI@Z */
 /* ?allocate@?$allocator@_W@std@@QEAAPEA_W_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate, 8)
-wchar_t* __thiscall MSVCP_allocator_wchar_allocate(void *this, MSVCP_size_t count)
+wchar_t* MSVCP_allocator_wchar_allocate(void *this, MSVCP_size_t count)
 {
     if(UINT_MAX/count < sizeof(wchar_t)) {
         throw_exception(EXCEPTION_BAD_ALLOC, NULL);
@@ -180,159 +67,9 @@ wchar_t* __thiscall MSVCP_allocator_wchar_allocate(void *this, MSVCP_size_t coun
     return MSVCRT_operator_new(count * sizeof(wchar_t));
 }
 
-/* ?allocate@?$allocator@_W@std@@QAEPA_WIPBX@Z */
-/* ?allocate@?$allocator@_W@std@@QEAAPEA_W_KPEBX@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_allocate_hint, 12)
-wchar_t* __thiscall MSVCP_allocator_wchar_allocate_hint(void *this,
-        MSVCP_size_t count, const void *hint)
-{
-    return MSVCP_allocator_wchar_allocate(this, count);
-}
-
-/* ?construct@?$allocator@_W@std@@QAEXPA_WAB_W@Z */
-/* ?construct@?$allocator@_W@std@@QEAAXPEA_WAEB_W@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_construct, 12)
-void __thiscall MSVCP_allocator_wchar_construct(void *this,
-        wchar_t *ptr, const wchar_t *val)
-{
-    *ptr = *val;
-}
-
-/* ?destroy@?$allocator@_W@std@@QAEXPA_W@Z */
-/* ?destroy@?$allocator@_W@std@@QEAAXPEA_W@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_destroy, 8)
-void __thiscall MSVCP_allocator_wchar_destroy(void *this, char *ptr)
-{
-}
-
 /* ?max_size@?$allocator@_W@std@@QBEIXZ */
 /* ?max_size@?$allocator@_W@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_wchar_max_size, 4)
-MSVCP_size_t __thiscall MSVCP_allocator_wchar_max_size(void *this)
+MSVCP_size_t MSVCP_allocator_wchar_max_size(void *this)
 {
     return UINT_MAX/sizeof(wchar_t);
 }
-
-/* allocator<unsigned short> */
-/* ?address@?$allocator@G@std@@QBEPAGAAG@Z */
-/* ?address@?$allocator@G@std@@QEBAPEAGAEAG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_address, 8)
-unsigned short* __thiscall MSVCP_allocator_short_address(
-        void *this, unsigned short *ptr)
-{
-    return ptr;
-}
-
-/* ?address@?$allocator@G@std@@QBEPBGABG@Z */
-/* ?address@?$allocator@G@std@@QEBAPEBGAEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_const_address, 8)
-const unsigned short* __thiscall MSVCP_allocator_short_const_address(
-        void *this, const unsigned short *ptr)
-{
-    return ptr;
-}
-
-/* ??0?$allocator@G@std@@QAE@XZ */
-/* ??0?$allocator@G@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_ctor, 4)
-void* __thiscall MSVCP_allocator_short_ctor(void *this)
-{
-    return this;
-}
-
-/* ??0?$allocator@G@std@@QAE@ABV01@@Z */
-/* ??0?$allocator@G@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_copy_ctor, 8)
-void* __thiscall MSVCP_allocator_short_copy_ctor(void *this, void *copy)
-{
-    return this;
-}
-
-/* ??4?$allocator@G@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$allocator@G@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_assign, 8)
-void* __thiscall MSVCP_allocator_short_assign(void *this, void *assign)
-{
-    return this;
-}
-
-/* ?deallocate@?$allocator@G@std@@QAEXPAGI@Z */
-/* ?deallocate@?$allocator@G@std@@QEAAXPEAG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_deallocate, 12)
-void __thiscall MSVCP_allocator_short_deallocate(void *this,
-        unsigned short *ptr, MSVCP_size_t size)
-{
-    MSVCRT_operator_delete(ptr);
-}
-
-/* ?allocate@?$allocator@G@std@@QAEPAGI@Z */
-/* ?allocate@?$allocator@G@std@@QEAAPEAG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate, 8)
-unsigned short* __thiscall MSVCP_allocator_short_allocate(
-        void *this, MSVCP_size_t count)
-{
-    if(UINT_MAX/count < sizeof(unsigned short)) {
-        throw_exception(EXCEPTION_BAD_ALLOC, NULL);
-        return NULL;
-    }
-
-    return MSVCRT_operator_new(count * sizeof(unsigned short));
-}
-
-/* ?allocate@?$allocator@G@std@@QAEPAGIPBX@Z */
-/* ?allocate@?$allocator@G@std@@QEAAPEAG_KPEBX@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_allocate_hint, 12)
-unsigned short* __thiscall MSVCP_allocator_short_allocate_hint(
-        void *this, MSVCP_size_t count, const void *hint)
-{
-    return MSVCP_allocator_short_allocate(this, count);
-}
-
-/* ?construct@?$allocator@G@std@@QAEXPAGABG@Z */
-/* ?construct@?$allocator@G@std@@QEAAXPEAGAEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_construct, 12)
-void __thiscall MSVCP_allocator_short_construct(void *this,
-        unsigned short *ptr, unsigned short *val)
-{
-    *ptr = *val;
-}
-
-/* ?destroy@?$allocator@G@std@@QAEXPAG@Z */
-/* ?destroy@?$allocator@G@std@@QEAAXPEAG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_destroy, 8)
-void __thiscall MSVCP_allocator_short_destroy(void *this, MSVCP_size_t *ptr)
-{
-}
-
-/* ?max_size@?$allocator@G@std@@QBEIXZ */
-/* ?max_size@?$allocator@G@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_short_max_size, 4)
-MSVCP_size_t __thiscall MSVCP_allocator_short_max_size(void *this)
-{
-    return UINT_MAX/sizeof(unsigned short);
-}
-
-/* allocator<void> */
-/* ??0?$allocator@X@std@@QAE@XZ */
-/* ??0?$allocator@X@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_void_ctor, 4)
-void* __thiscall MSVCP_allocator_void_ctor(void *this)
-{
-    return this;
-}
-
-/* ??0?$allocator@X@std@@QAE@ABV01@@Z */
-/* ??0?$allocator@X@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_void_copy_ctor, 8)
-void* __thiscall MSVCP_allocator_void_copy_ctor(void *this, void *copy)
-{
-    return this;
-}
-
-/* ??4?$allocator@X@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$allocator@X@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_allocator_void_assign, 8)
-void* __thiscall MSVCP_allocator_void_assign(void *this, void *assign)
-{
-    return this;
-}
diff --git a/dlls/msvcp100/msvcp.h b/dlls/msvcp100/msvcp.h
index 733b653238a..dad9e29b5c9 100644
--- a/dlls/msvcp100/msvcp.h
+++ b/dlls/msvcp100/msvcp.h
@@ -48,15 +48,13 @@ typedef struct
     MSVCP_size_t res;
 } basic_string_char;
 
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor(basic_string_char*);
-basic_string_char* __stdcall MSVCP_basic_string_char_ctor_cstr(basic_string_char*, const char*);
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_len(basic_string_char*, const char*, MSVCP_size_t);
-basic_string_char* __stdcall MSVCP_basic_string_char_copy_ctor(basic_string_char*, const basic_string_char*);
-void __stdcall MSVCP_basic_string_char_dtor(basic_string_char*);
-const char* __stdcall MSVCP_basic_string_char_c_str(const basic_string_char*);
-void __thiscall MSVCP_basic_string_char_clear(basic_string_char*);
-basic_string_char* __thiscall MSVCP_basic_string_char_append_ch(basic_string_char*, char);
-MSVCP_size_t __thiscall MSVCP_basic_string_char_length(const basic_string_char*);
+basic_string_char* MSVCP_basic_string_char_ctor(basic_string_char*);
+basic_string_char* MSVCP_basic_string_char_ctor_cstr(basic_string_char*, const char*);
+basic_string_char* MSVCP_basic_string_char_ctor_cstr_len(basic_string_char*, const char*, MSVCP_size_t);
+basic_string_char* MSVCP_basic_string_char_copy_ctor(basic_string_char*, const basic_string_char*);
+void MSVCP_basic_string_char_dtor(basic_string_char*);
+const char* MSVCP_basic_string_char_c_str(const basic_string_char*);
+MSVCP_size_t MSVCP_basic_string_char_length(const basic_string_char*);
 
 #define BUF_SIZE_WCHAR 8
 typedef struct
@@ -70,21 +68,19 @@ typedef struct
     MSVCP_size_t res;
 } basic_string_wchar;
 
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor(basic_string_wchar*);
-basic_string_wchar* __stdcall MSVCP_basic_string_wchar_ctor_cstr(basic_string_wchar*, const wchar_t*);
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_len(basic_string_wchar*, const wchar_t*, MSVCP_size_t);
-void __thiscall MSVCP_basic_string_wchar_dtor(basic_string_wchar*);
-const wchar_t* __thiscall MSVCP_basic_string_wchar_c_str(const basic_string_wchar*);
-void __thiscall MSVCP_basic_string_wchar_clear(basic_string_wchar*);
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_ch(basic_string_wchar*, wchar_t);
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_length(const basic_string_wchar*);
-
-char* __stdcall MSVCP_allocator_char_allocate(void*, MSVCP_size_t);
-void __stdcall MSVCP_allocator_char_deallocate(void*, char*, MSVCP_size_t);
-MSVCP_size_t __stdcall MSVCP_allocator_char_max_size(void*);
-wchar_t* __stdcall MSVCP_allocator_wchar_allocate(void*, MSVCP_size_t);
-void __stdcall MSVCP_allocator_wchar_deallocate(void*, wchar_t*, MSVCP_size_t);
-MSVCP_size_t __stdcall MSVCP_allocator_wchar_max_size(void*);
+basic_string_wchar* MSVCP_basic_string_wchar_ctor(basic_string_wchar*);
+basic_string_wchar* MSVCP_basic_string_wchar_ctor_cstr(basic_string_wchar*, const wchar_t*);
+basic_string_wchar* MSVCP_basic_string_wchar_ctor_cstr_len(basic_string_wchar*, const wchar_t*, MSVCP_size_t);
+void MSVCP_basic_string_wchar_dtor(basic_string_wchar*);
+const wchar_t* MSVCP_basic_string_wchar_c_str(const basic_string_wchar*);
+MSVCP_size_t MSVCP_basic_string_wchar_length(const basic_string_wchar*);
+
+char* MSVCP_allocator_char_allocate(void*, MSVCP_size_t);
+void MSVCP_allocator_char_deallocate(void*, char*, MSVCP_size_t);
+MSVCP_size_t MSVCP_allocator_char_max_size(void*);
+wchar_t* MSVCP_allocator_wchar_allocate(void*, MSVCP_size_t);
+void MSVCP_allocator_wchar_deallocate(void*, wchar_t*, MSVCP_size_t);
+MSVCP_size_t MSVCP_allocator_wchar_max_size(void*);
 
 /* class locale::facet */
 typedef struct {
@@ -173,10 +169,10 @@ typedef struct
     struct _locale__Locimp *ptr;
 } locale;
 
-locale* __thiscall locale_ctor(locale*);
-locale* __thiscall locale_copy_ctor(locale*, const locale*);
-locale* __thiscall locale_operator_assign(locale*, const locale*);
-void __thiscall locale_dtor(locale*);
+locale* locale_ctor(locale*);
+locale* locale_copy_ctor(locale*, const locale*);
+locale* locale_operator_assign(locale*, const locale*);
+void locale_dtor(locale*);
 void free_locale(void);
 codecvt_char* codecvt_char_use_facet(const locale*);
 codecvt_wchar* codecvt_wchar_use_facet(const locale*);
diff --git a/dlls/msvcp100/string.c b/dlls/msvcp100/string.c
index 1d69087477f..5883f55d399 100644
--- a/dlls/msvcp100/string.c
+++ b/dlls/msvcp100/string.c
@@ -30,28 +30,6 @@
 WINE_DEFAULT_DEBUG_CHANNEL(msvcp);
 
 /* _String_iterator<char> and _String_const_iterator<char> class */
-typedef struct {
-    basic_string_char *bstr;
-    const char *pos;
-} String_iterator_char;
-typedef String_iterator_char String_reverse_iterator_char;
-
-typedef struct {
-    basic_string_wchar *bstr;
-    const wchar_t *pos;
-} String_iterator_wchar;
-typedef String_iterator_wchar String_reverse_iterator_wchar;
-
-/* size_t_noverify structure */
-typedef struct {
-    MSVCP_size_t val;
-} size_t_noverify;
-
-/* allocator class */
-typedef struct {
-    char empty_struct;
-} allocator;
-
 /* char_traits<char> */
 /* ?assign@?$char_traits@D@std@@SAXAADABD@Z */
 /* ?assign@?$char_traits@D@std@@SAXAEADAEBD@Z */
@@ -60,15 +38,6 @@ static void CDECL MSVCP_char_traits_char_assign(char *ch, const char *assign)
     *ch = *assign;
 }
 
-/* ?compare@?$char_traits@D@std@@SAHPBD0I@Z */
-/* ?compare@?$char_traits@D@std@@SAHPEBD0_K@Z */
-static int CDECL MSVCP_char_traits_char_compare(
-        const char *s1, const char *s2, MSVCP_size_t count)
-{
-    int ret = memcmp(s1, s2, count);
-    return (ret>0 ? 1 : (ret<0 ? -1 : 0));
-}
-
 /* ?length@?$char_traits@D@std@@SAIPBD@Z */
 /* ?length@?$char_traits@D@std@@SA_KPEBD@Z */
 static MSVCP_size_t CDECL MSVCP_char_traits_char_length(const char *str)
@@ -91,14 +60,6 @@ static char* CDECL MSVCP_char_traits_char__Copy_s(char *dest,
     return memcpy(dest, src, count);
 }
 
-/* ?find@?$char_traits@D@std@@SAPBDPBDIABD@Z */
-/* ?find@?$char_traits@D@std@@SAPEBDPEBD_KAEBD@Z */
-static const char * CDECL MSVCP_char_traits_char_find(
-        const char *str, MSVCP_size_t range, const char *c)
-{
-    return memchr(str, *c, range);
-}
-
 /* ?_Move_s@?$char_traits@D@std@@SAPADPADIPBDI@Z */
 /* ?_Move_s@?$char_traits@D@std@@SAPEADPEAD_KPEBD1@Z */
 static char* CDECL MSVCP_char_traits_char__Move_s(char *dest,
@@ -114,14 +75,6 @@ static char* CDECL MSVCP_char_traits_char__Move_s(char *dest,
     return memmove(dest, src, count);
 }
 
-/* ?assign@?$char_traits@D@std@@SAPADPADID@Z */
-/* ?assign@?$char_traits@D@std@@SAPEADPEAD_KD@Z */
-static char* CDECL MSVCP_char_traits_char_assignn(char *str, MSVCP_size_t num, char c)
-{
-    return memset(str, c, num);
-}
-
-
 /* char_traits<wchar_t> */
 /* ?assign@?$char_traits@_W@std@@SAXAA_WAB_W@Z */
 /* ?assign@?$char_traits@_W@std@@SAXAEA_WAEB_W@Z */
@@ -131,15 +84,6 @@ static void CDECL MSVCP_char_traits_wchar_assign(wchar_t *ch,
     *ch = *assign;
 }
 
-/* ?compare@?$char_traits@_W@std@@SAHPB_W0I@Z */
-/* ?compare@?$char_traits@_W@std@@SAHPEB_W0_K@Z */
-static int CDECL MSVCP_char_traits_wchar_compare(const wchar_t *s1,
-        const wchar_t *s2, MSVCP_size_t count)
-{
-    int ret = memcmp(s1, s2, count * sizeof(wchar_t));
-    return (ret>0 ? 1 : (ret<0 ? -1 : 0));
-}
-
 /* ?length@?$char_traits@_W@std@@SAIPB_W@Z */
 /* ?length@?$char_traits@_W@std@@SA_KPEB_W@Z */
 static MSVCP_size_t CDECL MSVCP_char_traits_wchar_length(const wchar_t *str)
@@ -162,20 +106,6 @@ static wchar_t* CDECL MSVCP_char_traits_wchar__Copy_s(wchar_t *dest,
     return memcpy(dest, src, count * sizeof(wchar_t));
 }
 
-/* ?find@?$char_traits@_W@std@@SAPB_WPB_WIAB_W@Z */
-/* ?find@?$char_traits@_W@std@@SAPEB_WPEB_W_KAEB_W@Z */
-static const wchar_t* CDECL MSVCP_char_traits_wchar_find(
-        const wchar_t *str, MSVCP_size_t range, const wchar_t *c)
-{
-    MSVCP_size_t i=0;
-
-    for(i=0; i<range; i++)
-        if(str[i] == *c)
-            return str+i;
-
-    return NULL;
-}
-
 /* ?_Move_s@?$char_traits@_W@std@@SAPA_WPA_WIPB_WI@Z */
 /* ?_Move_s@?$char_traits@_W@std@@SAPEA_WPEA_W_KPEB_W1@Z */
 static wchar_t* CDECL MSVCP_char_traits_wchar__Move_s(wchar_t *dest,
@@ -191,30 +121,7 @@ static wchar_t* CDECL MSVCP_char_traits_wchar__Move_s(wchar_t *dest,
     return memmove(dest, src, count * sizeof(WCHAR));
 }
 
-/* ?assign@?$char_traits@_W@std@@SAPA_WPA_WI_W@Z */
-/* ?assign@?$char_traits@_W@std@@SAPEA_WPEA_W_K_W@Z */
-static wchar_t* CDECL MSVCP_char_traits_wchar_assignn(wchar_t *str,
-        MSVCP_size_t num, wchar_t c)
-{
-    MSVCP_size_t i;
-
-    for(i=0; i<num; i++)
-        str[i] = c;
-
-    return str;
-}
-
-
 /* _String_base */
-/* ?_Xlen@_String_base@std@@SAXXZ */
-static void  CDECL MSVCP__String_base_Xlen(void)
-{
-    static const char msg[] = "string too long";
-
-    TRACE("\n");
-    throw_exception(EXCEPTION_LENGTH_ERROR, msg);
-}
-
 /* ?_Xran@_String_base@std@@SAXXZ */
 static void CDECL MSVCP__String_base_Xran(void)
 {
@@ -232,8 +139,7 @@ static const MSVCP_size_t MSVCP_basic_string_char_npos = -1;
 
 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEPADXZ */
 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAPEADXZ */
-DEFINE_THISCALL_WRAPPER(basic_string_char_ptr, 4)
-char* __thiscall basic_string_char_ptr(basic_string_char *this)
+static char* basic_string_char_ptr(basic_string_char *this)
 {
     if(this->res == BUF_SIZE_CHAR-1)
         return this->data.buf;
@@ -242,8 +148,7 @@ char* __thiscall basic_string_char_ptr(basic_string_char *this)
 
 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IBEPBDXZ */
 /* ?_Myptr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEBAPEBDXZ */
-DEFINE_THISCALL_WRAPPER(basic_string_char_const_ptr, 4)
-const char* __thiscall basic_string_char_const_ptr(const basic_string_char *this)
+static const char* basic_string_char_const_ptr(const basic_string_char *this)
 {
     if(this->res == BUF_SIZE_CHAR-1)
         return this->data.buf;
@@ -252,8 +157,7 @@ const char* __thiscall basic_string_char_const_ptr(const basic_string_char *this
 
 /* ?_Eos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXI@Z */
 /* ?_Eos@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_eos, 8)
-void __thiscall basic_string_char_eos(basic_string_char *this, MSVCP_size_t len)
+static void basic_string_char_eos(basic_string_char *this, MSVCP_size_t len)
 {
     static const char nullbyte = '\0';
 
@@ -263,8 +167,7 @@ void __thiscall basic_string_char_eos(basic_string_char *this, MSVCP_size_t len)
 
 /* ?_Inside@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NPBD@Z */
 /* ?_Inside@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAA_NPEBD@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_inside, 8)
-MSVCP_bool __thiscall basic_string_char_inside(
+static MSVCP_bool basic_string_char_inside(
         basic_string_char *this, const char *ptr)
 {
     char *cstr = basic_string_char_ptr(this);
@@ -274,8 +177,7 @@ MSVCP_bool __thiscall basic_string_char_inside(
 
 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEX_NI@Z */
 /* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_N_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_tidy, 12)
-void __thiscall basic_string_char_tidy(basic_string_char *this,
+static void basic_string_char_tidy(basic_string_char *this,
         MSVCP_bool built, MSVCP_size_t new_size)
 {
     if(built && BUF_SIZE_CHAR<=this->res) {
@@ -290,19 +192,9 @@ void __thiscall basic_string_char_tidy(basic_string_char *this,
     basic_string_char_eos(this, new_size);
 }
 
-/* Exported only from msvcp60/70 */
-/* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AAEX_N@Z */
-/* ?_Tidy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAAX_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_tidy_built, 8)
-void __thiscall basic_string_char_tidy_built(basic_string_char *this, MSVCP_bool built)
-{
-    basic_string_char_tidy(this, built, 0);
-}
-
 /* ?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NI_N@Z */
 /* ?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAA_N_K_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_grow, 12)
-MSVCP_bool __thiscall basic_string_char_grow(
+static MSVCP_bool basic_string_char_grow(
         basic_string_char *this, MSVCP_size_t new_size, MSVCP_bool trim)
 {
     if(this->res < new_size) {
@@ -340,46 +232,9 @@ MSVCP_bool __thiscall basic_string_char_grow(
     return (new_size>0);
 }
 
-/* ?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXII@Z */
-/* ?_Copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_K0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char__Copy, 12)
-void __thiscall basic_string_char__Copy(basic_string_char *this,
-        MSVCP_size_t new_size, MSVCP_size_t copy_len)
-{
-    TRACE("%p %lu %lu\n", this, new_size, copy_len);
-
-    if(!basic_string_char_grow(this, new_size, FALSE))
-        return;
-    basic_string_char_eos(this, copy_len);
-}
-
-/* ?_Pdif@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KAIV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-/* ?_Pdif@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@KA_KV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-static MSVCP_size_t __cdecl MSVCP_basic_string_char_Pdif(String_iterator_char i1, String_iterator_char i2)
-{
-    TRACE("(%p %p) (%p %p)\n", i1.bstr, i1.pos, i2.bstr, i2.pos);
-
-    if((!i1.bstr && i1.pos) || i1.bstr!=i2.bstr) {
-        _invalid_parameter(NULL, NULL, NULL, 0, 0);
-        return 0;
-    }
-
-    return !i1.pos ? 0 : i1.pos-i2.pos;
-}
-
-/* ?get_allocator@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$allocator@D@2@XZ */
-/* ?get_allocator@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$allocator@D@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_string_char_get_allocator, 8)
-allocator* __thiscall basic_string_char_get_allocator(const basic_string_char *this, allocator *ret)
-{
-    TRACE("%p\n", this);
-    return ret;
-}
-
 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@II@Z */
 /* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_erase, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_erase(
+static basic_string_char* MSVCP_basic_string_char_erase(
         basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t len)
 {
     TRACE("%p %lu %lu\n", this, pos, len);
@@ -400,48 +255,9 @@ basic_string_char* __thiscall MSVCP_basic_string_char_erase(
     return this;
 }
 
-/* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-/* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_erase_iter_range, 24)
-String_iterator_char* __thiscall basic_string_char_erase_iter_range(basic_string_char *this,
-        String_iterator_char *ret, String_iterator_char beg, String_iterator_char end)
-{
-    MSVCP_size_t off;
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_ptr(this);
-    off = MSVCP_basic_string_char_Pdif(beg, *ret);
-
-    MSVCP_basic_string_char_erase(this, off, MSVCP_basic_string_char_Pdif(end, beg));
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_ptr(this)+off;
-    return ret;
-}
-
-/* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-/* ?erase@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_erase_iter, 16)
-String_iterator_char* __thiscall basic_string_char_erase_iter(basic_string_char *this,
-        String_iterator_char *ret, String_iterator_char pos)
-{
-    MSVCP_size_t off;
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_ptr(this);
-    off = MSVCP_basic_string_char_Pdif(pos, *ret);
-
-    MSVCP_basic_string_char_erase(this, off, 1);
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_ptr(this)+off;
-    return ret;
-}
-
 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z */
 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_substr, 16)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign_substr(
+static basic_string_char* MSVCP_basic_string_char_assign_substr(
         basic_string_char *this, const basic_string_char *assign,
         MSVCP_size_t pos, MSVCP_size_t len)
 {
@@ -465,12 +281,9 @@ basic_string_char* __thiscall MSVCP_basic_string_char_assign_substr(
     return this;
 }
 
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z */
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z */
 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z */
 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign(
+static basic_string_char* MSVCP_basic_string_char_assign(
         basic_string_char *this, const basic_string_char *assign)
 {
     return MSVCP_basic_string_char_assign_substr(this, assign,
@@ -479,8 +292,7 @@ basic_string_char* __thiscall MSVCP_basic_string_char_assign(
 
 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z */
 /* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr_len, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr_len(
+static basic_string_char* MSVCP_basic_string_char_assign_cstr_len(
         basic_string_char *this, const char *str, MSVCP_size_t len)
 {
     TRACE("%p %s %lu\n", this, debugstr_an(str, len), len);
@@ -497,138 +309,28 @@ basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr_len(
     return this;
 }
 
-/* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z */
-/* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@D@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_ch, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign_ch(
-        basic_string_char *this, char ch)
-{
-    return MSVCP_basic_string_char_assign_cstr_len(this, &ch, 1);
-}
-
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z */
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z */
 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z */
 /* ??4?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@PEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_cstr, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign_cstr(
+static basic_string_char* MSVCP_basic_string_char_assign_cstr(
         basic_string_char *this, const char *str)
 {
     return MSVCP_basic_string_char_assign_cstr_len(this, str,
             MSVCP_char_traits_char_length(str));
 }
 
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ID@Z */
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assignn, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_assignn(
-        basic_string_char *this, MSVCP_size_t count, char ch)
-{
-    TRACE("%p %ld %c\n", this, count, ch);
-
-    basic_string_char_grow(this, count, FALSE);
-    MSVCP_char_traits_char_assignn(basic_string_char_ptr(this), count, ch);
-    basic_string_char_eos(this, count);
-    return this;
-}
-
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD0@Z */
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_ptr_ptr, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign_ptr_ptr(
-        basic_string_char *this, const char *first, const char *last)
-{
-    return MSVCP_basic_string_char_assign_cstr_len(this, first, last-first);
-}
-
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-/* ?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_assign_iter, 20)
-basic_string_char* __thiscall MSVCP_basic_string_char_assign_iter(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end)
-{
-    return MSVCP_basic_string_char_assign_ptr_ptr(this, beg.pos, end.pos);
-}
-
-/* ?_Chassign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAEXIID@Z */
-/* ?_Chassign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IEAAX_K0D@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_Chassign, 16)
-void __thiscall MSVCP_basic_string_char_Chassign(basic_string_char *this,
-        MSVCP_size_t off, MSVCP_size_t count, char ch)
-{
-    TRACE("%p %lu %lu %c\n", this, off, count, ch);
-    MSVCP_char_traits_char_assignn(basic_string_char_ptr(this)+off, count, ch);
-}
-
-/* ?_Copy_s@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPADIII@Z */
-/* ?_Copy_s@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEAD_K11@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_Copy_s, 20)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_Copy_s(const basic_string_char *this,
-        char *dest, MSVCP_size_t size, MSVCP_size_t count, MSVCP_size_t off)
-{
-    TRACE("%p %p %lu %lu %lu\n", this, dest, size, count, off);
-
-    if(this->size < off)
-        MSVCP__String_base_Xran();
-
-    if(count > this->size-off)
-        count = this->size-off;
-
-    MSVCP_char_traits_char__Copy_s(dest, size,
-            basic_string_char_const_ptr(this)+off, count);
-    return count;
-}
-
-/* ?copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPADII@Z */
-/* ?copy@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEAD_K1@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_copy, 16)
-MSVCP_size_t __thiscall basic_string_char_copy(const basic_string_char *this,
-        char *dest, MSVCP_size_t count, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_Copy_s(this, dest, count, count, off);
-}
-
 /* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */
 /* ?c_str@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */
 /* ?data@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEPBDXZ */
 /* ?data@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAPEBDXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_c_str, 4)
-const char* __thiscall MSVCP_basic_string_char_c_str(const basic_string_char *this)
+const char* MSVCP_basic_string_char_c_str(const basic_string_char *this)
 {
     TRACE("%p\n", this);
     return basic_string_char_const_ptr(this);
 }
 
-/* ?capacity@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
-/* ?capacity@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_capacity, 4)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_capacity(basic_string_char *this)
-{
-    TRACE("%p\n", this);
-    return this->res;
-}
-
-/* ?reserve@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXI@Z */
-/* ?reserve@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_reserve, 8)
-void __thiscall MSVCP_basic_string_char_reserve(basic_string_char *this, MSVCP_size_t size)
-{
-    MSVCP_size_t len;
-
-    TRACE("%p %ld\n", this, size);
-
-    len = this->size;
-    if(len > size)
-        return;
-
-    basic_string_char_grow(this, size, FALSE);
-    basic_string_char_eos(this, len);
-}
-
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor, 4)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor(basic_string_char *this)
+basic_string_char* MSVCP_basic_string_char_ctor(basic_string_char *this)
 {
     TRACE("%p\n", this);
 
@@ -638,8 +340,7 @@ basic_string_char* __thiscall MSVCP_basic_string_char_ctor(basic_string_char *th
 
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@@Z */
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_copy_ctor, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_copy_ctor(
+basic_string_char* MSVCP_basic_string_char_copy_ctor(
     basic_string_char *this, const basic_string_char *copy)
 {
     TRACE("%p %p\n", this, copy);
@@ -651,8 +352,7 @@ basic_string_char* __thiscall MSVCP_basic_string_char_copy_ctor(
 
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD@Z */
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr(
+basic_string_char* MSVCP_basic_string_char_ctor_cstr(
         basic_string_char *this, const char *str)
 {
     TRACE("%p %s\n", this, debugstr_a(str));
@@ -662,19 +362,9 @@ basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr(
     return this;
 }
 
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDABV?$allocator@D@1@@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBDAEBV?$allocator@D@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr_alloc, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_alloc(
-        basic_string_char *this, const char *str, const void *alloc)
-{
-    return MSVCP_basic_string_char_ctor_cstr(this, str);
-}
-
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDI@Z */
 /* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr_len, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_len(
+basic_string_char* MSVCP_basic_string_char_ctor_cstr_len(
         basic_string_char *this, const char *str, MSVCP_size_t len)
 {
     TRACE("%p %s %ld\n", this, debugstr_an(str, len), len);
@@ -684,95 +374,9 @@ basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_len(
     return this;
 }
 
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBDIABV?$allocator@D@1@@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD_KAEBV?$allocator@D@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_cstr_len_alloc, 16)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_cstr_len_alloc(
-        basic_string_char *this, const char *str, MSVCP_size_t len, const void *alloc)
-{
-    return MSVCP_basic_string_char_ctor_cstr_len(this, str, len);
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@II@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_substr, 16)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_substr(
-        basic_string_char *this, const basic_string_char *assign,
-        MSVCP_size_t pos, MSVCP_size_t len)
-{
-    TRACE("%p %p %lu %lu\n", this, assign, pos, len);
-
-    basic_string_char_tidy(this, FALSE, 0);
-    MSVCP_basic_string_char_assign_substr(this, assign, pos, len);
-    return this;
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV01@IIABV?$allocator@D@1@@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV01@_K1AEBV?$allocator@D@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_substr_alloc, 20)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_substr_alloc(
-        basic_string_char *this, const basic_string_char *assign,
-        MSVCP_size_t pos, MSVCP_size_t len, const void *alloc)
-{
-    return MSVCP_basic_string_char_ctor_substr(this, assign, pos, len);
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ABV?$allocator@D@1@@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@AEBV?$allocator@D@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_alloc, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_alloc(
-        basic_string_char *this, const void *alloc)
-{
-    TRACE("%p %p\n", this, alloc);
-
-    basic_string_char_tidy(this, FALSE, 0);
-    return this;
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@ID@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_ch, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_ch(basic_string_char *this,
-        MSVCP_size_t count, char ch)
-{
-    TRACE("%p %ld %c\n", this, count, ch);
-
-    basic_string_char_tidy(this, FALSE, 0);
-    MSVCP_basic_string_char_assignn(this, count, ch);
-    return this;
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@IDABV?$allocator@D@1@@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@_KDAEBV?$allocator@D@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_ch_alloc, 16)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_ch_alloc(basic_string_char *this,
-        MSVCP_size_t count, char ch, const void *alloc)
-{
-    return MSVCP_basic_string_char_ctor_ch(this, count, ch);
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@PBD0@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@PEBD0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_ptr_ptr, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_ptr_ptr(basic_string_char *this,
-        const char *first, const char *last)
-{
-    return MSVCP_basic_string_char_ctor_cstr_len(this, first, last-first);
-}
-
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z */
-/* ??0?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@1@0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_ctor_iter, 20)
-basic_string_char* __thiscall MSVCP_basic_string_char_ctor_iter(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end)
-{
-    return MSVCP_basic_string_char_ctor_cstr_len(this, beg.pos, end.pos-beg.pos);
-}
-
 /* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE@XZ */
 /* ??1?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_dtor, 4)
-void __thiscall MSVCP_basic_string_char_dtor(basic_string_char *this)
+void MSVCP_basic_string_char_dtor(basic_string_char *this)
 {
     TRACE("%p\n", this);
     basic_string_char_tidy(this, TRUE, 0);
@@ -782,2930 +386,290 @@ void __thiscall MSVCP_basic_string_char_dtor(basic_string_char *this)
 /* ?size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
 /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
 /* ?length@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_length, 4)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_length(const basic_string_char *this)
+MSVCP_size_t MSVCP_basic_string_char_length(const basic_string_char *this)
 {
     TRACE("%p\n", this);
     return this->size;
 }
 
-/* ?max_size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIXZ */
-/* ?max_size@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(basic_string_char_max_size, 4)
-MSVCP_size_t __thiscall basic_string_char_max_size(const basic_string_char *this)
+/* basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> */
+/* basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short>> */
+/* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2IB */
+/* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2_KB */
+/* ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2IB */
+/* ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2_KB */
+const MSVCP_size_t MSVCP_basic_string_wchar_npos = -1;
+
+/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ */
+/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAPEA_WXZ */
+/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEPAGXZ */
+/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAPEAGXZ */
+static wchar_t* basic_string_wchar_ptr(basic_string_wchar *this)
 {
-    TRACE("%p\n", this);
-    return MSVCP_allocator_char_max_size(this->allocator)-1;
+    if(this->res == BUF_SIZE_WCHAR-1)
+        return this->data.buf;
+    return this->data.ptr;
 }
 
-/* ?empty@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE_NXZ */
-/* ?empty@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_empty, 4)
-MSVCP_bool __thiscall MSVCP_basic_string_char_empty(basic_string_char *this)
+/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IBEPB_WXZ */
+/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEBAPEB_WXZ */
+/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IBEPBGXZ */
+/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEBAPEBGXZ */
+static const wchar_t* basic_string_wchar_const_ptr(const basic_string_wchar *this)
 {
-    TRACE("%p\n", this);
-    return this->size == 0;
+    if(this->res == BUF_SIZE_WCHAR-1)
+        return this->data.buf;
+    return this->data.ptr;
 }
 
-/* ?swap@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXAAV12@@Z */
-/* ?swap@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXAEAV12@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_swap, 8)
-void __thiscall MSVCP_basic_string_char_swap(basic_string_char *this, basic_string_char *str)
+/* ?_Eos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXI@Z */
+/* ?_Eos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K@Z */
+/* ?_Eos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXI@Z */
+/* ?_Eos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K@Z */
+static void basic_string_wchar_eos(basic_string_wchar *this, MSVCP_size_t len)
 {
-    if(this != str) {
-        char tmp[sizeof(this->data)];
-        const MSVCP_size_t size = this->size;
-        const MSVCP_size_t res = this->res;
-
-        memcpy(tmp, this->data.buf, sizeof(this->data));
-        memcpy(this->data.buf, str->data.buf, sizeof(this->data));
-        memcpy(str->data.buf, tmp, sizeof(this->data));
-
-        this->size = str->size;
-        this->res = str->res;
+    static const wchar_t nullbyte_w = '\0';
 
-        str->size = size;
-        str->res = res;
-    }
+    this->size = len;
+    MSVCP_char_traits_wchar_assign(basic_string_wchar_ptr(this)+len, &nullbyte_w);
 }
 
-/* ?substr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV12@II@Z */
-/* ?substr@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV12@_K0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_substr, 16)
-basic_string_char* __thiscall MSVCP_basic_string_char_substr(basic_string_char *this,
-        basic_string_char *ret, MSVCP_size_t off, MSVCP_size_t len)
+/* ?_Inside@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAE_NPB_W@Z */
+/* ?_Inside@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAA_NPEB_W@Z */
+/* ?_Inside@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAE_NPBG@Z */
+/* ?_Inside@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAA_NPEBG@Z */
+static MSVCP_bool basic_string_wchar_inside(
+        basic_string_wchar *this, const wchar_t *ptr)
 {
-    TRACE("%p %lu %lu\n", this, off, len);
+    wchar_t *cstr = basic_string_wchar_ptr(this);
 
-    MSVCP_basic_string_char_ctor_substr(ret, this, off, len);
-    return ret;
+    return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
 }
 
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_substr, 16)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_substr(basic_string_char *this,
-        const basic_string_char *append, MSVCP_size_t offset, MSVCP_size_t count)
+/* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEX_NI@Z */
+/* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_N_K@Z */
+/* ?_Tidy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEX_NI@Z */
+/* ?_Tidy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_N_K@Z */
+static void basic_string_wchar_tidy(basic_string_wchar *this,
+        MSVCP_bool built, MSVCP_size_t new_size)
 {
-    TRACE("%p %p %lu %lu\n", this, append, offset, count);
-
-    if(append->size < offset)
-        MSVCP__String_base_Xran();
-
-    if(count > append->size-offset)
-        count = append->size-offset;
-
-    if(MSVCP_basic_string_char_npos-this->size<=count || this->size+count<this->size)
-        MSVCP__String_base_Xlen();
+    if(built && BUF_SIZE_WCHAR<=this->res) {
+        wchar_t *ptr = this->data.ptr;
 
-    if(basic_string_char_grow(this, this->size+count, FALSE)) {
-        MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this)+this->size,
-                this->res-this->size, basic_string_char_const_ptr(append)+offset, count);
-        basic_string_char_eos(this, this->size+count);
+        if(new_size > 0)
+            MSVCP_char_traits_wchar__Copy_s(this->data.buf, BUF_SIZE_WCHAR, ptr, new_size);
+        MSVCP_allocator_wchar_deallocate(this->allocator, ptr, this->res+1);
     }
 
-    return this;
-}
-
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@AEBV12@@Z */
-/* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@ABV01@@Z */
-/* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_append(
-        basic_string_char *this, const basic_string_char *append)
-{
-    return MSVCP_basic_string_char_append_substr(this, append,
-            0, MSVCP_basic_string_char_npos);
+    this->res = BUF_SIZE_WCHAR-1;
+    basic_string_wchar_eos(this, new_size);
 }
 
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBDI@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_cstr_len, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_cstr_len(
-        basic_string_char *this, const char *append, MSVCP_size_t count)
+/* ?_Grow@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAE_NI_N@Z */
+/* ?_Grow@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAA_N_K_N@Z */
+/* ?_Grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAE_NI_N@Z */
+/* ?_Grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAA_N_K_N@Z */
+static MSVCP_bool basic_string_wchar_grow(
+        basic_string_wchar *this, MSVCP_size_t new_size, MSVCP_bool trim)
 {
-    TRACE("%p %s %lu\n", this, debugstr_an(append, count), count);
-
-    if(basic_string_char_inside(this, append))
-        return MSVCP_basic_string_char_append_substr(this, this,
-                append-basic_string_char_ptr(this), count);
+    if(this->res < new_size) {
+        MSVCP_size_t new_res = new_size, len = this->size;
+        wchar_t *ptr;
 
-    if(MSVCP_basic_string_char_npos-this->size<=count || this->size+count<this->size)
-        MSVCP__String_base_Xlen();
+        new_res |= 0xf;
 
-    if(basic_string_char_grow(this, this->size+count, FALSE)) {
-        MSVCP_char_traits_char__Copy_s(basic_string_char_ptr(this)+this->size,
-                this->res-this->size, append, count);
-        basic_string_char_eos(this, this->size+count);
-    }
+        if(new_res/3 < this->res/2)
+            new_res = this->res + this->res/2;
 
-    return this;
-}
+        ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_res+1);
+        if(!ptr)
+            ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_size+1);
+        else
+            new_size = new_res;
+        if(!ptr) {
+            ERR("Out of memory\n");
+            basic_string_wchar_tidy(this, TRUE, 0);
+            return FALSE;
+        }
 
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD@Z */
-/* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@PBD@Z */
-/* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@PEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_cstr, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_cstr(
-        basic_string_char *this, const char *append)
-{
-    return MSVCP_basic_string_char_append_cstr_len(this, append,
-            MSVCP_char_traits_char_length(append));
-}
+        MSVCP_char_traits_wchar__Copy_s(ptr, new_size,
+                basic_string_wchar_ptr(this), this->size);
+        basic_string_wchar_tidy(this, TRUE, 0);
+        this->data.ptr = ptr;
+        this->res = new_size;
+        basic_string_wchar_eos(this, len);
+    } else if(trim && new_size < BUF_SIZE_WCHAR)
+        basic_string_wchar_tidy(this, TRUE,
+                new_size<this->size ? new_size : this->size);
+    else if(new_size == 0)
+        basic_string_wchar_eos(this, 0);
 
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@PBD0@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@PEBD0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_beg_end, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_beg_end(
-        basic_string_char *this, const char *beg, const char *end)
-{
-    return MSVCP_basic_string_char_append_cstr_len(this, beg, end-beg);
+    return (new_size>0);
 }
 
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_iter, 20)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_iter(
-        basic_string_char *this, String_iterator_char beg, String_iterator_char end)
+/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II@Z */
+/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0@Z */
+/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@II@Z */
+/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0@Z */
+static basic_string_wchar* MSVCP_basic_string_wchar_erase(
+            basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t len)
 {
-    return MSVCP_basic_string_char_append_cstr_len(this, beg.pos, end.pos-beg.pos);
-}
+    TRACE("%p %lu %lu\n", this, pos, len);
 
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ID@Z */
-/* ?append@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_len_ch, 12)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_len_ch(
-        basic_string_char *this, MSVCP_size_t count, char ch)
-{
-    TRACE("%p %lu %c\n", this, count, ch);
+    if(pos > this->size)
+        MSVCP__String_base_Xran();
 
-    if(MSVCP_basic_string_char_npos-this->size <= count)
-        MSVCP__String_base_Xlen();
+    if(len > this->size-pos)
+        len = this->size-pos;
 
-    if(basic_string_char_grow(this, this->size+count, FALSE)) {
-        MSVCP_char_traits_char_assignn(basic_string_char_ptr(this)+this->size, count, ch);
-        basic_string_char_eos(this, this->size+count);
+    if(len) {
+        MSVCP_char_traits_wchar__Move_s(basic_string_wchar_ptr(this)+pos,
+                this->res-pos, basic_string_wchar_ptr(this)+pos+len,
+                this->size-pos-len);
+        basic_string_wchar_eos(this, this->size-len);
     }
 
     return this;
 }
 
-/* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV01@D@Z */
-/* ??Y?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV01@D@Z */
-/* ?push_back@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXD@Z */
-/* ?push_back@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_append_ch, 8)
-basic_string_char* __thiscall MSVCP_basic_string_char_append_ch(
-        basic_string_char *this, char ch)
-{
-    return MSVCP_basic_string_char_append_len_ch(this, 1, ch);
-}
-
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIPBDI@Z */
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0PEBD0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr_cstr_len, 20)
-int __thiscall MSVCP_basic_string_char_compare_substr_cstr_len(
-            const basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t num,
-            const char *str, MSVCP_size_t count)
-{
-    int ans;
-
-    TRACE("%p %lu %lu %s %lu\n", this, pos, num, debugstr_an(str, count), count);
-
-    if(this->size < pos)
-        MSVCP__String_base_Xran();
-
-    if(num > this->size-pos)
-        num = this->size-pos;
-
-    ans = MSVCP_char_traits_char_compare(basic_string_char_const_ptr(this)+pos,
-            str, num>count ? count : num);
-    if(ans)
-        return ans;
-
-    if(num > count)
-        ans = 1;
-    else if(num < count)
-        ans = -1;
-    return ans;
-}
-
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIPBD@Z */
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0PEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr_cstr, 16)
-int __thiscall MSVCP_basic_string_char_compare_substr_cstr(const basic_string_char *this,
-        MSVCP_size_t pos, MSVCP_size_t num, const char *str)
-{
-    return MSVCP_basic_string_char_compare_substr_cstr_len(this, pos, num,
-            str, MSVCP_char_traits_char_length(str));
-}
-
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHPBD@Z */
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAHPEBD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_cstr, 8)
-int __thiscall MSVCP_basic_string_char_compare_cstr(
-        const basic_string_char *this, const char *str)
-{
-    return MSVCP_basic_string_char_compare_substr_cstr_len(this, 0, this->size,
-            str, MSVCP_char_traits_char_length(str));
-}
-
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIABV12@II@Z */
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0AEBV12@00@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr_substr, 24)
-int __thiscall MSVCP_basic_string_char_compare_substr_substr(
-        const basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t num,
-        const basic_string_char *compare, MSVCP_size_t off, MSVCP_size_t count)
-{
-    TRACE("%p %lu %lu %p %lu %lu\n", this, pos, num, compare, off, count);
-
-    if(compare->size < off)
-        MSVCP__String_base_Xran();
-
-    if(count > compare->size-off)
-        count = compare->size-off;
-
-    return MSVCP_basic_string_char_compare_substr_cstr_len(this, pos, num,
-            basic_string_char_const_ptr(compare)+off, count);
-}
-
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHIIABV12@@Z */
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAH_K0AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare_substr, 16)
-int __thiscall MSVCP_basic_string_char_compare_substr(
-        const basic_string_char *this, MSVCP_size_t pos, MSVCP_size_t num,
-        const basic_string_char *compare)
-{
-    return MSVCP_basic_string_char_compare_substr_cstr_len(this, pos, num,
-            basic_string_char_const_ptr(compare), compare->size);
-}
-
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEHABV12@@Z */
-/* ?compare@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAHAEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_compare, 8)
-int __thiscall MSVCP_basic_string_char_compare(
-        const basic_string_char *this, const basic_string_char *compare)
-{
-    return MSVCP_basic_string_char_compare_substr_cstr_len(this, 0, this->size,
-            basic_string_char_const_ptr(compare), compare->size);
-}
-
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_cstr_substr(
-        const basic_string_char *this, const char *find, MSVCP_size_t pos, MSVCP_size_t len)
-{
-    const char *p, *end;
-
-    TRACE("%p %s %lu %lu\n", this, debugstr_an(find, len), pos, len);
-
-    if(len==0 && pos<=this->size)
-        return pos;
-
-    end = basic_string_char_const_ptr(this)+this->size-len+1;
-    for(p=basic_string_char_const_ptr(this)+pos; p<end; p++) {
-        p = MSVCP_char_traits_char_find(p, end-p, find);
-        if(!p)
-            break;
-
-        if(!MSVCP_char_traits_char_compare(p, find, len))
-            return p-basic_string_char_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_char_npos;
-}
-
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_cstr_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_cstr_off(
-        const basic_string_char *this, const char *find, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_char_find_cstr_substr(this, find, pos,
-            MSVCP_char_traits_char_length(find));
-}
-
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_off(
-        const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_cstr_substr(this,
-            basic_string_char_const_ptr(find), off, find->size);
-}
-
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
-/* ?find@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_ch(
-        const basic_string_char *this, char ch, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_char_find_cstr_substr(this, &ch, pos, 1);
-}
-
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_cstr_substr(
-        const basic_string_char *this, const char *find, MSVCP_size_t pos, MSVCP_size_t len)
-{
-    const char *p, *end;
-
-    TRACE("%p %s %lu %lu\n", this, debugstr_an(find, len), pos, len);
-
-    if(len==0)
-        return pos<this->size ? pos : this->size;
-
-    if(len > this->size)
-        return MSVCP_basic_string_char_npos;
-
-    if(pos > this->size-len+1)
-        pos = this->size-len+1;
-    end = basic_string_char_const_ptr(this);
-    for(p=end+pos; p>=end; p--) {
-        if(*p==*find && !MSVCP_char_traits_char_compare(p, find, len))
-            return p-basic_string_char_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_char_npos;
-}
-
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_cstr_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_cstr_off(
-        const basic_string_char *this, const char *find, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_char_rfind_cstr_substr(this, find, pos,
-            MSVCP_char_traits_char_length(find));
-}
-
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_off(
-        const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_rfind_cstr_substr(this,
-            basic_string_char_const_ptr(find), off, find->size);
-}
-
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
-/* ?rfind@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rfind_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_rfind_ch(
-        const basic_string_char *this, char ch, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_char_rfind_cstr_substr(this, &ch, pos, 1);
-}
-
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_cstr_substr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const char *p, *end;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(len>0 && off<this->size) {
-        end = basic_string_char_const_ptr(this)+this->size;
-        for(p=basic_string_char_const_ptr(this)+off; p<end; p++)
-            if(MSVCP_char_traits_char_find(find, len, p))
-                return p-basic_string_char_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_char_npos;
-}
-
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of(
-        const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_first_of_cstr_substr(this,
-            basic_string_char_const_ptr(find), off, find->size);
-}
-
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_cstr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_first_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_char_length(find));
-}
-
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
-/* ?find_first_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_of_ch(
-        const basic_string_char *this, char ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_first_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of_cstr_substr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const char *p, *end;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(off<this->size) {
-        end = basic_string_char_const_ptr(this)+this->size;
-        for(p=basic_string_char_const_ptr(this)+off; p<end; p++)
-            if(!MSVCP_char_traits_char_find(find, len, p))
-                return p-basic_string_char_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_char_npos;
-}
-
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of(
-        const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_first_not_of_cstr_substr(this,
-            basic_string_char_const_ptr(find), off, find->size);
-}
-
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of_cstr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_first_not_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_char_length(find));
-}
-
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
-/* ?find_first_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_first_not_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_first_not_of_ch(
-        const basic_string_char *this, char ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_first_not_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_cstr_substr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const char *p, *beg;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(len>0 && this->size>0) {
-        if(off >= this->size)
-            off = this->size-1;
-
-        beg = basic_string_char_const_ptr(this);
-        for(p=beg+off; p>=beg; p--)
-            if(MSVCP_char_traits_char_find(find, len, p))
-                return p-beg;
-    }
-
-    return MSVCP_basic_string_char_npos;
-}
-
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of(
-        const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_last_of_cstr_substr(this,
-            basic_string_char_const_ptr(find), off, find->size);
-}
-
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_cstr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_last_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_char_length(find));
-}
-
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
-/* ?find_last_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_of_ch(
-        const basic_string_char *this, char ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_last_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDII@Z */
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of_cstr_substr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const char *p, *beg;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(len>0 && this->size>0) {
-        if(off >= this->size)
-            off = this->size-1;
-
-        beg = basic_string_char_const_ptr(this);
-        for(p=beg+off; p>=beg; p--)
-            if(!MSVCP_char_traits_char_find(find, len, p))
-                return p-beg;
-    }
-
-    return MSVCP_basic_string_char_npos;
-}
-
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIABV12@I@Z */
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of(
-        const basic_string_char *this, const basic_string_char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_last_not_of_cstr_substr(this,
-            basic_string_char_const_ptr(find), off, find->size);
-}
-
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIPBDI@Z */
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KPEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of_cstr(
-        const basic_string_char *this, const char *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_last_not_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_char_length(find));
-}
-
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEIDI@Z */
-/* ?find_last_not_of@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA_KD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_find_last_not_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_char_find_last_not_of_ch(
-        const basic_string_char *this, char ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_char_find_last_not_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z */
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at, 8)
-char* __thiscall MSVCP_basic_string_char_operator_at(
-        basic_string_char *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    assert(this->size >= pos);
-    return basic_string_char_ptr(this)+pos;
-}
-
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z */
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_const_operator_at, 8)
-const char* __thiscall MSVCP_basic_string_char_const_operator_at(
-        const basic_string_char *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    assert(this->size >= pos);
-    return basic_string_char_const_ptr(this)+pos;
-}
-
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEADU_Size_type_nosscl@01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_at_noverify, 8)
-char* __thiscall MSVCP_basic_string_char_operator_at_noverify(
-        basic_string_char *this, size_t_noverify pos)
-{
-    TRACE("%p %lu\n", this, pos.val);
-    return basic_string_char_ptr(this)+pos.val;
-}
-
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBDU_Size_type_nosscl@01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_operator_const_at_noverify, 8)
-const char* __thiscall MSVCP_basic_string_char_operator_const_at_noverify(
-        const basic_string_char *this, size_t_noverify pos)
-{
-    TRACE("%p %lu\n", this, pos.val);
-    return basic_string_char_const_ptr(this)+pos.val;
-}
-
-/* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAADI@Z */
-/* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_at, 8)
-char* __thiscall MSVCP_basic_string_char_at(
-        basic_string_char *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    if(this->size <= pos)
-        MSVCP__String_base_Xran();
-
-    return basic_string_char_ptr(this)+pos;
-}
-
-/* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBEABDI@Z */
-/* ?at@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBAAEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_const_at, 8)
-const char* __thiscall MSVCP_basic_string_char_const_at(
-        const basic_string_char *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    if(this->size <= pos)
-        MSVCP__String_base_Xran();
-
-    return basic_string_char_const_ptr(this)+pos;
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIPBDI@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0PEBD0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_cstr_len, 20)
-basic_string_char* __thiscall basic_string_char_replace_cstr_len(basic_string_char *this,
-        MSVCP_size_t off, MSVCP_size_t len, const char *str, MSVCP_size_t str_len)
-{
-    MSVCP_size_t inside_pos = -1;
-    char *ptr = basic_string_char_ptr(this);
-
-    TRACE("%p %ld %ld %p %ld\n", this, off, len, str, str_len);
-
-    if(this->size < off)
-        MSVCP__String_base_Xran();
-
-    if(len > this->size-off)
-        len = this->size-off;
-
-    if(MSVCP_basic_string_char_npos-str_len <= this->size-len)
-        MSVCP__String_base_Xlen();
-
-    if(basic_string_char_inside(this, str))
-        inside_pos = str-ptr;
-
-    if(len < str_len) {
-        basic_string_char_grow(this, this->size-len+str_len, FALSE);
-        ptr = basic_string_char_ptr(this);
-    }
-
-    if(inside_pos == -1) {
-        memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(char));
-        memcpy(ptr+off, str, str_len*sizeof(char));
-    } else if(len >= str_len) {
-        memmove(ptr+off, ptr+inside_pos, str_len*sizeof(char));
-        memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(char));
-    } else {
-        MSVCP_size_t size;
-
-        memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(char));
-
-        if(inside_pos < off+len) {
-            size = off+len-inside_pos;
-            if(size > str_len)
-                size = str_len;
-            memmove(ptr+off, ptr+inside_pos, size*sizeof(char));
-        } else {
-            size = 0;
-        }
-
-        if(str_len > size)
-            memmove(ptr+off+size, ptr+off+str_len, (str_len-size)*sizeof(char));
-    }
-
-    basic_string_char_eos(this, this->size-len+str_len);
-    return this;
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIPBD@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0PEBD@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_cstr, 16)
-basic_string_char* __thiscall basic_string_char_replace_cstr(basic_string_char *this,
-        MSVCP_size_t off, MSVCP_size_t len, const char *str)
-{
-    return basic_string_char_replace_cstr_len(this, off, len, str,
-            MSVCP_char_traits_char_length(str));
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIABV12@II@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0AEBV12@00@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_substr, 24)
-basic_string_char* __thiscall basic_string_char_replace_substr(basic_string_char *this, MSVCP_size_t off,
-        MSVCP_size_t len, const basic_string_char *str, MSVCP_size_t str_off, MSVCP_size_t str_len)
-{
-    if(str->size < str_off)
-        MSVCP__String_base_Xran();
-
-    if(str_len > str->size-str_off)
-        str_len = str->size-str_off;
-
-    return basic_string_char_replace_cstr_len(this, off, len,
-            basic_string_char_const_ptr(str)+str_off, str_len);
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIABV12@@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace, 16)
-basic_string_char* __thiscall basic_string_char_replace(basic_string_char *this,
-        MSVCP_size_t off, MSVCP_size_t len, const basic_string_char *str)
-{
-    return basic_string_char_replace_cstr_len(this, off, len,
-            basic_string_char_const_ptr(str), str->size);
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IIID@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K00D@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_ch, 20)
-basic_string_char* __thiscall basic_string_char_replace_ch(basic_string_char *this,
-        MSVCP_size_t off, MSVCP_size_t len, MSVCP_size_t count, char ch)
-{
-    char *ptr = basic_string_char_ptr(this);
-
-    TRACE("%p %ld %ld %ld %c\n", this, off, len, count, ch);
-
-    if(this->size < off)
-        MSVCP__String_base_Xran();
-
-    if(len > this->size-off)
-        len = this->size-off;
-
-    if(MSVCP_basic_string_char_npos-count <= this->size-len)
-        MSVCP__String_base_Xlen();
-
-    if(len < count) {
-        basic_string_char_grow(this, this->size-len+count, FALSE);
-        ptr = basic_string_char_ptr(this);
-    }
-
-    memmove(ptr+off+count, ptr+off+len, (this->size-off-len)*sizeof(char));
-    MSVCP_char_traits_char_assignn(ptr+off, count, ch);
-    basic_string_char_eos(this, this->size-len+count);
-
-    return this;
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@000@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@000@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_iter, 36)
-basic_string_char* __thiscall basic_string_char_replace_iter_iter(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end,
-        String_iterator_char res_beg, String_iterator_char res_end)
-{
-    String_iterator_char begin = { this, basic_string_char_ptr(this) };
-    return basic_string_char_replace_cstr_len(this,
-            MSVCP_basic_string_char_Pdif(beg, begin), MSVCP_basic_string_char_Pdif(end, beg),
-            res_beg.pos, MSVCP_basic_string_char_Pdif(res_end, res_beg));
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0ABV12@@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_bstr, 24)
-basic_string_char* __thiscall basic_string_char_replace_iter_bstr(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end, const basic_string_char *str)
-{
-    String_iterator_char begin = { this, basic_string_char_ptr(this) };
-    return basic_string_char_replace(this, MSVCP_basic_string_char_Pdif(beg, begin),
-            MSVCP_basic_string_char_Pdif(end, beg), str);
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0ID@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0_KD@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_ch, 28)
-basic_string_char* __thiscall basic_string_char_replace_iter_ch(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end, MSVCP_size_t count, char ch)
-{
-    String_iterator_char begin = { this, basic_string_char_ptr(this) };
-    return basic_string_char_replace_ch(this, MSVCP_basic_string_char_Pdif(beg, begin),
-            MSVCP_basic_string_char_Pdif(end, beg), count, ch);
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PBD1@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PEBD1@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_ptr_ptr, 28)
-basic_string_char* __thiscall basic_string_char_replace_iter_ptr_ptr(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end,
-        const char *res_beg, const char *res_end)
-{
-    String_iterator_char begin = { this, basic_string_char_ptr(this) };
-    return basic_string_char_replace_cstr_len(this, MSVCP_basic_string_char_Pdif(beg, begin),
-            MSVCP_basic_string_char_Pdif(end, beg), res_beg, res_end-res_beg);
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PBD@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PEBD@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_cstr, 24)
-basic_string_char* __thiscall basic_string_char_replace_iter_cstr(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end, const char *str)
-{
-    String_iterator_char begin = { this, basic_string_char_ptr(this) };
-    return basic_string_char_replace_cstr(this, MSVCP_basic_string_char_Pdif(beg, begin),
-            MSVCP_basic_string_char_Pdif(end, beg), str);
-}
-
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PBDI@Z */
-/* ?replace@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@0PEBD_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_replace_iter_cstr_len, 28)
-basic_string_char* __thiscall basic_string_char_replace_iter_cstr_len(basic_string_char *this,
-        String_iterator_char beg, String_iterator_char end, const char *str, MSVCP_size_t len)
-{
-    String_iterator_char begin = { this, basic_string_char_ptr(this) };
-    return basic_string_char_replace_cstr_len(this, MSVCP_basic_string_char_Pdif(beg, begin),
-            MSVCP_basic_string_char_Pdif(end, beg), str, len);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IABV12@@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KAEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert, 12)
-basic_string_char* __thiscall basic_string_char_insert(basic_string_char *this,
-        MSVCP_size_t off, const basic_string_char *str)
-{
-    return basic_string_char_replace(this, off, 0, str);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IABV12@II@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KAEBV12@00@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_substr, 20)
-basic_string_char* __thiscall basic_string_char_insert_substr(
-        basic_string_char *this, MSVCP_size_t off, const basic_string_char *str,
-        MSVCP_size_t str_off, MSVCP_size_t str_count)
-{
-    return basic_string_char_replace_substr(this, off, 0, str, str_off, str_count);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IPBD@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KPEBD@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_cstr, 12)
-basic_string_char* __thiscall basic_string_char_insert_cstr(
-        basic_string_char *this, MSVCP_size_t off, const char *str)
-{
-    return basic_string_char_replace_cstr(this, off, 0, str);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IPBDI@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_KPEBD0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_cstr_len, 16)
-basic_string_char* __thiscall basic_string_char_insert_cstr_len(basic_string_char *this,
-        MSVCP_size_t off, const char *str, MSVCP_size_t str_len)
-{
-    return basic_string_char_replace_cstr_len(this, off, 0, str, str_len);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@IID@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAAEAV12@_K0D@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_chn, 16)
-basic_string_char* __thiscall basic_string_char_insert_chn(basic_string_char *this,
-        MSVCP_size_t off, MSVCP_size_t count, char ch)
-{
-    return basic_string_char_replace_ch(this, off, 0, count, ch);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@ID@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@_KD@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_chn, 20)
-void __thiscall basic_string_char_insert_iter_chn(basic_string_char *this,
-        String_iterator_char where, MSVCP_size_t count, char ch)
-{
-    String_iterator_char iter = { this, basic_string_char_ptr(this) };
-    MSVCP_size_t off = MSVCP_basic_string_char_Pdif(where, iter);
-
-    basic_string_char_insert_chn(this, off, count, ch);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@D@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@D@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_ch, 20)
-String_iterator_char* __thiscall basic_string_char_insert_iter_ch(basic_string_char *this,
-        String_iterator_char *ret, String_iterator_char where, char ch)
-{
-    MSVCP_size_t off;
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_ptr(this);
-    off = MSVCP_basic_string_char_Pdif(where, *ret);
-
-    basic_string_char_insert_chn(this, off, 1, ch);
-    ret->pos = basic_string_char_ptr(this)+off;
-    return ret;
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_null, 16)
-String_iterator_char* __thiscall basic_string_char_insert_iter_null(basic_string_char *this,
-        String_iterator_char *ret, String_iterator_char where)
-{
-    return basic_string_char_insert_iter_ch(this, ret, where, 0);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@00@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@00@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_beg_end, 28)
-void __thiscall basic_string_char_insert_iter_beg_end(basic_string_char *this,
-        String_iterator_char where, String_iterator_char beg, String_iterator_char end)
-{
-    basic_string_char_replace_iter_iter(this, where, where, beg, end);
-}
-
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PBD1@Z */
-/* ?insert@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@PEBD1@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_char_insert_iter_ptr_ptr, 20)
-void __thiscall basic_string_char_insert_iter_ptr_ptr(basic_string_char *this,
-        String_iterator_char where, const char *beg, const char *end)
-{
-    basic_string_char_replace_iter_ptr_ptr(this, where, where, beg, end);
-}
-
-/* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXID@Z */
-/* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_KD@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_resize_ch, 12)
-void __thiscall MSVCP_basic_string_char_resize_ch(
-        basic_string_char *this, MSVCP_size_t size, char ch)
-{
-    TRACE("%p %lu %c\n", this, size, ch);
-
-    if(size <= this->size)
-        MSVCP_basic_string_char_erase(this, size, this->size);
-    else
-        MSVCP_basic_string_char_append_len_ch(this, size-this->size, ch);
-}
-
-/* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXI@Z */
-/* ?resize@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAX_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_resize, 8)
-void __thiscall MSVCP_basic_string_char_resize(
-        basic_string_char *this, MSVCP_size_t size)
-{
-    MSVCP_basic_string_char_resize_ch(this, size, '\0');
-}
-
-/* ?clear@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEXXZ */
-/* ?clear@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_clear, 4)
-void __thiscall MSVCP_basic_string_char_clear(basic_string_char *this)
-{
-    basic_string_char_eos(this, 0);
-}
-
-/* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?begin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_begin, 8)
-String_iterator_char* __thiscall MSVCP_basic_string_char_begin(
-        basic_string_char *this, String_iterator_char *ret)
-{
-    TRACE("%p\n", this);
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_const_ptr(this);
-    return ret;
-}
-
-/* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-/* ?end@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_end, 8)
-String_iterator_char* __thiscall MSVCP_basic_string_char_end(
-        basic_string_char *this, String_iterator_char *ret)
-{
-    TRACE("%p\n", this);
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_const_ptr(this)+this->size;
-    return ret;
-}
-
-/* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rbegin, 8)
-String_reverse_iterator_char* __thiscall MSVCP_basic_string_char_rbegin(
-        basic_string_char *this, String_reverse_iterator_char *ret)
-{
-    TRACE("%p\n", this);
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_const_ptr(this)+this->size;
-    return ret;
-}
-
-/* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_char_rend, 8)
-String_reverse_iterator_char* __thiscall MSVCP_basic_string_char_rend(
-        basic_string_char *this, String_reverse_iterator_char *ret)
-{
-    TRACE("%p\n", this);
-
-    ret->bstr = this;
-    ret->pos = basic_string_char_const_ptr(this);
-    return ret;
-}
-
-/* basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t>> */
-/* basic_string<unsigned short, char_traits<unsigned short>, allocator<unsigned short>> */
-/* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2IB */
-/* ?npos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@2_KB */
-/* ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2IB */
-/* ?npos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@2_KB */
-const MSVCP_size_t MSVCP_basic_string_wchar_npos = -1;
-
-/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ */
-/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAPEA_WXZ */
-/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEPAGXZ */
-/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAPEAGXZ */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_ptr, 4)
-wchar_t* __thiscall basic_string_wchar_ptr(basic_string_wchar *this)
-{
-    if(this->res == BUF_SIZE_WCHAR-1)
-        return this->data.buf;
-    return this->data.ptr;
-}
-
-/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IBEPB_WXZ */
-/* ?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEBAPEB_WXZ */
-/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IBEPBGXZ */
-/* ?_Myptr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEBAPEBGXZ */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_const_ptr, 4)
-const wchar_t* __thiscall basic_string_wchar_const_ptr(const basic_string_wchar *this)
-{
-    if(this->res == BUF_SIZE_WCHAR-1)
-        return this->data.buf;
-    return this->data.ptr;
-}
-
-/* ?_Eos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXI@Z */
-/* ?_Eos@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K@Z */
-/* ?_Eos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXI@Z */
-/* ?_Eos@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_eos, 8)
-void __thiscall basic_string_wchar_eos(basic_string_wchar *this, MSVCP_size_t len)
-{
-    static const wchar_t nullbyte_w = '\0';
-
-    this->size = len;
-    MSVCP_char_traits_wchar_assign(basic_string_wchar_ptr(this)+len, &nullbyte_w);
-}
-
-/* ?_Inside@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAE_NPB_W@Z */
-/* ?_Inside@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAA_NPEB_W@Z */
-/* ?_Inside@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAE_NPBG@Z */
-/* ?_Inside@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAA_NPEBG@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_inside, 8)
-MSVCP_bool __thiscall basic_string_wchar_inside(
-        basic_string_wchar *this, const wchar_t *ptr)
-{
-    wchar_t *cstr = basic_string_wchar_ptr(this);
-
-    return (ptr<cstr || ptr>=cstr+this->size) ? FALSE : TRUE;
-}
-
-/* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEX_NI@Z */
-/* ?_Tidy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_N_K@Z */
-/* ?_Tidy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEX_NI@Z */
-/* ?_Tidy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_N_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_tidy, 12)
-void __thiscall basic_string_wchar_tidy(basic_string_wchar *this,
-        MSVCP_bool built, MSVCP_size_t new_size)
-{
-    if(built && BUF_SIZE_WCHAR<=this->res) {
-        wchar_t *ptr = this->data.ptr;
-
-        if(new_size > 0)
-            MSVCP_char_traits_wchar__Copy_s(this->data.buf, BUF_SIZE_WCHAR, ptr, new_size);
-        MSVCP_allocator_wchar_deallocate(this->allocator, ptr, this->res+1);
-    }
-
-    this->res = BUF_SIZE_WCHAR-1;
-    basic_string_wchar_eos(this, new_size);
-}
-
-/* ?_Grow@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAE_NI_N@Z */
-/* ?_Grow@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAA_N_K_N@Z */
-/* ?_Grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAE_NI_N@Z */
-/* ?_Grow@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAA_N_K_N@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_grow, 12)
-MSVCP_bool __thiscall basic_string_wchar_grow(
-        basic_string_wchar *this, MSVCP_size_t new_size, MSVCP_bool trim)
-{
-    if(this->res < new_size) {
-        MSVCP_size_t new_res = new_size, len = this->size;
-        wchar_t *ptr;
-
-        new_res |= 0xf;
-
-        if(new_res/3 < this->res/2)
-            new_res = this->res + this->res/2;
-
-        ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_res+1);
-        if(!ptr)
-            ptr = MSVCP_allocator_wchar_allocate(this->allocator, new_size+1);
-        else
-            new_size = new_res;
-        if(!ptr) {
-            ERR("Out of memory\n");
-            basic_string_wchar_tidy(this, TRUE, 0);
-            return FALSE;
-        }
-
-        MSVCP_char_traits_wchar__Copy_s(ptr, new_size,
-                basic_string_wchar_ptr(this), this->size);
-        basic_string_wchar_tidy(this, TRUE, 0);
-        this->data.ptr = ptr;
-        this->res = new_size;
-        basic_string_wchar_eos(this, len);
-    } else if(trim && new_size < BUF_SIZE_WCHAR)
-        basic_string_wchar_tidy(this, TRUE,
-                new_size<this->size ? new_size : this->size);
-    else if(new_size == 0)
-        basic_string_wchar_eos(this, 0);
-
-    return (new_size>0);
-}
-
-/* ?_Copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXII@Z */
-/* ?_Copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K0@Z */
-/* ?_Copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXII@Z */
-/* ?_Copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar__Copy, 12)
-void __thiscall basic_string_wchar__Copy(basic_string_wchar *this,
-        MSVCP_size_t new_size, MSVCP_size_t copy_len)
-{
-    TRACE("%p %lu %lu\n", this, new_size, copy_len);
-
-    if(!basic_string_wchar_grow(this, new_size, FALSE))
-        return;
-    basic_string_wchar_eos(this, copy_len);
-}
-
-/* ?_Pdif@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@KAIV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?_Pdif@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@KA_KV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?_Pdif@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@KAIV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-/* ?_Pdif@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@KA_KV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-static MSVCP_size_t __cdecl MSVCP_basic_string_wchar_Pdif(String_iterator_wchar i1, String_iterator_wchar i2)
-{
-    TRACE("(%p %p) (%p %p)\n", i1.bstr, i1.pos, i2.bstr, i2.pos);
-
-    if((!i1.bstr && i1.pos) || i1.bstr!=i2.bstr) {
-        _invalid_parameter(NULL, NULL, NULL, 0, 0);
-        return 0;
-    }
-
-    return !i1.pos ? 0 : i1.pos-i2.pos;
-}
-
-/* ?get_allocator@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$allocator@_W@2@XZ */
-/* ?get_allocator@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$allocator@_W@2@XZ */
-/* ?get_allocator@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$allocator@G@2@XZ */
-/* ?get_allocator@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$allocator@G@2@XZ */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_get_allocator, 8)
-allocator* __thiscall basic_string_wchar_get_allocator(const basic_string_wchar *this, allocator *ret)
-{
-    TRACE("%p\n", this);
-    return ret;
-}
-
-/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II@Z */
-/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0@Z */
-/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@II@Z */
-/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_erase, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_erase(
-            basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t len)
-{
-    TRACE("%p %lu %lu\n", this, pos, len);
-
-    if(pos > this->size)
-        MSVCP__String_base_Xran();
-
-    if(len > this->size-pos)
-        len = this->size-pos;
-
-    if(len) {
-        MSVCP_char_traits_wchar__Move_s(basic_string_wchar_ptr(this)+pos,
-                this->res-pos, basic_string_wchar_ptr(this)+pos+len,
-                this->size-pos-len);
-        basic_string_wchar_eos(this, this->size-len);
-    }
-
-    return this;
-}
-
-/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_erase_iter_range, 24)
-String_iterator_wchar* __thiscall basic_string_wchar_erase_iter_range(basic_string_wchar *this,
-        String_iterator_wchar *ret, String_iterator_wchar beg, String_iterator_wchar end)
-{
-    MSVCP_size_t off;
-
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_ptr(this);
-    off = MSVCP_basic_string_wchar_Pdif(beg, *ret);
-
-    MSVCP_basic_string_wchar_erase(this, off, MSVCP_basic_string_wchar_Pdif(end, beg));
-
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_ptr(this)+off;
-    return ret;
-}
-
-/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?erase@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-/* ?erase@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_erase_iter, 16)
-String_iterator_wchar* __thiscall basic_string_wchar_erase_iter(basic_string_wchar *this,
-        String_iterator_wchar *ret, String_iterator_wchar pos)
-{
-    MSVCP_size_t off;
-
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_ptr(this);
-    off = MSVCP_basic_string_wchar_Pdif(pos, *ret);
-
-    MSVCP_basic_string_wchar_erase(this, off, 1);
-
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_ptr(this)+off;
-    return ret;
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@II@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@II@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_substr, 16)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_substr(
-            basic_string_wchar *this, const basic_string_wchar *assign,
-            MSVCP_size_t pos, MSVCP_size_t len)
-{
-    TRACE("%p %p %lu %lu\n", this, assign, pos, len);
-
-    if(assign->size < pos)
-        MSVCP__String_base_Xran();
-
-    if(len > assign->size-pos)
-        len = assign->size-pos;
-
-    if(this == assign) {
-        MSVCP_basic_string_wchar_erase(this, pos+len, MSVCP_basic_string_wchar_npos);
-        MSVCP_basic_string_wchar_erase(this, 0, pos);
-    } else if(basic_string_wchar_grow(this, len, FALSE)) {
-        MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this),
-                this->res, basic_string_wchar_const_ptr(assign)+pos, len);
-        basic_string_wchar_eos(this, len);
-    }
-
-    return this;
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@@Z */
-/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@AEBV01@@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@@Z */
-/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign(
-            basic_string_wchar *this, const basic_string_wchar *assign)
-{
-    return MSVCP_basic_string_wchar_assign_substr(this, assign,
-            0, MSVCP_basic_string_wchar_npos);
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W_K@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBGI@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_cstr_len, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_cstr_len(
-            basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len)
-{
-    TRACE("%p %s %lu\n", this, debugstr_wn(str, len), len);
-
-    if(basic_string_wchar_inside(this, str))
-        return MSVCP_basic_string_wchar_assign_substr(this, this,
-                str-basic_string_wchar_ptr(this), len);
-    else if(basic_string_wchar_grow(this, len, FALSE)) {
-        MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this),
-                this->res, str, len);
-        basic_string_wchar_eos(this, len);
-    }
-
-    return this;
-}
-
-/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@_W@Z */
-/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@_W@Z */
-/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@G@Z */
-/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@G@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_ch, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_ch(
-        basic_string_wchar *this, wchar_t ch)
-{
-    return MSVCP_basic_string_wchar_assign_cstr_len(this, &ch, 1);
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W@Z */
-/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z */
-/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@PEB_W@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG@Z */
-/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@PBG@Z */
-/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@PEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_cstr, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_cstr(
-            basic_string_wchar *this, const wchar_t *str)
-{
-    return MSVCP_basic_string_wchar_assign_cstr_len(this, str,
-            MSVCP_char_traits_wchar_length(str));
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@I_W@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K_W@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IG@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assignn, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assignn(
-        basic_string_wchar *this, MSVCP_size_t count, wchar_t ch)
-{
-    TRACE("%p %ld %c\n", this, count, ch);
-
-    basic_string_wchar_grow(this, count, FALSE);
-    MSVCP_char_traits_wchar_assignn(basic_string_wchar_ptr(this), count, ch);
-    basic_string_wchar_eos(this, count);
-    return this;
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W0@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W0@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG0@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_ptr_ptr, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_ptr_ptr(
-        basic_string_wchar *this, const wchar_t *first, const wchar_t *last)
-{
-    return MSVCP_basic_string_wchar_assign_cstr_len(this, first, last-first);
-}
-
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_assign_iter, 20)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_assign_iter(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end)
-{
-    return MSVCP_basic_string_wchar_assign_ptr_ptr(this, beg.pos, end.pos);
-}
-
-/* ?_Chassign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEXII_W@Z */
-/* ?_Chassign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IEAAX_K0_W@Z */
-/* ?_Chassign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IAEXIIG@Z */
-/* ?_Chassign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@IEAAX_K0G@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_Chassign, 16)
-void __thiscall MSVCP_basic_string_wchar_Chassign(basic_string_wchar *this,
-        MSVCP_size_t off, MSVCP_size_t count, wchar_t ch)
-{
-    TRACE("%p %lu %lu %c\n", this, off, count, ch);
-    MSVCP_char_traits_wchar_assignn(basic_string_wchar_ptr(this)+off, count, ch);
-}
-
-/* ?_Copy_s@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPA_WIII@Z */
-/* ?_Copy_s@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEA_W_K11@Z */
-/* ?_Copy_s@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPAGIII@Z */
-/* ?_Copy_s@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEAG_K11@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_Copy_s, 20)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_Copy_s(const basic_string_wchar *this,
-        wchar_t *dest, MSVCP_size_t size, MSVCP_size_t count, MSVCP_size_t off)
-{
-    TRACE("%p %p %lu %lu %lu\n", this, dest, size, count, off);
-
-    if(this->size < off)
-        MSVCP__String_base_Xran();
-
-    if(count > this->size-off)
-        count = this->size-off;
-
-    MSVCP_char_traits_wchar__Copy_s(dest, size,
-            basic_string_wchar_const_ptr(this)+off, count);
-    return count;
-}
-
-/* ?copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPA_WII@Z */
-/* ?copy@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEA_W_K1@Z */
-/* ?copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPAGII@Z */
-/* ?copy@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEAG_K1@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_copy, 16)
-MSVCP_size_t __thiscall basic_string_wchar_copy(const basic_string_wchar *this,
-        wchar_t *dest, MSVCP_size_t count, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_Copy_s(this, dest, count, count, off);
-}
-
-/* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */
-/* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */
-/* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */
-/* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */
-/* ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ */
-/* ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ */
-/* ?data@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ */
-/* ?data@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_c_str, 4)
-const wchar_t* __thiscall MSVCP_basic_string_wchar_c_str(const basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-    return basic_string_wchar_const_ptr(this);
-}
-
-/* ?capacity@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
-/* ?capacity@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
-/* ?capacity@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
-/* ?capacity@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_capacity, 4)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_capacity(basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-    return this->res;
-}
-
-/* ?reserve@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXI@Z */
-/* ?reserve@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_K@Z */
-/* ?reserve@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXI@Z */
-/* ?reserve@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAX_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_reserve, 8)
-void __thiscall MSVCP_basic_string_wchar_reserve(basic_string_wchar *this, MSVCP_size_t size)
-{
-    MSVCP_size_t len;
-
-    TRACE("%p %ld\n", this, size);
-
-    len = this->size;
-    if(len > size)
-        return;
-
-    basic_string_wchar_grow(this, size, FALSE);
-    basic_string_wchar_eos(this, len);
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor, 4)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor(basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_copy_ctor, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_copy_ctor(
-            basic_string_wchar *this, const basic_string_wchar *copy)
-{
-    TRACE("%p %p\n", this, copy);
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    MSVCP_basic_string_wchar_assign(this, copy);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBG@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr(
-            basic_string_wchar *this, const wchar_t *str)
-{
-    TRACE("%p %s\n", this, debugstr_w(str));
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    MSVCP_basic_string_wchar_assign_cstr(this, str);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WABV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_WAEBV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGABV?$allocator@G@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBGAEBV?$allocator@G@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr_alloc, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_alloc(
-        basic_string_wchar *this, const wchar_t *str, const void *alloc)
-{
-    return MSVCP_basic_string_wchar_ctor_cstr(this, str);
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WI@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W_K@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGI@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr_len, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_len(
-        basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len)
-{
-    TRACE("%p %s %ld\n", this, debugstr_wn(str, len), len);
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    MSVCP_basic_string_wchar_assign_cstr_len(this, str, len);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WIABV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W_KAEBV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGIABV?$allocator@G@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG_KAEBV?$allocator@G@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_cstr_len_alloc, 16)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_cstr_len_alloc(
-        basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len, const void *alloc)
-{
-    return MSVCP_basic_string_wchar_ctor_cstr_len(this, str, len);
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@II@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@_K1@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@II@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_substr, 16)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_substr(
-        basic_string_wchar *this, const basic_string_wchar *assign,
-        MSVCP_size_t pos, MSVCP_size_t len)
-{
-    TRACE("%p %p %lu %lu\n", this, assign, pos, len);
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    MSVCP_basic_string_wchar_assign_substr(this, assign, pos, len);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV01@IIABV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV01@_K1AEBV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV01@IIABV?$allocator@G@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV01@_K1AEBV?$allocator@G@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_substr_alloc, 20)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_substr_alloc(
-        basic_string_wchar *this, const basic_string_wchar *assign,
-        MSVCP_size_t pos, MSVCP_size_t len, const void *alloc)
-{
-    return MSVCP_basic_string_wchar_ctor_substr(this, assign, pos, len);
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@ABV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@AEBV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@ABV?$allocator@G@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@AEBV?$allocator@G@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_alloc, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_alloc(
-        basic_string_wchar *this, const void *alloc)
-{
-    TRACE("%p %p\n", this, alloc);
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@I_W@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@_K_W@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@IG@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@_KG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_ch, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_ch(basic_string_wchar *this,
-        MSVCP_size_t count, wchar_t ch)
-{
-    TRACE("%p %ld %c\n", this, count, ch);
-
-    basic_string_wchar_tidy(this, FALSE, 0);
-    MSVCP_basic_string_wchar_assignn(this, count, ch);
-    return this;
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@I_WABV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@_K_WAEBV?$allocator@_W@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@IGABV?$allocator@G@1@@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@_KGAEBV?$allocator@G@1@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_ch_alloc, 16)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_ch_alloc(basic_string_wchar *this,
-        MSVCP_size_t count, wchar_t ch, const void *alloc)
-{
-    return MSVCP_basic_string_wchar_ctor_ch(this, count, ch);
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W0@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W0@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBG0@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_ptr_ptr, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_ptr_ptr(basic_string_wchar *this,
-        const wchar_t *first, const wchar_t *last)
-{
-    return MSVCP_basic_string_wchar_ctor_cstr_len(this, first, last-first);
-}
-
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@0@Z */
-/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@1@0@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@1@0@Z */
-/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@1@0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_ctor_iter, 20)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_ctor_iter(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end)
-{
-    return MSVCP_basic_string_wchar_ctor_cstr_len(this, beg.pos, end.pos-beg.pos);
-}
-
-/* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */
-/* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */
-/* ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ */
-/* ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_dtor, 4)
-void __thiscall MSVCP_basic_string_wchar_dtor(basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-    basic_string_wchar_tidy(this, TRUE, 0);
-}
-
-/* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
-/* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
-/* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
-/* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
-/* ?size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
-/* ?size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
-/* ?length@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
-/* ?length@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_length, 4)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_length(const basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-    return this->size;
-}
-
-/* ?max_size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
-/* ?max_size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
-/* ?max_size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
-/* ?max_size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_max_size, 4)
-MSVCP_size_t __thiscall basic_string_wchar_max_size(const basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-    return MSVCP_allocator_wchar_max_size(this->allocator)-1;
-}
-
-/* ?empty@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE_NXZ */
-/* ?empty@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_NXZ */
-/* ?empty@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE_NXZ */
-/* ?empty@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_NXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_empty, 4)
-MSVCP_bool __thiscall MSVCP_basic_string_wchar_empty(basic_string_wchar *this)
-{
-    TRACE("%p\n", this);
-    return this->size == 0;
-}
-
-/* ?swap@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXAAV12@@Z */
-/* ?swap@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXAEAV12@@Z */
-/* ?swap@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXAAV12@@Z */
-/* ?swap@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXAEAV12@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_swap, 8)
-void __thiscall MSVCP_basic_string_wchar_swap(basic_string_wchar *this, basic_string_wchar *str)
-{
-    if(this != str) {
-        char tmp[sizeof(this->data)];
-        const MSVCP_size_t size = this->size;
-        const MSVCP_size_t res = this->res;
-
-        memcpy(tmp, this->data.buf, sizeof(this->data));
-        memcpy(this->data.buf, str->data.buf, sizeof(this->data));
-        memcpy(str->data.buf, tmp, sizeof(this->data));
-
-        this->size = str->size;
-        this->res = str->res;
-
-        str->size = size;
-        str->res = res;
-    }
-}
-
-/* ?substr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV12@II@Z */
-/* ?substr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV12@_K0@Z */
-/* ?substr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV12@II@Z */
-/* ?substr@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV12@_K0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_substr, 16)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_substr(basic_string_wchar *this,
-        basic_string_wchar *ret, MSVCP_size_t off, MSVCP_size_t len)
-{
-    TRACE("%p %lu %lu\n", this, off, len);
-
-    MSVCP_basic_string_wchar_ctor_substr(ret, this, off, len);
-    return ret;
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@II@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@II@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_substr, 16)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_substr(basic_string_wchar *this,
-        const basic_string_wchar *append, MSVCP_size_t offset, MSVCP_size_t count)
-{
-    TRACE("%p %p %lu %lu\n", this, append, offset, count);
-
-    if(append->size < offset)
-        MSVCP__String_base_Xran();
-
-    if(count > append->size-offset)
-        count = append->size-offset;
-
-    if(MSVCP_basic_string_wchar_npos-this->size<=count || this->size+count<this->size)
-        MSVCP__String_base_Xlen();
-
-    if(basic_string_wchar_grow(this, this->size+count, FALSE)) {
-        MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this)+this->size,
-                this->res-this->size, basic_string_wchar_const_ptr(append)+offset, count);
-        basic_string_wchar_eos(this, this->size+count);
-    }
-
-    return this;
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@@Z */
-/* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@ABV01@@Z */
-/* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@AEBV01@@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@@Z */
-/* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@ABV01@@Z */
-/* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@AEBV01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append(
-            basic_string_wchar *this, const basic_string_wchar *append)
-{
-    return MSVCP_basic_string_wchar_append_substr(this, append,
-            0, MSVCP_basic_string_wchar_npos);
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W_K@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBGI@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_cstr_len, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_cstr_len(
-        basic_string_wchar *this, const wchar_t *append, MSVCP_size_t count)
-{
-    TRACE("%p %s %lu\n", this, debugstr_wn(append, count), count);
-
-    if(basic_string_wchar_inside(this, append))
-        return MSVCP_basic_string_wchar_append_substr(this, this,
-                append-basic_string_wchar_ptr(this), count);
-
-    if(MSVCP_basic_string_wchar_npos-this->size<=count || this->size+count<this->size)
-        MSVCP__String_base_Xlen();
-
-    if(basic_string_wchar_grow(this, this->size+count, FALSE)) {
-        MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this)+this->size,
-                this->res-this->size, append, count);
-        basic_string_wchar_eos(this, this->size+count);
-    }
-
-    return this;
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W@Z */
-/* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z */
-/* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@PEB_W@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG@Z */
-/* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@PBG@Z */
-/* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@PEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_cstr, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_cstr(
-        basic_string_wchar *this, const wchar_t *append)
-{
-    return MSVCP_basic_string_wchar_append_cstr_len(this, append,
-            MSVCP_char_traits_wchar_length(append));
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W0@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W0@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG0@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_beg_end, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_beg_end(
-        basic_string_wchar *this, const wchar_t *beg, const wchar_t *end)
-{
-    return MSVCP_basic_string_wchar_append_cstr_len(this, beg, end-beg);
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_iter, 20)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_iter(
-        basic_string_wchar *this, String_iterator_wchar beg, String_iterator_wchar end)
-{
-    return MSVCP_basic_string_wchar_append_cstr_len(this, beg.pos, end.pos-beg.pos);
-}
-
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@I_W@Z */
-/* ?append@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K_W@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IG@Z */
-/* ?append@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_len_ch, 12)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_len_ch(
-        basic_string_wchar *this, MSVCP_size_t count, wchar_t ch)
-{
-    TRACE("%p %lu %c\n", this, count, ch);
-
-    if(MSVCP_basic_string_wchar_npos-this->size <= count)
-        MSVCP__String_base_Xlen();
-
-    if(basic_string_wchar_grow(this, this->size+count, FALSE)) {
-        MSVCP_char_traits_wchar_assignn(basic_string_wchar_ptr(this)+this->size, count, ch);
-        basic_string_wchar_eos(this, this->size+count);
-    }
-
-    return this;
-}
-
-/* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@_W@Z */
-/* ??Y?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@_W@Z */
-/* ?push_back@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEX_W@Z */
-/* ?push_back@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_W@Z */
-/* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@G@Z */
-/* ??Y?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@G@Z */
-/* ?push_back@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXG@Z */
-/* ?push_back@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_append_ch, 8)
-basic_string_wchar* __thiscall MSVCP_basic_string_wchar_append_ch(
-        basic_string_wchar *this, wchar_t ch)
-{
-    return MSVCP_basic_string_wchar_append_len_ch(this, 1, ch);
-}
-
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIPB_WI@Z */
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0PEB_W0@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIPBGI@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0PEBG0@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr_cstr_len, 20)
-int __thiscall MSVCP_basic_string_wchar_compare_substr_cstr_len(
-        const basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t num,
-        const wchar_t *str, MSVCP_size_t count)
-{
-    int ans;
-
-    TRACE("%p %lu %lu %s %lu\n", this, pos, num, debugstr_wn(str, count), count);
-
-    if(this->size < pos)
-        MSVCP__String_base_Xran();
-
-    if(num > this->size-pos)
-        num = this->size-pos;
-
-    ans = MSVCP_char_traits_wchar_compare(basic_string_wchar_const_ptr(this)+pos,
-            str, num>count ? count : num);
-    if(ans)
-        return ans;
-
-    if(num > count)
-        ans = 1;
-    else if(num < count)
-        ans = -1;
-    return ans;
-}
-
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIPB_W@Z */
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0PEB_W@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIPBG@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0PEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr_cstr, 16)
-int __thiscall MSVCP_basic_string_wchar_compare_substr_cstr(const basic_string_wchar *this,
-        MSVCP_size_t pos, MSVCP_size_t num, const wchar_t *str)
-{
-    return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, pos, num,
-            str, MSVCP_char_traits_wchar_length(str));
-}
-
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHPB_W@Z */
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAHPEB_W@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHPBG@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAHPEBG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_cstr, 8)
-int __thiscall MSVCP_basic_string_wchar_compare_cstr(
-        const basic_string_wchar *this, const wchar_t *str)
-{
-    return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, 0, this->size,
-            str, MSVCP_char_traits_wchar_length(str));
-}
-
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIABV12@II@Z */
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0AEBV12@00@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIABV12@II@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0AEBV12@00@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr_substr, 24)
-int __thiscall MSVCP_basic_string_wchar_compare_substr_substr(
-        const basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t num,
-        const basic_string_wchar *compare, MSVCP_size_t off, MSVCP_size_t count)
-{
-    TRACE("%p %lu %lu %p %lu %lu\n", this, pos, num, compare, off, count);
-
-    if(compare->size < off)
-        MSVCP__String_base_Xran();
-
-    if(count > compare->size-off)
-        count = compare->size-off;
-
-    return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, pos, num,
-            basic_string_wchar_const_ptr(compare)+off, count);
-}
-
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHIIABV12@@Z */
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAH_K0AEBV12@@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHIIABV12@@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAH_K0AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare_substr, 16)
-int __thiscall MSVCP_basic_string_wchar_compare_substr(
-        const basic_string_wchar *this, MSVCP_size_t pos, MSVCP_size_t num,
-        const basic_string_wchar *compare)
-{
-    return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, pos, num,
-            basic_string_wchar_const_ptr(compare), compare->size);
-}
-
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEHABV12@@Z */
-/* ?compare@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAHAEBV12@@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEHABV12@@Z */
-/* ?compare@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAHAEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_compare, 8)
-int __thiscall MSVCP_basic_string_wchar_compare(
-        const basic_string_wchar *this, const basic_string_wchar *compare)
-{
-    return MSVCP_basic_string_wchar_compare_substr_cstr_len(this, 0, this->size,
-            basic_string_wchar_const_ptr(compare), compare->size);
-}
-
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_cstr_substr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos, MSVCP_size_t len)
-{
-    const wchar_t *p, *end;
-
-    TRACE("%p %s %lu %lu\n", this, debugstr_wn(find, len), pos, len);
-
-    if(len==0 && pos<=this->size)
-        return pos;
-
-    end = basic_string_wchar_const_ptr(this)+this->size-len+1;
-    for(p=basic_string_wchar_const_ptr(this)+pos; p<end; p++) {
-        p = MSVCP_char_traits_wchar_find(p, end-p, find);
-        if(!p)
-            break;
-
-        if(!MSVCP_char_traits_wchar_compare(p, find, len))
-            return p-basic_string_wchar_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_wchar_npos;
-}
-
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_cstr_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_cstr_off(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_wchar_find_cstr_substr(this, find, pos,
-            MSVCP_char_traits_wchar_length(find));
-}
-
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_off(
-        const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_cstr_substr(this,
-            basic_string_wchar_const_ptr(find), off, find->size);
-}
-
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
-/* ?find@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
-/* ?find@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_ch(
-        const basic_string_wchar *this, wchar_t ch, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_wchar_find_cstr_substr(this, &ch, pos, 1);
-}
-
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_cstr_substr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos, MSVCP_size_t len)
-{
-    const wchar_t *p, *end;
-
-    TRACE("%p %s %lu %lu\n", this, debugstr_wn(find, len), pos, len);
-
-    if(len==0)
-        return pos<this->size ? pos : this->size;
-
-    if(len > this->size)
-        return MSVCP_basic_string_wchar_npos;
-
-    if(pos > this->size-len+1)
-        pos = this->size-len+1;
-    end = basic_string_wchar_const_ptr(this);
-    for(p=end+pos; p>=end; p--) {
-        if(*p==*find && !MSVCP_char_traits_wchar_compare(p, find, len))
-            return p-basic_string_wchar_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_wchar_npos;
-}
-
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_cstr_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_cstr_off(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_wchar_rfind_cstr_substr(this, find, pos,
-            MSVCP_char_traits_wchar_length(find));
-}
-
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_off, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_off(
-        const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_rfind_cstr_substr(this,
-            basic_string_wchar_const_ptr(find), off, find->size);
-}
-
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
-/* ?rfind@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
-/* ?rfind@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rfind_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_rfind_ch(
-        const basic_string_wchar *this, wchar_t ch, MSVCP_size_t pos)
-{
-    return MSVCP_basic_string_wchar_rfind_cstr_substr(this, &ch, pos, 1);
-}
-
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_cstr_substr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const wchar_t *p, *end;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(len>0 && off<this->size) {
-        end = basic_string_wchar_const_ptr(this)+this->size;
-        for(p=basic_string_wchar_const_ptr(this)+off; p<end; p++)
-            if(MSVCP_char_traits_wchar_find(find, len, p))
-                return p-basic_string_wchar_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_wchar_npos;
-}
-
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of(
-        const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_first_of_cstr_substr(this,
-            basic_string_wchar_const_ptr(find), off, find->size);
-}
-
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_cstr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_first_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_wchar_length(find));
-}
-
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
-/* ?find_first_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
-/* ?find_first_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_of_ch(
-        const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_first_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const wchar_t *p, *end;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(off<this->size) {
-        end = basic_string_wchar_const_ptr(this)+this->size;
-        for(p=basic_string_wchar_const_ptr(this)+off; p<end; p++)
-            if(!MSVCP_char_traits_wchar_find(find, len, p))
-                return p-basic_string_wchar_const_ptr(this);
-    }
-
-    return MSVCP_basic_string_wchar_npos;
-}
-
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of(
-        const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(this,
-            basic_string_wchar_const_ptr(find), off, find->size);
-}
-
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of_cstr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_wchar_length(find));
-}
-
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
-/* ?find_first_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
-/* ?find_first_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_first_not_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_first_not_of_ch(
-        const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_first_not_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_cstr_substr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const wchar_t *p, *beg;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-
-    if(len>0 && this->size>0) {
-        if(off >= this->size)
-            off = this->size-1;
-
-        beg = basic_string_wchar_const_ptr(this);
-        for(p=beg+off; p>=beg; p--)
-            if(MSVCP_char_traits_wchar_find(find, len, p))
-                return p-beg;
-    }
-
-    return MSVCP_basic_string_wchar_npos;
-}
-
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of(
-        const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_last_of_cstr_substr(this,
-            basic_string_wchar_const_ptr(find), off, find->size);
-}
-
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_cstr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_last_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_wchar_length(find));
-}
-
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
-/* ?find_last_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
-/* ?find_last_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_of_ch(
-        const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_last_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WII@Z */
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K1@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGII@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K1@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of_cstr_substr, 16)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off, MSVCP_size_t len)
-{
-    const wchar_t *p, *beg;
-
-    TRACE("%p %p %lu %lu\n", this, find, off, len);
-
-    if(len>0 && this->size>0) {
-        if(off >= this->size)
-            off = this->size-1;
-
-        beg = basic_string_wchar_const_ptr(this);
-        for(p=beg+off; p>=beg; p--)
-            if(!MSVCP_char_traits_wchar_find(find, len, p))
-                return p-beg;
-    }
-
-    return MSVCP_basic_string_wchar_npos;
-}
-
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIABV12@I@Z */
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KAEBV12@_K@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIABV12@I@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KAEBV12@_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of(
-        const basic_string_wchar *this, const basic_string_wchar *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(this,
-            basic_string_wchar_const_ptr(find), off, find->size);
-}
-
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIPB_WI@Z */
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KPEB_W_K@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIPBGI@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KPEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of_cstr, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of_cstr(
-        const basic_string_wchar *this, const wchar_t *find, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(
-            this, find, off, MSVCP_char_traits_wchar_length(find));
-}
-
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEI_WI@Z */
-/* ?find_last_not_of@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_K_W_K@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIGI@Z */
-/* ?find_last_not_of@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_find_last_not_of_ch, 12)
-MSVCP_size_t __thiscall MSVCP_basic_string_wchar_find_last_not_of_ch(
-        const basic_string_wchar *this, wchar_t ch, MSVCP_size_t off)
-{
-    return MSVCP_basic_string_wchar_find_last_not_of_cstr_substr(this, &ch, off, 1);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIPB_WI@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0PEB_W0@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIPBGI@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0PEBG0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_cstr_len, 20)
-basic_string_wchar* __thiscall basic_string_wchar_replace_cstr_len(basic_string_wchar *this,
-        MSVCP_size_t off, MSVCP_size_t len, const wchar_t *str, MSVCP_size_t str_len)
+/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@ABV12@II@Z */
+/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
+/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@ABV12@II@Z */
+/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@AEBV12@_K1@Z */
+static basic_string_wchar* MSVCP_basic_string_wchar_assign_substr(
+            basic_string_wchar *this, const basic_string_wchar *assign,
+            MSVCP_size_t pos, MSVCP_size_t len)
 {
-    MSVCP_size_t inside_pos = -1;
-    wchar_t *ptr = basic_string_wchar_ptr(this);
-
-    TRACE("%p %ld %ld %p %ld\n", this, off, len, str, str_len);
+    TRACE("%p %p %lu %lu\n", this, assign, pos, len);
 
-    if(this->size < off)
+    if(assign->size < pos)
         MSVCP__String_base_Xran();
 
-    if(len > this->size-off)
-        len = this->size-off;
-
-    if(MSVCP_basic_string_wchar_npos-str_len <= this->size-len)
-        MSVCP__String_base_Xlen();
-
-    if(basic_string_wchar_inside(this, str))
-        inside_pos = str-ptr;
-
-    if(len < str_len) {
-        basic_string_wchar_grow(this, this->size-len+str_len, FALSE);
-        ptr = basic_string_wchar_ptr(this);
-    }
-
-    if(inside_pos == -1) {
-        memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
-        memcpy(ptr+off, str, str_len*sizeof(wchar_t));
-    } else if(len >= str_len) {
-        memmove(ptr+off, ptr+inside_pos, str_len*sizeof(wchar_t));
-        memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
-    } else {
-        MSVCP_size_t size;
-
-        memmove(ptr+off+str_len, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
-
-        if(inside_pos < off+len) {
-            size = off+len-inside_pos;
-            if(size > str_len)
-                size = str_len;
-            memmove(ptr+off, ptr+inside_pos, size*sizeof(wchar_t));
-        } else {
-            size = 0;
-        }
+    if(len > assign->size-pos)
+        len = assign->size-pos;
 
-        if(str_len > size)
-            memmove(ptr+off+size, ptr+off+str_len, (str_len-size)*sizeof(wchar_t));
+    if(this == assign) {
+        MSVCP_basic_string_wchar_erase(this, pos+len, MSVCP_basic_string_wchar_npos);
+        MSVCP_basic_string_wchar_erase(this, 0, pos);
+    } else if(basic_string_wchar_grow(this, len, FALSE)) {
+        MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this),
+                this->res, basic_string_wchar_const_ptr(assign)+pos, len);
+        basic_string_wchar_eos(this, len);
     }
 
-    basic_string_wchar_eos(this, this->size-len+str_len);
     return this;
 }
 
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIPB_W@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0PEB_W@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIPBG@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0PEBG@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_cstr, 16)
-basic_string_wchar* __thiscall basic_string_wchar_replace_cstr(basic_string_wchar *this,
-        MSVCP_size_t off, MSVCP_size_t len, const wchar_t *str)
-{
-    return basic_string_wchar_replace_cstr_len(this, off, len, str,
-            MSVCP_char_traits_wchar_length(str));
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIABV12@II@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0AEBV12@00@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIABV12@II@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0AEBV12@00@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_substr, 24)
-basic_string_wchar* __thiscall basic_string_wchar_replace_substr(basic_string_wchar *this, MSVCP_size_t off,
-        MSVCP_size_t len, const basic_string_wchar *str, MSVCP_size_t str_off, MSVCP_size_t str_len)
-{
-    if(str->size < str_off)
-        MSVCP__String_base_Xran();
-
-    if(str_len > str->size-str_off)
-        str_len = str->size-str_off;
-
-    return basic_string_wchar_replace_cstr_len(this, off, len,
-            basic_string_wchar_const_ptr(str)+str_off, str_len);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IIABV12@@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0AEBV12@@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIABV12@@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace, 16)
-basic_string_wchar* __thiscall basic_string_wchar_replace(basic_string_wchar *this,
-        MSVCP_size_t off, MSVCP_size_t len, const basic_string_wchar *str)
-{
-    return basic_string_wchar_replace_cstr_len(this, off, len,
-            basic_string_wchar_const_ptr(str), str->size);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@III_W@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K00_W@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIIG@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K00G@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_ch, 20)
-basic_string_wchar* __thiscall basic_string_wchar_replace_ch(basic_string_wchar *this,
-        MSVCP_size_t off, MSVCP_size_t len, MSVCP_size_t count, wchar_t ch)
+/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_WI@Z */
+/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W_K@Z */
+/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBGI@Z */
+/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG_K@Z */
+static basic_string_wchar* MSVCP_basic_string_wchar_assign_cstr_len(
+            basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len)
 {
-    wchar_t *ptr = basic_string_wchar_ptr(this);
-
-    TRACE("%p %ld %ld %ld %c\n", this, off, len, count, ch);
-
-    if(this->size < off)
-        MSVCP__String_base_Xran();
-
-    if(len > this->size-off)
-        len = this->size-off;
-
-    if(MSVCP_basic_string_wchar_npos-count <= this->size-len)
-        MSVCP__String_base_Xlen();
+    TRACE("%p %s %lu\n", this, debugstr_wn(str, len), len);
 
-    if(len < count) {
-        basic_string_wchar_grow(this, this->size-len+count, FALSE);
-        ptr = basic_string_wchar_ptr(this);
+    if(basic_string_wchar_inside(this, str))
+        return MSVCP_basic_string_wchar_assign_substr(this, this,
+                str-basic_string_wchar_ptr(this), len);
+    else if(basic_string_wchar_grow(this, len, FALSE)) {
+        MSVCP_char_traits_wchar__Copy_s(basic_string_wchar_ptr(this),
+                this->res, str, len);
+        basic_string_wchar_eos(this, len);
     }
 
-    memmove(ptr+off+count, ptr+off+len, (this->size-off-len)*sizeof(wchar_t));
-    MSVCP_char_traits_wchar_assignn(ptr+off, count, ch);
-    basic_string_wchar_eos(this, this->size-len+count);
-
     return this;
 }
 
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@000@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@000@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@000@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@000@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_iter, 36)
-basic_string_wchar* __thiscall basic_string_wchar_replace_iter_iter(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end,
-                String_iterator_wchar res_beg, String_iterator_wchar res_end)
-{
-    String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
-    return basic_string_wchar_replace_cstr_len(this,
-            MSVCP_basic_string_wchar_Pdif(beg, begin), MSVCP_basic_string_wchar_Pdif(end, beg),
-            res_beg.pos, MSVCP_basic_string_wchar_Pdif(res_end, res_beg));
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0ABV12@@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0AEBV12@@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0ABV12@@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0AEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_bstr, 24)
-basic_string_wchar* __thiscall basic_string_wchar_replace_iter_bstr(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end, const basic_string_wchar *str)
-{
-    String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
-    return basic_string_wchar_replace(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
-            MSVCP_basic_string_wchar_Pdif(end, beg), str);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0I_W@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0_K_W@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0IG@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0_KG@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_ch, 28)
-basic_string_wchar* __thiscall basic_string_wchar_replace_iter_ch(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end, MSVCP_size_t count, wchar_t ch)
-{
-    String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
-    return basic_string_wchar_replace_ch(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
-            MSVCP_basic_string_wchar_Pdif(end, beg), count, ch);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PB_W1@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PEB_W1@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PBG1@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PEBG1@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_ptr_ptr, 28)
-basic_string_wchar* __thiscall basic_string_wchar_replace_iter_ptr_ptr(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end,
-        const wchar_t *res_beg, const wchar_t *res_end)
-{
-    String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
-    return basic_string_wchar_replace_cstr_len(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
-            MSVCP_basic_string_wchar_Pdif(end, beg), res_beg, res_end-res_beg);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PB_W@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PEB_W@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PBG@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PEBG@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_cstr, 24)
-basic_string_wchar* __thiscall basic_string_wchar_replace_iter_cstr(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end, const wchar_t *str)
-{
-    String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
-    return basic_string_wchar_replace_cstr(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
-            MSVCP_basic_string_wchar_Pdif(end, beg), str);
-}
-
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PB_WI@Z */
-/* ?replace@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@0PEB_W_K@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PBGI@Z */
-/* ?replace@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@0PEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_replace_iter_cstr_len, 28)
-basic_string_wchar* __thiscall basic_string_wchar_replace_iter_cstr_len(basic_string_wchar *this,
-        String_iterator_wchar beg, String_iterator_wchar end, const wchar_t *str, MSVCP_size_t len)
-{
-    String_iterator_wchar begin = { this, basic_string_wchar_ptr(this) };
-    return basic_string_wchar_replace_cstr_len(this, MSVCP_basic_string_wchar_Pdif(beg, begin),
-            MSVCP_basic_string_wchar_Pdif(end, beg), str, len);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IABV12@@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KAEBV12@@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IABV12@@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KAEBV12@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert, 12)
-basic_string_wchar* __thiscall basic_string_wchar_insert(basic_string_wchar *this,
-        MSVCP_size_t off, const basic_string_wchar *str)
-{
-    return basic_string_wchar_replace(this, off, 0, str);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IABV12@II@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KAEBV12@00@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IABV12@II@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KAEBV12@00@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_substr, 20)
-basic_string_wchar* __thiscall basic_string_wchar_insert_substr(
-        basic_string_wchar *this, MSVCP_size_t off, const basic_string_wchar *str,
-        MSVCP_size_t str_off, MSVCP_size_t str_count)
-{
-    return basic_string_wchar_replace_substr(this, off, 0, str, str_off, str_count);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IPB_W@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KPEB_W@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IPBG@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KPEBG@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_cstr, 12)
-basic_string_wchar* __thiscall basic_string_wchar_insert_cstr(
-        basic_string_wchar *this, MSVCP_size_t off, const wchar_t *str)
-{
-    return basic_string_wchar_replace_cstr(this, off, 0, str);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@IPB_WI@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_KPEB_W0@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IPBGI@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_KPEBG0@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_cstr_len, 16)
-basic_string_wchar* __thiscall basic_string_wchar_insert_cstr_len(basic_string_wchar *this,
-        MSVCP_size_t off, const wchar_t *str, MSVCP_size_t str_len)
-{
-    return basic_string_wchar_replace_cstr_len(this, off, 0, str, str_len);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@II_W@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@_K0_W@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@IIG@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@_K0G@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_chn, 16)
-basic_string_wchar* __thiscall basic_string_wchar_insert_chn(basic_string_wchar *this,
-        MSVCP_size_t off, MSVCP_size_t count, wchar_t ch)
-{
-    return basic_string_wchar_replace_ch(this, off, 0, count, ch);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@I_W@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@_K_W@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@IG@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@_KG@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_chn, 20)
-void __thiscall basic_string_wchar_insert_iter_chn(basic_string_wchar *this,
-        String_iterator_wchar where, MSVCP_size_t count, wchar_t ch)
-{
-    String_iterator_wchar iter = { this, basic_string_wchar_ptr(this) };
-    MSVCP_size_t off = MSVCP_basic_string_wchar_Pdif(where, iter);
-
-    basic_string_wchar_insert_chn(this, off, count, ch);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@_W@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@_W@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@G@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@G@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_ch, 20)
-String_iterator_wchar* __thiscall basic_string_wchar_insert_iter_ch(basic_string_wchar *this,
-        String_iterator_wchar *ret, String_iterator_wchar where, wchar_t ch)
-{
-    MSVCP_size_t off;
-
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_ptr(this);
-    off = MSVCP_basic_string_wchar_Pdif(where, *ret);
-
-    basic_string_wchar_insert_chn(this, off, 1, ch);
-    ret->pos = basic_string_wchar_ptr(this)+off;
-    return ret;
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_null, 16)
-String_iterator_wchar* __thiscall basic_string_wchar_insert_iter_null(basic_string_wchar *this,
-        String_iterator_wchar *ret, String_iterator_wchar where)
-{
-    return basic_string_wchar_insert_iter_ch(this, ret, where, 0);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@00@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@00@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@00@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@00@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_beg_end, 28)
-void __thiscall basic_string_wchar_insert_iter_beg_end(basic_string_wchar *this,
-        String_iterator_wchar where, String_iterator_wchar beg, String_iterator_wchar end)
-{
-    basic_string_wchar_replace_iter_iter(this, where, where, beg, end);
-}
-
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PB_W1@Z */
-/* ?insert@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@PEB_W1@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PBG1@Z */
-/* ?insert@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@PEBG1@Z */
-DEFINE_THISCALL_WRAPPER(basic_string_wchar_insert_iter_ptr_ptr, 20)
-void __thiscall basic_string_wchar_insert_iter_ptr_ptr(basic_string_wchar *this,
-        String_iterator_wchar where, const wchar_t *beg, const wchar_t *end)
-{
-    basic_string_wchar_replace_iter_ptr_ptr(this, where, where, beg, end);
-}
-
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z */
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_W_K@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGI@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at, 8)
-wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at(
-        basic_string_wchar *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    assert(this->size >= pos);
-    return basic_string_wchar_ptr(this)+pos;
-}
-
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEAB_WI@Z */
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAAEB_W_K@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGI@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAAEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_const_operator_at, 8)
-const wchar_t* __thiscall MSVCP_basic_string_wchar_const_operator_at(
-        const basic_string_wchar *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    assert(this->size >= pos);
-    return basic_string_wchar_const_ptr(this)+pos;
-}
-
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_WU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAGU_Size_type_nosscl@01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_at_noverify, 8)
-wchar_t* __thiscall MSVCP_basic_string_wchar_operator_at_noverify(
-        basic_string_wchar *this, size_t_noverify pos)
-{
-    TRACE("%p %lu\n", this, pos.val);
-    return basic_string_wchar_ptr(this)+pos.val;
-}
-
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEAB_WU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAAEB_WU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGU_Size_type_nosscl@01@@Z */
-/* ??A?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAAEBGU_Size_type_nosscl@01@@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_operator_const_at_noverify, 8)
-const wchar_t* __thiscall MSVCP_basic_string_wchar_operator_const_at_noverify(
-        const basic_string_wchar *this, size_t_noverify pos)
-{
-    TRACE("%p %lu\n", this, pos.val);
-    return basic_string_wchar_const_ptr(this)+pos.val;
-}
-
-/* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAA_WI@Z */
-/* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEA_W_K@Z */
-/* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAGI@Z */
-/* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_at, 8)
-wchar_t* __thiscall MSVCP_basic_string_wchar_at(
-        basic_string_wchar *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    if(this->size <= pos)
-        MSVCP__String_base_Xran();
-
-    return basic_string_wchar_ptr(this)+pos;
-}
-
-/* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEAB_WI@Z */
-/* ?at@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAAEB_W_K@Z */
-/* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEABGI@Z */
-/* ?at@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAAEBG_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_const_at, 8)
-const wchar_t* __thiscall MSVCP_basic_string_wchar_const_at(
-        const basic_string_wchar *this, MSVCP_size_t pos)
-{
-    TRACE("%p %lu\n", this, pos);
-
-    if(this->size <= pos)
-        MSVCP__String_base_Xran();
-
-    return basic_string_wchar_const_ptr(this)+pos;
-}
-
-/* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXI_W@Z */
-/* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_K_W@Z */
-/* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXIG@Z */
-/* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAX_KG@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_resize_ch, 12)
-void __thiscall MSVCP_basic_string_wchar_resize_ch(
-        basic_string_wchar *this, MSVCP_size_t size, wchar_t ch)
-{
-    TRACE("%p %lu %c\n", this, size, ch);
-
-    if(size <= this->size)
-        MSVCP_basic_string_wchar_erase(this, size, this->size);
-    else
-        MSVCP_basic_string_wchar_append_len_ch(this, size-this->size, ch);
-}
-
-/* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXI@Z */
-/* ?resize@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAX_K@Z */
-/* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXI@Z */
-/* ?resize@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAX_K@Z */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_resize, 8)
-void __thiscall MSVCP_basic_string_wchar_resize(
-        basic_string_wchar *this, MSVCP_size_t size)
-{
-    MSVCP_basic_string_wchar_resize_ch(this, size, '\0');
-}
-
-/* ?clear@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEXXZ */
-/* ?clear@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAXXZ */
-/* ?clear@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEXXZ */
-/* ?clear@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_clear, 4)
-void __thiscall MSVCP_basic_string_wchar_clear(basic_string_wchar *this)
+/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV12@PB_W@Z */
+/* ?assign@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV12@PEB_W@Z */
+/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAEAAV01@PB_W@Z */
+/* ??4?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAAAEAV01@PEB_W@Z */
+/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV12@PBG@Z */
+/* ?assign@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV12@PEBG@Z */
+/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAEAAV01@PBG@Z */
+/* ??4?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAAAEAV01@PEBG@Z */
+static basic_string_wchar* MSVCP_basic_string_wchar_assign_cstr(
+            basic_string_wchar *this, const wchar_t *str)
 {
-    basic_string_wchar_eos(this, 0);
+    return MSVCP_basic_string_wchar_assign_cstr_len(this, str,
+            MSVCP_char_traits_wchar_length(str));
 }
 
-/* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?begin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?begin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_begin, 8)
-String_iterator_wchar* __thiscall MSVCP_basic_string_wchar_begin(
-        basic_string_wchar *this, String_iterator_wchar *ret)
+/* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */
+/* ?c_str@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */
+/* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEPB_WXZ */
+/* ?data@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBAPEB_WXZ */
+/* ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ */
+/* ?c_str@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ */
+/* ?data@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEPBGXZ */
+/* ?data@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBAPEBGXZ */
+const wchar_t* MSVCP_basic_string_wchar_c_str(const basic_string_wchar *this)
 {
     TRACE("%p\n", this);
-
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_const_ptr(this);
-    return ret;
+    return basic_string_wchar_const_ptr(this);
 }
 
-/* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?end@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@2@XZ */
-/* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-/* ?end@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_end, 8)
-String_iterator_wchar* __thiscall MSVCP_basic_string_wchar_end(
-        basic_string_wchar *this, String_iterator_wchar *ret)
+/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */
+/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */
+/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ */
+/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ */
+basic_string_wchar* MSVCP_basic_string_wchar_ctor(basic_string_wchar *this)
 {
     TRACE("%p\n", this);
 
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_const_ptr(this)+this->size;
-    return ret;
+    basic_string_wchar_tidy(this, FALSE, 0);
+    return this;
 }
 
-/* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-/* ?rbegin@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rbegin, 8)
-String_reverse_iterator_wchar* __thiscall MSVCP_basic_string_wchar_rbegin(
-        basic_string_wchar *this, String_reverse_iterator_wchar *ret)
+/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_W@Z */
+/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W@Z */
+/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBG@Z */
+/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG@Z */
+basic_string_wchar* MSVCP_basic_string_wchar_ctor_cstr(
+            basic_string_wchar *this, const wchar_t *str)
 {
-    TRACE("%p\n", this);
+    TRACE("%p %s\n", this, debugstr_w(str));
 
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_const_ptr(this)+this->size;
-    return ret;
+    basic_string_wchar_tidy(this, FALSE, 0);
+    MSVCP_basic_string_wchar_assign_cstr(this, str);
+    return this;
 }
 
-/* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA?AV?$reverse_iterator@V?$_String_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBE?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-/* ?rend@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA?AV?$reverse_iterator@V?$_String_const_iterator@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@XZ */
-DEFINE_THISCALL_WRAPPER(MSVCP_basic_string_wchar_rend, 8)
-String_reverse_iterator_wchar* __thiscall MSVCP_basic_string_wchar_rend(
-        basic_string_wchar *this, String_reverse_iterator_wchar *ret)
+/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@PB_WI@Z */
+/* ??0?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@PEB_W_K@Z */
+/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@PBGI@Z */
+/* ??0?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@PEBG_K@Z */
+basic_string_wchar* MSVCP_basic_string_wchar_ctor_cstr_len(
+        basic_string_wchar *this, const wchar_t *str, MSVCP_size_t len)
 {
-    TRACE("%p\n", this);
+    TRACE("%p %s %ld\n", this, debugstr_wn(str, len), len);
 
-    ret->bstr = this;
-    ret->pos = basic_string_wchar_const_ptr(this);
-    return ret;
+    basic_string_wchar_tidy(this, FALSE, 0);
+    MSVCP_basic_string_wchar_assign_cstr_len(this, str, len);
+    return this;
 }
 
-/* _String_val class */
-/* ??_F?$_String_val@DV?$allocator@D@std@@@std@@QAEXXZ */
-/* ??_F?$_String_val@DV?$allocator@D@std@@@std@@QEAAXXZ */
-/* ??_F?$_String_val@GV?$allocator@G@std@@@std@@QAEXXZ */
-/* ??_F?$_String_val@GV?$allocator@G@std@@@std@@QEAAXXZ */
-/* ??_F?$_String_val@_WV?$allocator@_W@std@@@std@@QAEXXZ */
-/* ??_F?$_String_val@_WV?$allocator@_W@std@@@std@@QEAAXXZ */
-DEFINE_THISCALL_WRAPPER(_String_val_ctor, 4)
-void* __thiscall _String_val_ctor(void *this)
+/* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QAE@XZ */
+/* ??1?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEAA@XZ */
+/* ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QAE@XZ */
+/* ??1?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEAA@XZ */
+void MSVCP_basic_string_wchar_dtor(basic_string_wchar *this)
 {
     TRACE("%p\n", this);
-    return this;
+    basic_string_wchar_tidy(this, TRUE, 0);
 }
 
-/* ??0?$_String_val@DV?$allocator@D@std@@@std@@IAE@V?$allocator@D@1@@Z */
-/* ??0?$_String_val@DV?$allocator@D@std@@@std@@IEAA@V?$allocator@D@1@@Z */
-/* ??0?$_String_val@GV?$allocator@G@std@@@std@@IAE@V?$allocator@G@1@@Z */
-/* ??0?$_String_val@GV?$allocator@G@std@@@std@@IEAA@V?$allocator@G@1@@Z */
-/* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@IAE@V?$allocator@_W@1@@Z */
-/* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@IEAA@V?$allocator@_W@1@@Z */
-/* ??0?$_String_val@DV?$allocator@D@std@@@std@@QAE@ABV01@@Z */
-/* ??0?$_String_val@DV?$allocator@D@std@@@std@@QEAA@AEBV01@@Z */
-/* ??0?$_String_val@GV?$allocator@G@std@@@std@@QAE@ABV01@@Z */
-/* ??0?$_String_val@GV?$allocator@G@std@@@std@@QEAA@AEBV01@@Z */
-/* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@QAE@ABV01@@Z */
-/* ??0?$_String_val@_WV?$allocator@_W@std@@@std@@QEAA@AEBV01@@Z */
-/* ??4?$_String_val@DV?$allocator@D@std@@@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$_String_val@DV?$allocator@D@std@@@std@@QEAAAEAV01@AEBV01@@Z */
-/* ??4?$_String_val@GV?$allocator@G@std@@@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$_String_val@GV?$allocator@G@std@@@std@@QEAAAEAV01@AEBV01@@Z */
-/* ??4?$_String_val@_WV?$allocator@_W@std@@@std@@QAEAAV01@ABV01@@Z */
-/* ??4?$_String_val@_WV?$allocator@_W@std@@@std@@QEAAAEAV01@AEBV01@@Z */
-/* ??4?$_String_val@DV?$allocator@D@std@@@std@@QAEAAV01@ABV01@@Z */
-DEFINE_THISCALL_WRAPPER(_String_val_null_ctor, 8)
-void* __thiscall _String_val_null_ctor(void *this, const void *misc)
+/* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
+/* ?size@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
+/* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QBEIXZ */
+/* ?length@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@QEBA_KXZ */
+/* ?size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
+/* ?size@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
+/* ?length@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QBEIXZ */
+/* ?length@?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@QEBA_KXZ */
+MSVCP_size_t MSVCP_basic_string_wchar_length(const basic_string_wchar *this)
 {
-    TRACE("%p %p\n", this, misc);
-    return this;
+    TRACE("%p\n", this);
+    return this->size;
 }
-- 
GitLab