[3/4] msvcirt: Add predefined streams.

Iván Matellanes matellanesivan at gmail.com
Wed Aug 17 05:57:38 CDT 2016


Signed-off-by: Iván Matellanes <matellanesivan at gmail.com>
---
 dlls/msvcirt/msvcirt.c       | 63 +++++++++++++++++++++++++++++++++++--
 dlls/msvcirt/msvcirt.spec    |  8 ++---
 dlls/msvcirt/tests/msvcirt.c | 75 +++++++++++++++++++++++++++++++++++++++++---
 dlls/msvcrt20/msvcrt20.spec  |  8 ++---
 dlls/msvcrt40/msvcrt40.spec  |  8 ++---
 5 files changed, 143 insertions(+), 19 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index 4597060..536fbad 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -59,8 +59,7 @@ const LONG ios_basefield = FLAGS_dec | FLAGS_oct | FLAGS_hex;
 /* ?floatfield at ios@@2JB */
 const LONG ios_floatfield = FLAGS_scientific | FLAGS_fixed;
 /* ?fLockcInit at ios@@0HA */
-/* FIXME: should be initialized to 0 and increased on construction of cin, cout, cerr and clog */
-int ios_fLockcInit = 4;
+int ios_fLockcInit = 0;
 /* ?x_lockc at ios@@0U_CRT_CRITICAL_SECTION@@A */
 extern CRITICAL_SECTION ios_static_lock;
 CRITICAL_SECTION_DEBUG ios_static_lock_debug =
@@ -287,6 +286,21 @@ DEFINE_RTTI_DATA4(iostream, sizeof(iostream),
     &istream_rtti_base_descriptor, &ios_rtti_base_descriptor,
     &ostream_rtti_base_descriptor, &ios_rtti_base_descriptor, ".?AViostream@@")
 
+/* ?cin@@3Vistream_withassign@@A */
+struct {
+    istream is;
+    ios vbase;
+} cin = { { 0 } };
+
+/* ?cout@@3Vostream_withassign@@A */
+/* ?cerr@@3Vostream_withassign@@A */
+/* ?clog@@3Vostream_withassign@@A */
+struct {
+    ostream os;
+    ios vbase;
+} cout = { { 0 } }, cerr = { { 0 } }, clog = { { 0 } };
+
+
 /* ??0streambuf@@IAE at PADH@Z */
 /* ??0streambuf@@IEAA at PEADH@Z */
 DEFINE_THISCALL_WRAPPER(streambuf_reserve_ctor, 12)
@@ -4040,7 +4054,7 @@ void* __thiscall Iostream_init_ios_ctor(void *this, ios *obj, int n)
     TRACE("(%p %p %d)\n", this, obj, n);
     obj->delbuf = 1;
     if (n >= 0) {
-        obj->tie = NULL; /* FIXME: tie to cout */
+        obj->tie = &cout.os;
         if (n > 0)
             ios_setf(obj, FLAGS_unitbuf);
     }
@@ -4141,6 +4155,8 @@ static void init_cxx_funcs(void)
 
 static void init_io(void *base)
 {
+    filebuf *fb;
+
 #ifdef __x86_64__
     init_streambuf_rtti(base);
     init_filebuf_rtti(base);
@@ -4153,6 +4169,43 @@ static void init_io(void *base)
     init_istream_withassign_rtti(base);
     init_iostream_rtti(base);
 #endif
+
+    if ((fb = MSVCRT_operator_new(sizeof(filebuf)))) {
+        filebuf_fd_ctor(fb, 0);
+        istream_sb_ctor(&cin.is, &fb->base, TRUE);
+    } else
+        istream_sb_ctor(&cin.is, NULL, TRUE);
+    Iostream_init_ios_ctor(NULL, &cin.vbase, 0);
+
+    if ((fb = MSVCRT_operator_new(sizeof(filebuf)))) {
+        filebuf_fd_ctor(fb, 1);
+        ostream_sb_ctor(&cout.os, &fb->base, TRUE);
+    } else
+        ostream_sb_ctor(&cout.os, NULL, TRUE);
+    Iostream_init_ios_ctor(NULL, &cout.vbase, -1);
+
+    if ((fb = MSVCRT_operator_new(sizeof(filebuf)))) {
+        filebuf_fd_ctor(fb, 2);
+        ostream_sb_ctor(&cerr.os, &fb->base, TRUE);
+    } else
+        ostream_sb_ctor(&cerr.os, NULL, TRUE);
+    Iostream_init_ios_ctor(NULL, &cerr.vbase, 1);
+
+    if ((fb = MSVCRT_operator_new(sizeof(filebuf)))) {
+        filebuf_fd_ctor(fb, 2);
+        ostream_sb_ctor(&clog.os, &fb->base, TRUE);
+    } else
+        ostream_sb_ctor(&clog.os, NULL, TRUE);
+    Iostream_init_ios_ctor(NULL, &clog.vbase, 0);
+}
+
+static void free_io(void)
+{
+    /* destructors take care of deleting the buffers */
+    istream_vbase_dtor(&cin.is);
+    ostream_vbase_dtor(&cout.os);
+    ostream_vbase_dtor(&cerr.os);
+    ostream_vbase_dtor(&clog.os);
 }
 
 BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
@@ -4167,6 +4220,10 @@ BOOL WINAPI DllMain( HINSTANCE inst, DWORD reason, LPVOID reserved )
        init_io(inst);
        DisableThreadLibraryCalls( inst );
        break;
+   case DLL_PROCESS_DETACH:
+       if (reserved) break;
+       free_io();
+       break;
    }
    return TRUE;
 }
diff --git a/dlls/msvcirt/msvcirt.spec b/dlls/msvcirt/msvcirt.spec
index 7b67bc7..369e5f3 100644
--- a/dlls/msvcirt/msvcirt.spec
+++ b/dlls/msvcirt/msvcirt.spec
@@ -419,11 +419,11 @@
 @ cdecl ?bitalloc at ios@@SAJXZ() ios_bitalloc
 @ thiscall -arch=win32 ?blen at streambuf@@IBEHXZ(ptr) streambuf_blen
 @ cdecl -arch=win64 ?blen at streambuf@@IEBAHXZ(ptr) streambuf_blen
-@ stub ?cerr@@3Vostream_withassign@@A  # class ostream_withassign cerr
-@ stub ?cin@@3Vistream_withassign@@A  # class istream_withassign cin
+@ extern ?cerr@@3Vostream_withassign@@A cerr
+@ extern ?cin@@3Vistream_withassign@@A cin
 @ thiscall -arch=win32 ?clear at ios@@QAEXH at Z(ptr long) ios_clear
 @ cdecl -arch=win64 ?clear at ios@@QEAAXH at Z(ptr long) ios_clear
-@ stub ?clog@@3Vostream_withassign@@A  # class ostream_withassign clog
+@ extern ?clog@@3Vostream_withassign@@A clog
 @ thiscall -arch=win32 ?close at filebuf@@QAEPAV1 at XZ(ptr) filebuf_close
 @ cdecl -arch=win64 ?close at filebuf@@QEAAPEAV1 at XZ(ptr) filebuf_close
 @ stub -arch=win32 ?close at fstream@@QAEXXZ  # void __thiscall fstream::close(void)
@@ -436,7 +436,7 @@
 @ cdecl -arch=win64 ?clrlock at ios@@QEAAXXZ(ptr) ios_clrlock
 @ thiscall -arch=win32 ?clrlock at streambuf@@QAEXXZ(ptr) streambuf_clrlock
 @ cdecl -arch=win64 ?clrlock at streambuf@@QEAAXXZ(ptr) streambuf_clrlock
-@ stub ?cout@@3Vostream_withassign@@A  # class ostream_withassign cout
+@ extern ?cout@@3Vostream_withassign@@A cout
 @ thiscall -arch=win32 ?dbp at streambuf@@QAEXXZ(ptr) streambuf_dbp
 @ cdecl -arch=win64 ?dbp at streambuf@@QEAAXXZ(ptr) streambuf_dbp
 @ cdecl -arch=win32 ?dec@@YAAAVios@@AAV1@@Z(ptr) ios_dec
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 1e046f8..a4871c8 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -387,7 +387,8 @@ static iostream* (*__thiscall p_iostream_assign)(iostream*, const iostream*);
 static void* (*__thiscall p_Iostream_init_ios_ctor)(void*, ios*, int);
 
 /* Predefined streams */
-static ostream *p_cout;
+static istream *p_cin;
+static ostream *p_cout, *p_cerr, *p_clog;
 
 /* Emulate a __thiscall */
 #ifdef __i386__
@@ -830,7 +831,10 @@ static BOOL init(void)
     SET(p_ios_statebuf, "?x_statebuf at ios@@0PAJA");
     SET(p_ios_xalloc, "?xalloc at ios@@SAHXZ");
     SET(p_ios_fLockcInit, "?fLockcInit at ios@@0HA");
+    SET(p_cin, "?cin@@3Vistream_withassign@@A");
     SET(p_cout, "?cout@@3Vostream_withassign@@A");
+    SET(p_cerr, "?cerr@@3Vostream_withassign@@A");
+    SET(p_clog, "?clog@@3Vostream_withassign@@A");
 
     init_thiscall_thunk();
     return TRUE;
@@ -6059,7 +6063,6 @@ static void test_Iostream_init(void)
     ok(ios_obj.special[0] == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.special[0]);
     ok(ios_obj.special[1] == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.special[1]);
     ok(ios_obj.delbuf == 1, "expected 1 got %d\n", ios_obj.delbuf);
-todo_wine
     ok(ios_obj.tie == p_cout, "expected %p got %p\n", p_cout, ios_obj.tie);
     ok(ios_obj.flags == 0xabababab, "expected %d got %x\n", 0xabababab, ios_obj.flags);
     ok(ios_obj.precision == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.precision);
@@ -6111,7 +6114,6 @@ if (0) /* crashes on native */
     ok(ios_obj.special[0] == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.special[0]);
     ok(ios_obj.special[1] == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.special[1]);
     ok(ios_obj.delbuf == 1, "expected 1 got %d\n", ios_obj.delbuf);
-todo_wine
     ok(ios_obj.tie == p_cout, "expected %p got %p\n", p_cout, ios_obj.tie);
     ok(ios_obj.flags == (0xcdcdcdcd|FLAGS_unitbuf), "expected %d got %x\n",
         0xcdcdcdcd|FLAGS_unitbuf, ios_obj.flags);
@@ -6130,7 +6132,6 @@ todo_wine
     ok(ios_obj.special[0] == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.special[0]);
     ok(ios_obj.special[1] == 0xabababab, "expected %d got %d\n", 0xabababab, ios_obj.special[1]);
     ok(ios_obj.delbuf == 1, "expected 1 got %d\n", ios_obj.delbuf);
-todo_wine
     ok(ios_obj.tie == p_cout, "expected %p got %p\n", p_cout, ios_obj.tie);
     ok(ios_obj.flags == (0xcdcdcdcd|FLAGS_unitbuf), "expected %d got %x\n",
         0xcdcdcdcd|FLAGS_unitbuf, ios_obj.flags);
@@ -6140,6 +6141,71 @@ todo_wine
     ok(ios_obj.do_lock == 0x34343434, "expected %d got %d\n", 0x34343434, ios_obj.do_lock);
 }
 
+static void test_std_streams(void)
+{
+    filebuf *pfb_cin = (filebuf*) p_cin->base_ios.sb;
+    filebuf *pfb_cout = (filebuf*) p_cout->base_ios.sb;
+    filebuf *pfb_cerr = (filebuf*) p_cerr->base_ios.sb;
+    filebuf *pfb_clog = (filebuf*) p_clog->base_ios.sb;
+
+    ok(p_cin->extract_delim == 0, "expected 0 got %d\n", p_cin->extract_delim);
+    ok(p_cin->count == 0, "expected 0 got %d\n", p_cin->count);
+    ok(p_cin->base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, p_cin->base_ios.state);
+    ok(p_cin->base_ios.delbuf == 1, "expected 1 got %d\n", p_cin->base_ios.delbuf);
+    ok(p_cin->base_ios.tie == p_cout, "expected %p got %p\n", p_cout, p_cin->base_ios.tie);
+    ok(p_cin->base_ios.flags == FLAGS_skipws, "expected %x got %x\n", FLAGS_skipws, p_cin->base_ios.flags);
+    ok(p_cin->base_ios.precision == 6, "expected 6 got %d\n", p_cin->base_ios.precision);
+    ok(p_cin->base_ios.fill == ' ', "expected 32 got %d\n", p_cin->base_ios.fill);
+    ok(p_cin->base_ios.width == 0, "expected 0 got %d\n", p_cin->base_ios.width);
+    ok(p_cin->base_ios.do_lock == -1, "expected -1 got %d\n", p_cin->base_ios.do_lock);
+    ok(pfb_cin->fd == 0, "wrong fd, expected 0 got %d\n", pfb_cin->fd);
+    ok(pfb_cin->close == 0, "wrong value, expected 0 got %d\n", pfb_cin->close);
+    ok(pfb_cin->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb_cin->base.allocated);
+    ok(pfb_cin->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb_cin->base.unbuffered);
+
+    ok(p_cout->unknown == 0, "expected 0 got %d\n", p_cout->unknown);
+    ok(p_cout->base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, p_cout->base_ios.state);
+    ok(p_cout->base_ios.delbuf == 1, "expected 1 got %d\n", p_cout->base_ios.delbuf);
+    ok(p_cout->base_ios.tie == NULL, "expected %p got %p\n", NULL, p_cout->base_ios.tie);
+    ok(p_cout->base_ios.flags == 0, "expected 0 got %x\n", p_cout->base_ios.flags);
+    ok(p_cout->base_ios.precision == 6, "expected 6 got %d\n", p_cout->base_ios.precision);
+    ok(p_cout->base_ios.fill == ' ', "expected 32 got %d\n", p_cout->base_ios.fill);
+    ok(p_cout->base_ios.width == 0, "expected 0 got %d\n", p_cout->base_ios.width);
+    ok(p_cout->base_ios.do_lock == -1, "expected -1 got %d\n", p_cout->base_ios.do_lock);
+    ok(pfb_cout->fd == 1, "wrong fd, expected 1 got %d\n", pfb_cout->fd);
+    ok(pfb_cout->close == 0, "wrong value, expected 0 got %d\n", pfb_cout->close);
+    ok(pfb_cout->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb_cout->base.allocated);
+    ok(pfb_cout->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb_cout->base.unbuffered);
+
+    ok(p_cerr->unknown == 0, "expected 0 got %d\n", p_cerr->unknown);
+    ok(p_cerr->base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, p_cerr->base_ios.state);
+    ok(p_cerr->base_ios.delbuf == 1, "expected 1 got %d\n", p_cerr->base_ios.delbuf);
+    ok(p_cerr->base_ios.tie == p_cout, "expected %p got %p\n", p_cout, p_cerr->base_ios.tie);
+    ok(p_cerr->base_ios.flags == FLAGS_unitbuf, "expected %x got %x\n", FLAGS_unitbuf, p_cerr->base_ios.flags);
+    ok(p_cerr->base_ios.precision == 6, "expected 6 got %d\n", p_cerr->base_ios.precision);
+    ok(p_cerr->base_ios.fill == ' ', "expected 32 got %d\n", p_cerr->base_ios.fill);
+    ok(p_cerr->base_ios.width == 0, "expected 0 got %d\n", p_cerr->base_ios.width);
+    ok(p_cerr->base_ios.do_lock == -1, "expected -1 got %d\n", p_cerr->base_ios.do_lock);
+    ok(pfb_cerr->fd == 2, "wrong fd, expected 2 got %d\n", pfb_cerr->fd);
+    ok(pfb_cerr->close == 0, "wrong value, expected 0 got %d\n", pfb_cerr->close);
+    ok(pfb_cerr->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb_cerr->base.allocated);
+    ok(pfb_cerr->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb_cerr->base.unbuffered);
+
+    ok(p_clog->unknown == 0, "expected 0 got %d\n", p_clog->unknown);
+    ok(p_clog->base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, p_clog->base_ios.state);
+    ok(p_clog->base_ios.delbuf == 1, "expected 1 got %d\n", p_clog->base_ios.delbuf);
+    ok(p_clog->base_ios.tie == p_cout, "expected %p got %p\n", p_cout, p_clog->base_ios.tie);
+    ok(p_clog->base_ios.flags == 0, "expected 0 got %x\n", p_clog->base_ios.flags);
+    ok(p_clog->base_ios.precision == 6, "expected 6 got %d\n", p_clog->base_ios.precision);
+    ok(p_clog->base_ios.fill == ' ', "expected 32 got %d\n", p_clog->base_ios.fill);
+    ok(p_clog->base_ios.width == 0, "expected 0 got %d\n", p_clog->base_ios.width);
+    ok(p_clog->base_ios.do_lock == -1, "expected -1 got %d\n", p_clog->base_ios.do_lock);
+    ok(pfb_clog->fd == 2, "wrong fd, expected 2 got %d\n", pfb_clog->fd);
+    ok(pfb_clog->close == 0, "wrong value, expected 0 got %d\n", pfb_clog->close);
+    ok(pfb_clog->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb_clog->base.allocated);
+    ok(pfb_clog->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb_clog->base.unbuffered);
+}
+
 START_TEST(msvcirt)
 {
     if(!init())
@@ -6160,6 +6226,7 @@ START_TEST(msvcirt)
     test_istream_withassign();
     test_iostream();
     test_Iostream_init();
+    test_std_streams();
 
     FreeLibrary(msvcrt);
     FreeLibrary(msvcirt);
diff --git a/dlls/msvcrt20/msvcrt20.spec b/dlls/msvcrt20/msvcrt20.spec
index fad156b..f34c367 100644
--- a/dlls/msvcrt20/msvcrt20.spec
+++ b/dlls/msvcrt20/msvcrt20.spec
@@ -407,11 +407,11 @@
 @ cdecl ?bitalloc at ios@@SAJXZ() msvcirt.?bitalloc at ios@@SAJXZ
 @ thiscall -arch=win32 ?blen at streambuf@@IBEHXZ(ptr) msvcirt.?blen at streambuf@@IBEHXZ
 @ cdecl -arch=win64 ?blen at streambuf@@IEBAHXZ(ptr) msvcirt.?blen at streambuf@@IEBAHXZ
-@ stub ?cerr@@3Vostream_withassign@@A
-@ stub ?cin@@3Vistream_withassign@@A
+@ extern ?cerr@@3Vostream_withassign@@A msvcirt.?cerr@@3Vostream_withassign@@A
+@ extern ?cin@@3Vistream_withassign@@A msvcirt.?cin@@3Vistream_withassign@@A
 @ thiscall -arch=win32 ?clear at ios@@QAEXH at Z(ptr long) msvcirt.?clear at ios@@QAEXH at Z
 @ cdecl -arch=win64 ?clear at ios@@QEAAXH at Z(ptr long) msvcirt.?clear at ios@@QEAAXH at Z
-@ stub ?clog@@3Vostream_withassign@@A
+@ extern ?clog@@3Vostream_withassign@@A msvcirt.?clog@@3Vostream_withassign@@A
 @ thiscall -arch=win32 ?close at filebuf@@QAEPAV1 at XZ(ptr) msvcirt.?close at filebuf@@QAEPAV1 at XZ
 @ cdecl -arch=win64 ?close at filebuf@@QEAAPEAV1 at XZ(ptr) msvcirt.?close at filebuf@@QEAAPEAV1 at XZ
 @ stub -arch=win32 ?close at fstream@@QAEXXZ
@@ -424,7 +424,7 @@
 @ cdecl -arch=win64 ?clrlock at ios@@QEAAXXZ(ptr) msvcirt.?clrlock at ios@@QEAAXXZ
 @ thiscall -arch=win32 ?clrlock at streambuf@@QAEXXZ(ptr) msvcirt.?clrlock at streambuf@@QAEXXZ
 @ cdecl -arch=win64 ?clrlock at streambuf@@QEAAXXZ(ptr) msvcirt.?clrlock at streambuf@@QEAAXXZ
-@ stub ?cout@@3Vostream_withassign@@A
+@ extern ?cout@@3Vostream_withassign@@A msvcirt.?cout@@3Vostream_withassign@@A
 @ thiscall -arch=win32 ?dbp at streambuf@@QAEXXZ(ptr) msvcirt.?dbp at streambuf@@QAEXXZ
 @ cdecl -arch=win64 ?dbp at streambuf@@QEAAXXZ(ptr) msvcirt.?dbp at streambuf@@QEAAXXZ
 @ cdecl -arch=win32 ?dec@@YAAAVios@@AAV1@@Z(ptr) msvcirt.?dec@@YAAAVios@@AAV1@@Z
diff --git a/dlls/msvcrt40/msvcrt40.spec b/dlls/msvcrt40/msvcrt40.spec
index 4ac328a..82451ba 100644
--- a/dlls/msvcrt40/msvcrt40.spec
+++ b/dlls/msvcrt40/msvcrt40.spec
@@ -472,11 +472,11 @@
 @ cdecl ?bitalloc at ios@@SAJXZ() msvcirt.?bitalloc at ios@@SAJXZ
 @ thiscall -arch=win32 ?blen at streambuf@@IBEHXZ(ptr) msvcirt.?blen at streambuf@@IBEHXZ
 @ cdecl -arch=win64 ?blen at streambuf@@IEBAHXZ(ptr) msvcirt.?blen at streambuf@@IEBAHXZ
-@ stub ?cerr@@3Vostream_withassign@@A
-@ stub ?cin@@3Vistream_withassign@@A
+@ extern ?cerr@@3Vostream_withassign@@A msvcirt.?cerr@@3Vostream_withassign@@A
+@ extern ?cin@@3Vistream_withassign@@A msvcirt.?cin@@3Vistream_withassign@@A
 @ thiscall -arch=win32 ?clear at ios@@QAEXH at Z(ptr long) msvcirt.?clear at ios@@QAEXH at Z
 @ cdecl -arch=win64 ?clear at ios@@QEAAXH at Z(ptr long) msvcirt.?clear at ios@@QEAAXH at Z
-@ stub ?clog@@3Vostream_withassign@@A
+@ extern ?clog@@3Vostream_withassign@@A msvcirt.?clog@@3Vostream_withassign@@A
 @ thiscall -arch=win32 ?close at filebuf@@QAEPAV1 at XZ(ptr) msvcirt.?close at filebuf@@QAEPAV1 at XZ
 @ cdecl -arch=win64 ?close at filebuf@@QEAAPEAV1 at XZ(ptr) msvcirt.?close at filebuf@@QEAAPEAV1 at XZ
 @ stub -arch=win32 ?close at fstream@@QAEXXZ
@@ -489,7 +489,7 @@
 @ cdecl -arch=win64 ?clrlock at ios@@QEAAXXZ(ptr) msvcirt.?clrlock at ios@@QEAAXXZ
 @ thiscall -arch=win32 ?clrlock at streambuf@@QAEXXZ(ptr) msvcirt.?clrlock at streambuf@@QAEXXZ
 @ cdecl -arch=win64 ?clrlock at streambuf@@QEAAXXZ(ptr) msvcirt.?clrlock at streambuf@@QEAAXXZ
-@ stub ?cout@@3Vostream_withassign@@A
+@ extern ?cout@@3Vostream_withassign@@A msvcirt.?cout@@3Vostream_withassign@@A
 @ thiscall -arch=win32 ?dbp at streambuf@@QAEXXZ(ptr) msvcirt.?dbp at streambuf@@QAEXXZ
 @ cdecl -arch=win64 ?dbp at streambuf@@QEAAXXZ(ptr) msvcirt.?dbp at streambuf@@QEAAXXZ
 @ cdecl -arch=win32 ?dec@@YAAAVios@@AAV1@@Z(ptr) msvcirt.?dec@@YAAAVios@@AAV1@@Z
-- 
2.7.4




More information about the wine-patches mailing list