[1/2] msvcirt: Add initial implementation of streambuf

Iván Matellanes matellanesivan at gmail.com
Tue Jun 2 07:52:14 CDT 2015


I hope it's not too long. It implements constructors, destructors and assignments.

---
 dlls/msvcirt/msvcirt.c      | 189 ++++++++++++++++++++++++++++++++++++++++++++
 dlls/msvcirt/msvcirt.spec   |  42 +++++-----
 dlls/msvcrt20/msvcrt20.spec |  42 +++++-----
 dlls/msvcrt40/msvcrt40.spec |  42 +++++-----
 4 files changed, 252 insertions(+), 63 deletions(-)

diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index e73f93e..295a8d8 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007 Alexandre Julliard
+ * Copyright (C) 2015 Iván Matellanes
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -27,6 +28,29 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(msvcirt);
 
+/* class streambuf */
+typedef struct {
+    const vtable_ptr *vtable;
+    int allocated;
+    int unbuffered;
+    int unknown;
+    char *base;
+    char *ebuf;
+    char *pbase;
+    char *pptr;
+    char *epptr;
+    char *eback;
+    char *gptr;
+    char *egptr;
+    int unknown2;
+    CRITICAL_SECTION lock;
+} streambuf;
+
+void __thiscall streambuf_setb(streambuf*, char*, char*, int);
+streambuf* __thiscall streambuf_setbuf(streambuf*, char*, int);
+void __thiscall streambuf_setg(streambuf*, char*, char*, char*);
+void __thiscall streambuf_setp(streambuf*, char*, char*);
+
 typedef struct {
     LPVOID VTable;
 } class_ios;
@@ -39,6 +63,171 @@ typedef struct {
     LPVOID VTable;
 } class_strstreambuf;
 
+/* ??_7streambuf@@6B@ */
+extern const vtable_ptr MSVCP_streambuf_vtable;
+
+#ifndef __GNUC__
+void __asm_dummy_vtables(void) {
+#endif
+    __ASM_VTABLE(streambuf,
+            VTABLE_ADD_FUNC(streambuf_vector_dtor));
+#ifndef __GNUC__
+}
+#endif
+
+DEFINE_RTTI_DATA0(streambuf, 0, ".?AVstreambuf@@")
+
+/* ??0streambuf@@IAE at PADH@Z */
+/* ??0streambuf@@IEAA at PEADH@Z */
+DEFINE_THISCALL_WRAPPER(streambuf_reserve_ctor, 12)
+streambuf* __thiscall streambuf_reserve_ctor(streambuf *this, char *buffer, int length)
+{
+    TRACE("(%p %p %d)\n", this, buffer, length);
+    this->vtable = &MSVCP_streambuf_vtable;
+    this->allocated = 0;
+    this->unknown = -1;
+    this->unknown2 = -1;
+    this->base = NULL;
+    streambuf_setbuf(this, buffer, length);
+    streambuf_setg(this, NULL, NULL, NULL);
+    streambuf_setp(this, NULL, NULL);
+    InitializeCriticalSection(&this->lock);
+    return this;
+}
+
+/* ??0streambuf@@IAE at XZ */
+/* ??0streambuf@@IEAA at XZ */
+DEFINE_THISCALL_WRAPPER(streambuf_ctor, 4)
+streambuf* __thiscall streambuf_ctor(streambuf *this)
+{
+    TRACE("(%p)\n", this);
+    this->vtable = &MSVCP_streambuf_vtable;
+    this->allocated = 0;
+    this->unbuffered = 0;
+    this->unknown = -1;
+    this->unknown2 = -1;
+    streambuf_setb(this, NULL, NULL, 0);
+    streambuf_setg(this, NULL, NULL, NULL);
+    streambuf_setp(this, NULL, NULL);
+    InitializeCriticalSection(&this->lock);
+    return this;
+}
+
+/* ??0streambuf@@QAE at ABV0@@Z */
+/* ??0streambuf@@QEAA at AEBV0@@Z */
+DEFINE_THISCALL_WRAPPER(streambuf_copy_ctor, 8)
+streambuf* __thiscall streambuf_copy_ctor(streambuf *this, const streambuf *copy)
+{
+    TRACE("(%p %p)\n", this, copy);
+    *this = *copy;
+    this->vtable = &MSVCP_streambuf_vtable;
+    return this;
+}
+
+/* ??1streambuf@@UAE at XZ */
+/* ??1streambuf@@UEAA at XZ */
+DEFINE_THISCALL_WRAPPER(streambuf_dtor, 4)
+void __thiscall streambuf_dtor(streambuf *this)
+{
+    TRACE("(%p)\n", this);
+    if (this->allocated)
+        MSVCRT_operator_delete(this->base);
+    DeleteCriticalSection(&this->lock);
+}
+
+/* ??4streambuf@@QAEAAV0 at ABV0@@Z */
+/* ??4streambuf@@QEAAAEAV0 at AEBV0@@Z */
+DEFINE_THISCALL_WRAPPER(streambuf_assign, 8)
+streambuf* __thiscall streambuf_assign(streambuf *this, const streambuf *rhs)
+{
+    streambuf_dtor(this);
+    return streambuf_copy_ctor(this, rhs);
+}
+
+/* ??_Estreambuf@@UAEPAXI at Z */
+DEFINE_THISCALL_WRAPPER(streambuf_vector_dtor, 8)
+streambuf* __thiscall streambuf_vector_dtor(streambuf *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--)
+            streambuf_dtor(this+i);
+        MSVCRT_operator_delete(ptr);
+    } else {
+        streambuf_dtor(this);
+        if (flags & 1)
+            MSVCRT_operator_delete(this);
+    }
+    return this;
+}
+
+/* ??_Gstreambuf@@UAEPAXI at Z */
+DEFINE_THISCALL_WRAPPER(streambuf_scalar_dtor, 8)
+streambuf* __thiscall streambuf_scalar_dtor(streambuf *this, unsigned int flags)
+{
+    TRACE("(%p %x)\n", this, flags);
+    streambuf_dtor(this);
+    if (flags & 1) MSVCRT_operator_delete(this);
+    return this;
+}
+
+/* ?setb at streambuf@@IAEXPAD0H at Z */
+/* ?setb at streambuf@@IEAAXPEAD0H at Z */
+DEFINE_THISCALL_WRAPPER(streambuf_setb, 16)
+void __thiscall streambuf_setb(streambuf *this, char *ba, char *eb, int delete)
+{
+    TRACE("(%p %p %p %d)\n", this, ba, eb, delete);
+    if (this->allocated)
+        MSVCRT_operator_delete(this->base);
+    this->allocated = delete;
+    this->base = ba;
+    this->ebuf = eb;
+}
+
+/* ?setbuf at streambuf@@UAEPAV1 at PADH@Z */
+/* ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z */
+DEFINE_THISCALL_WRAPPER(streambuf_setbuf, 12)
+streambuf* __thiscall streambuf_setbuf(streambuf *this, char *buffer, int length)
+{
+    TRACE("(%p %p %d)\n", this, buffer, length);
+    if (this->base != NULL)
+        return NULL;
+
+    if (buffer == NULL || !length) {
+        this->unbuffered = 1;
+        this->base = this->ebuf = NULL;
+    } else {
+        this->unbuffered = 0;
+        this->base = buffer;
+        this->ebuf = buffer + length;
+    }
+    return this;
+}
+
+/* ?setg at streambuf@@IAEXPAD00 at Z */
+/* ?setg at streambuf@@IEAAXPEAD00 at Z */
+DEFINE_THISCALL_WRAPPER(streambuf_setg, 16)
+void __thiscall streambuf_setg(streambuf *this, char *ek, char *gp, char *eg)
+{
+    TRACE("(%p %p %p %p)\n", this, ek, gp, eg);
+    this->eback = ek;
+    this->gptr = gp;
+    this->egptr = eg;
+}
+
+/* ?setp at streambuf@@IAEXPAD0 at Z */
+/* ?setp at streambuf@@IEAAXPEAD0 at Z */
+DEFINE_THISCALL_WRAPPER(streambuf_setp, 12)
+void __thiscall streambuf_setp(streambuf *this, char *pb, char *ep)
+{
+    TRACE("(%p %p %p)\n", this, pb, ep);
+    this->pbase = this->pptr = pb;
+    this->epptr = ep;
+}
+
 /******************************************************************
  *		 ??1ios@@UAE at XZ (MSVCRTI.@)
  *        class ios & __thiscall ios::-ios<<(void)
diff --git a/dlls/msvcirt/msvcirt.spec b/dlls/msvcirt/msvcirt.spec
index 3399b5d..61905fe 100644
--- a/dlls/msvcirt/msvcirt.spec
+++ b/dlls/msvcirt/msvcirt.spec
@@ -106,12 +106,12 @@
 @ stub -arch=win64 ??0stdiostream@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0stdiostream@@QAE at PAU_iobuf@@@Z  # __thiscall stdiostream::stdiostream(struct _iobuf *)
 @ stub -arch=win64 ??0stdiostream@@QEAA at PEAU_iobuf@@@Z
-@ stub -arch=win32 ??0streambuf@@IAE at PADH@Z  # __thiscall streambuf::streambuf(char *,int)
-@ stub -arch=win64 ??0streambuf@@IEAA at PEADH@Z
-@ stub -arch=win32 ??0streambuf@@IAE at XZ  # __thiscall streambuf::streambuf(void)
-@ stub -arch=win64 ??0streambuf@@IEAA at XZ
-@ stub -arch=win32 ??0streambuf@@QAE at ABV0@@Z  # __thiscall streambuf::streambuf(class streambuf const &)
-@ stub -arch=win64 ??0streambuf@@QEAA at AEBV0@@Z
+@ thiscall -arch=win32 ??0streambuf@@IAE at PADH@Z(ptr ptr long) streambuf_reserve_ctor
+@ cdecl -arch=win64 ??0streambuf@@IEAA at PEADH@Z(ptr ptr long) streambuf_reserve_ctor
+@ thiscall -arch=win32 ??0streambuf@@IAE at XZ(ptr) streambuf_ctor
+@ cdecl -arch=win64 ??0streambuf@@IEAA at XZ(ptr) streambuf_ctor
+@ thiscall -arch=win32 ??0streambuf@@QAE at ABV0@@Z(ptr ptr) streambuf_copy_ctor
+@ cdecl -arch=win64 ??0streambuf@@QEAA at AEBV0@@Z(ptr ptr) streambuf_copy_ctor
 @ stub -arch=win32 ??0strstream@@QAE at ABV0@@Z  # __thiscall strstream::strstream(class strstream const &)
 @ stub -arch=win64 ??0strstream@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0strstream@@QAE at PADHH@Z  # __thiscall strstream::strstream(char *,int,int)
@@ -164,8 +164,8 @@
 @ stub -arch=win64 ??1stdiobuf@@UEAA at XZ
 @ stub -arch=win32 ??1stdiostream@@UAE at XZ  # virtual __thiscall stdiostream::~stdiostream(void)
 @ stub -arch=win64 ??1stdiostream@@UEAA at XZ
-@ stub -arch=win32 ??1streambuf@@UAE at XZ  # virtual __thiscall streambuf::~streambuf(void)
-@ stub -arch=win64 ??1streambuf@@UEAA at XZ
+@ thiscall -arch=win32 ??1streambuf@@UAE at XZ(ptr) streambuf_dtor
+@ cdecl -arch=win64 ??1streambuf@@UEAA at XZ(ptr) streambuf_dtor
 @ stub -arch=win32 ??1strstream@@UAE at XZ  # virtual __thiscall strstream::~strstream(void)
 @ stub -arch=win64 ??1strstream@@UEAA at XZ
 @ stub -arch=win32 ??1strstreambuf@@UAE at XZ  # virtual __thiscall strstreambuf::~strstreambuf(void)
@@ -218,8 +218,8 @@
 @ stub -arch=win64 ??4stdiobuf@@QEAAAEAV0 at AEBV0@@Z
 @ stub -arch=win32 ??4stdiostream@@QAEAAV0 at AAV0@@Z  # class stdiostream & __thiscall stdiostream::operator=(class stdiostream &)
 @ stub -arch=win64 ??4stdiostream@@QEAAAEAV0 at AEAV0@@Z
-@ stub -arch=win32 ??4streambuf@@QAEAAV0 at ABV0@@Z  # class streambuf & __thiscall streambuf::operator=(class streambuf const &)
-@ stub -arch=win64 ??4streambuf@@QEAAAEAV0 at AEBV0@@Z
+@ thiscall -arch=win32 ??4streambuf@@QAEAAV0 at ABV0@@Z(ptr ptr) streambuf_assign
+@ cdecl -arch=win64 ??4streambuf@@QEAAAEAV0 at AEBV0@@Z(ptr ptr) streambuf_assign
 @ stub -arch=win32 ??4strstream@@QAEAAV0 at AAV0@@Z  # class strstream & __thiscall strstream::operator=(class strstream &)
 @ stub -arch=win64 ??4strstream@@QEAAAEAV0 at AEAV0@@Z
 @ stub -arch=win32 ??4strstreambuf@@QAEAAV0 at ABV0@@Z  # class strstreambuf & __thiscall strstreambuf::operator=(class strstreambuf const &)
@@ -318,7 +318,7 @@
 # @ extern ??_7ostrstream@@6B@  # const ostrstream::`vftable'
 # @ extern ??_7stdiobuf@@6B@  # const stdiobuf::`vftable'
 # @ extern ??_7stdiostream@@6B@  # const stdiostream::`vftable'
-# @ extern ??_7streambuf@@6B@  # const streambuf::`vftable'
+@ extern ??_7streambuf@@6B@ MSVCP_streambuf_vtable
 # @ extern ??_7strstream@@6B@  # const strstream::`vftable'
 # @ extern ??_7strstreambuf@@6B@  # const strstreambuf::`vftable'
 # @ extern ??_8fstream@@7Bistream@@@  # const fstream::`vbtable'{for `istream'}
@@ -377,7 +377,7 @@
 @ stub -arch=win32 ??_Eostrstream@@UAEPAXI at Z  # virtual void * __thiscall ostrstream::`vector deleting destructor'(unsigned int)
 @ stub -arch=win32 ??_Estdiobuf@@UAEPAXI at Z  # virtual void * __thiscall stdiobuf::`vector deleting destructor'(unsigned int)
 @ stub -arch=win32 ??_Estdiostream@@UAEPAXI at Z  # virtual void * __thiscall stdiostream::`vector deleting destructor'(unsigned int)
-@ stub -arch=win32 ??_Estreambuf@@UAEPAXI at Z  # virtual void * __thiscall streambuf::`vector deleting destructor'(unsigned int)
+@ thiscall -arch=win32 ??_Estreambuf@@UAEPAXI at Z(ptr long) streambuf_vector_dtor
 @ stub -arch=win32 ??_Estrstream@@UAEPAXI at Z  # virtual void * __thiscall strstream::`vector deleting destructor'(unsigned int)
 @ stub -arch=win32 ??_Estrstreambuf@@UAEPAXI at Z  # virtual void * __thiscall strstreambuf::`vector deleting destructor'(unsigned int)
 @ thiscall -arch=win32 ??_Gexception@@UAEPAXI at Z(ptr long) MSVCP_exception_scalar_dtor
@@ -396,7 +396,7 @@
 @ stub -arch=win32 ??_Gostrstream@@UAEPAXI at Z  # virtual void * __thiscall ostrstream::`scalar deleting destructor'(unsigned int)
 @ stub -arch=win32 ??_Gstdiobuf@@UAEPAXI at Z  # virtual void * __thiscall stdiobuf::`scalar deleting destructor'(unsigned int)
 @ stub -arch=win32 ??_Gstdiostream@@UAEPAXI at Z  # virtual void * __thiscall stdiostream::`scalar deleting destructor'(unsigned int)
-@ stub -arch=win32 ??_Gstreambuf@@UAEPAXI at Z  # virtual void * __thiscall streambuf::`scalar deleting destructor'(unsigned int)
+@ thiscall -arch=win32 ??_Gstreambuf@@UAEPAXI at Z(ptr long) streambuf_scalar_dtor
 @ stub -arch=win32 ??_Gstrstream@@UAEPAXI at Z  # virtual void * __thiscall strstream::`scalar deleting destructor'(unsigned int)
 @ stub -arch=win32 ??_Gstrstreambuf@@UAEPAXI at Z  # virtual void * __thiscall strstreambuf::`scalar deleting destructor'(unsigned int)
 # @ extern ?adjustfield at ios@@2JB  # static long const ios::adjustfield
@@ -657,8 +657,8 @@
 @ stub -arch=win64 ?seekp at ostream@@QEAAAEAV1 at JW4seek_dir@ios@@@Z
 @ stub -arch=win32 ?seekpos at streambuf@@UAEJJH at Z  # virtual long __thiscall streambuf::seekpos(long,int)
 @ stub -arch=win64 ?seekpos at streambuf@@UEAAJJH at Z
-@ stub -arch=win32 ?setb at streambuf@@IAEXPAD0H at Z  # void __thiscall streambuf::setb(char *,char *,int)
-@ stub -arch=win64 ?setb at streambuf@@IEAAXPEAD0H at Z
+@ thiscall -arch=win32 ?setb at streambuf@@IAEXPAD0H at Z(ptr ptr ptr long) streambuf_setb
+@ cdecl -arch=win64 ?setb at streambuf@@IEAAXPEAD0H at Z(ptr ptr ptr long) streambuf_setb
 @ stub -arch=win32 ?setbuf at filebuf@@UAEPAVstreambuf@@PADH at Z  # virtual class streambuf * __thiscall filebuf::setbuf(char *,int)
 @ stub -arch=win64 ?setbuf at filebuf@@UEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setbuf at fstream@@QAEPAVstreambuf@@PADH at Z  # class streambuf * __thiscall fstream::setbuf(char *,int)
@@ -667,16 +667,16 @@
 @ stub -arch=win64 ?setbuf at ifstream@@QEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setbuf at ofstream@@QAEPAVstreambuf@@PADH at Z  # class streambuf * __thiscall ofstream::setbuf(char *,int)
 @ stub -arch=win64 ?setbuf at ofstream@@QEAAPEAVstreambuf@@PEADH at Z
-@ stub -arch=win32 ?setbuf at streambuf@@UAEPAV1 at PADH@Z  # virtual class streambuf * __thiscall streambuf::setbuf(char *,int)
-@ stub -arch=win64 ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z
+@ thiscall -arch=win32 ?setbuf at streambuf@@UAEPAV1 at PADH@Z(ptr ptr long) streambuf_setbuf
+@ cdecl -arch=win64 ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z(ptr ptr long) streambuf_setbuf
 @ stub -arch=win32 ?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z  # virtual class streambuf * __thiscall strstreambuf::setbuf(char *,int)
 @ stub -arch=win64 ?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setf at ios@@QAEJJ at Z  # long __thiscall ios::setf(long)
 @ stub -arch=win64 ?setf at ios@@QEAAJJ at Z
 @ stub -arch=win32 ?setf at ios@@QAEJJJ at Z  # long __thiscall ios::setf(long,long)
 @ stub -arch=win64 ?setf at ios@@QEAAJJJ at Z
-@ stub -arch=win32 ?setg at streambuf@@IAEXPAD00 at Z  # void __thiscall streambuf::setg(char *,char *,char *)
-@ stub -arch=win64 ?setg at streambuf@@IEAAXPEAD00 at Z
+@ thiscall -arch=win32 ?setg at streambuf@@IAEXPAD00 at Z(ptr ptr ptr ptr) streambuf_setg
+@ cdecl -arch=win64 ?setg at streambuf@@IEAAXPEAD00 at Z(ptr ptr ptr ptr) streambuf_setg
 @ stub -arch=win32 ?setlock at ios@@QAAXXZ  # void __cdecl ios::setlock(void)
 @ stub -arch=win64 ?setlock at ios@@QEAAXXZ
 @ stub -arch=win32 ?setlock at streambuf@@QAEXXZ  # void __thiscall streambuf::setlock(void)
@@ -689,8 +689,8 @@
 @ stub -arch=win64 ?setmode at ifstream@@QEAAHH at Z
 @ stub -arch=win32 ?setmode at ofstream@@QAEHH at Z  # int __thiscall ofstream::setmode(int)
 @ stub -arch=win64 ?setmode at ofstream@@QEAAHH at Z
-@ stub -arch=win32 ?setp at streambuf@@IAEXPAD0 at Z  # void __thiscall streambuf::setp(char *,char *)
-@ stub -arch=win64 ?setp at streambuf@@IEAAXPEAD0 at Z
+@ thiscall -arch=win32 ?setp at streambuf@@IAEXPAD0 at Z(ptr ptr ptr) streambuf_setp
+@ cdecl -arch=win64 ?setp at streambuf@@IEAAXPEAD0 at Z(ptr ptr ptr) streambuf_setp
 @ stub -arch=win32 ?setrwbuf at stdiobuf@@QAEHHH at Z  # int __thiscall stdiobuf::setrwbuf(int,int)
 @ stub -arch=win64 ?setrwbuf at stdiobuf@@QEAAHHH at Z
 @ stub -arch=win32 ?sgetc at streambuf@@QAEHXZ  # int __thiscall streambuf::sgetc(void)
diff --git a/dlls/msvcrt20/msvcrt20.spec b/dlls/msvcrt20/msvcrt20.spec
index b166ada..a5ca82d 100644
--- a/dlls/msvcrt20/msvcrt20.spec
+++ b/dlls/msvcrt20/msvcrt20.spec
@@ -96,12 +96,12 @@
 @ stub -arch=win64 ??0stdiostream@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0stdiostream@@QAE at PAU_iobuf@@@Z
 @ stub -arch=win64 ??0stdiostream@@QEAA at PEAU_iobuf@@@Z
-@ stub -arch=win32 ??0streambuf@@IAE at PADH@Z
-@ stub -arch=win64 ??0streambuf@@IEAA at PEADH@Z
-@ stub -arch=win32 ??0streambuf@@IAE at XZ
-@ stub -arch=win64 ??0streambuf@@IEAA at XZ
-@ stub -arch=win32 ??0streambuf@@QAE at ABV0@@Z
-@ stub -arch=win64 ??0streambuf@@QEAA at AEBV0@@Z
+@ thiscall -arch=win32 ??0streambuf@@IAE at PADH@Z(ptr ptr long) msvcirt.??0streambuf@@IAE at PADH@Z
+@ cdecl -arch=win64 ??0streambuf@@IEAA at PEADH@Z(ptr ptr long) msvcirt.??0streambuf@@IEAA at PEADH@Z
+@ thiscall -arch=win32 ??0streambuf@@IAE at XZ(ptr) msvcirt.??0streambuf@@IAE at XZ
+@ cdecl -arch=win64 ??0streambuf@@IEAA at XZ(ptr) msvcirt.??0streambuf@@IEAA at XZ
+@ thiscall -arch=win32 ??0streambuf@@QAE at ABV0@@Z(ptr ptr) msvcirt.??0streambuf@@QAE at ABV0@@Z
+@ cdecl -arch=win64 ??0streambuf@@QEAA at AEBV0@@Z(ptr ptr) msvcirt.??0streambuf@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0strstream@@QAE at ABV0@@Z
 @ stub -arch=win64 ??0strstream@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0strstream@@QAE at PADHH@Z
@@ -148,8 +148,8 @@
 @ stub -arch=win64 ??1stdiobuf@@UEAA at XZ
 @ stub -arch=win32 ??1stdiostream@@UAE at XZ
 @ stub -arch=win64 ??1stdiostream@@UEAA at XZ
-@ stub -arch=win32 ??1streambuf@@UAE at XZ
-@ stub -arch=win64 ??1streambuf@@UEAA at XZ
+@ thiscall -arch=win32 ??1streambuf@@UAE at XZ(ptr) msvcirt.??1streambuf@@UAE at XZ
+@ cdecl -arch=win64 ??1streambuf@@UEAA at XZ(ptr) msvcirt.??1streambuf@@UEAA at XZ
 @ stub -arch=win32 ??1strstream@@UAE at XZ
 @ stub -arch=win64 ??1strstream@@UEAA at XZ
 @ stub -arch=win32 ??1strstreambuf@@UAE at XZ
@@ -202,8 +202,8 @@
 @ stub -arch=win64 ??4stdiobuf@@QEAAAEAV0 at AEBV0@@Z
 @ stub -arch=win32 ??4stdiostream@@QAEAAV0 at AAV0@@Z
 @ stub -arch=win64 ??4stdiostream@@QEAAAEAV0 at AEAV0@@Z
-@ stub -arch=win32 ??4streambuf@@QAEAAV0 at ABV0@@Z
-@ stub -arch=win64 ??4streambuf@@QEAAAEAV0 at AEBV0@@Z
+@ thiscall -arch=win32 ??4streambuf@@QAEAAV0 at ABV0@@Z(ptr ptr) msvcirt.??4streambuf@@QAEAAV0 at ABV0@@Z
+@ cdecl -arch=win64 ??4streambuf@@QEAAAEAV0 at AEBV0@@Z(ptr ptr) msvcirt.??4streambuf@@QEAAAEAV0 at AEBV0@@Z
 @ stub -arch=win32 ??4strstream@@QAEAAV0 at AAV0@@Z
 @ stub -arch=win64 ??4strstream@@QEAAAEAV0 at AEAV0@@Z
 @ stub -arch=win32 ??4strstreambuf@@QAEAAV0 at ABV0@@Z
@@ -300,7 +300,7 @@
 # @ extern ??_7ostrstream@@6B@
 # @ extern ??_7stdiobuf@@6B@
 # @ extern ??_7stdiostream@@6B@
-# @ extern ??_7streambuf@@6B@
+@ extern ??_7streambuf@@6B@ msvcirt.??_7streambuf@@6B@
 # @ extern ??_7strstream@@6B@
 # @ extern ??_7strstreambuf@@6B@
 # @ extern ??_8fstream@@7Bistream@@@
@@ -358,7 +358,7 @@
 @ stub -arch=win32 ??_Eostrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estdiobuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estdiostream@@UAEPAXI at Z
-@ stub -arch=win32 ??_Estreambuf@@UAEPAXI at Z
+@ thiscall -arch=win32 ??_Estreambuf@@UAEPAXI at Z(ptr long) msvcirt.??_Estreambuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estrstreambuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_GIostream_init@@QAEPAXI at Z
@@ -376,7 +376,7 @@
 @ stub -arch=win32 ??_Gostrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstdiobuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstdiostream@@UAEPAXI at Z
-@ stub -arch=win32 ??_Gstreambuf@@UAEPAXI at Z
+@ thiscall -arch=win32 ??_Gstreambuf@@UAEPAXI at Z(ptr long) msvcirt.??_Gstreambuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstrstreambuf@@UAEPAXI at Z
 @ cdecl -arch=win32 ?_query_new_handler@@YAP6AHI at ZXZ() msvcrt.?_query_new_handler@@YAP6AHI at ZXZ
@@ -645,8 +645,8 @@
 @ stub -arch=win64 ?seekpos at streambuf@@UEAAJJH at Z
 @ cdecl ?set_terminate@@YAP6AXXZP6AXXZ at Z(ptr) msvcrt.?set_terminate@@YAP6AXXZP6AXXZ at Z
 @ cdecl ?set_unexpected@@YAP6AXXZP6AXXZ at Z(ptr) msvcrt.?set_unexpected@@YAP6AXXZP6AXXZ at Z
-@ stub -arch=win32 ?setb at streambuf@@IAEXPAD0H at Z
-@ stub -arch=win64 ?setb at streambuf@@IEAAXPEAD0H at Z
+@ thiscall -arch=win32 ?setb at streambuf@@IAEXPAD0H at Z(ptr ptr ptr long) msvcirt.?setb at streambuf@@IAEXPAD0H at Z
+@ cdecl -arch=win64 ?setb at streambuf@@IEAAXPEAD0H at Z(ptr ptr ptr long) msvcirt.?setb at streambuf@@IEAAXPEAD0H at Z
 @ stub -arch=win32 ?setbuf at filebuf@@UAEPAVstreambuf@@PADH at Z
 @ stub -arch=win64 ?setbuf at filebuf@@UEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setbuf at fstream@@QAEPAVstreambuf@@PADH at Z
@@ -655,16 +655,16 @@
 @ stub -arch=win64 ?setbuf at ifstream@@QEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setbuf at ofstream@@QAEPAVstreambuf@@PADH at Z
 @ stub -arch=win64 ?setbuf at ofstream@@QEAAPEAVstreambuf@@PEADH at Z
-@ stub -arch=win32 ?setbuf at streambuf@@UAEPAV1 at PADH@Z
-@ stub -arch=win64 ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z
+@ thiscall -arch=win32 ?setbuf at streambuf@@UAEPAV1 at PADH@Z(ptr ptr long) msvcirt.?setbuf at streambuf@@UAEPAV1 at PADH@Z
+@ cdecl -arch=win64 ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z(ptr ptr long) msvcirt.?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z
 @ stub -arch=win32 ?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z
 @ stub -arch=win64 ?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setf at ios@@QAEJJ at Z
 @ stub -arch=win64 ?setf at ios@@QEAAJJ at Z
 @ stub -arch=win32 ?setf at ios@@QAEJJJ at Z
 @ stub -arch=win64 ?setf at ios@@QEAAJJJ at Z
-@ stub -arch=win32 ?setg at streambuf@@IAEXPAD00 at Z
-@ stub -arch=win64 ?setg at streambuf@@IEAAXPEAD00 at Z
+@ thiscall -arch=win32 ?setg at streambuf@@IAEXPAD00 at Z(ptr ptr ptr ptr) msvcirt.?setg at streambuf@@IAEXPAD00 at Z
+@ cdecl -arch=win64 ?setg at streambuf@@IEAAXPEAD00 at Z(ptr ptr ptr ptr) msvcirt.?setg at streambuf@@IEAAXPEAD00 at Z
 @ stub -arch=win32 ?setlock at ios@@QAAXXZ
 @ stub -arch=win64 ?setlock at ios@@QEAAXXZ
 @ stub -arch=win32 ?setlock at streambuf@@QAEXXZ
@@ -677,8 +677,8 @@
 @ stub -arch=win64 ?setmode at ifstream@@QEAAHH at Z
 @ stub -arch=win32 ?setmode at ofstream@@QAEHH at Z
 @ stub -arch=win64 ?setmode at ofstream@@QEAAHH at Z
-@ stub -arch=win32 ?setp at streambuf@@IAEXPAD0 at Z
-@ stub -arch=win64 ?setp at streambuf@@IEAAXPEAD0 at Z
+@ thiscall -arch=win32 ?setp at streambuf@@IAEXPAD0 at Z(ptr ptr ptr) msvcirt.?setp at streambuf@@IAEXPAD0 at Z
+@ cdecl -arch=win64 ?setp at streambuf@@IEAAXPEAD0 at Z(ptr ptr ptr) msvcirt.?setp at streambuf@@IEAAXPEAD0 at Z
 @ stub -arch=win32 ?setrwbuf at stdiobuf@@QAEHHH at Z
 @ stub -arch=win64 ?setrwbuf at stdiobuf@@QEAAHHH at Z
 @ stub -arch=win32 ?sgetc at streambuf@@QAEHXZ
diff --git a/dlls/msvcrt40/msvcrt40.spec b/dlls/msvcrt40/msvcrt40.spec
index 3b6b0d7..1a25597 100644
--- a/dlls/msvcrt40/msvcrt40.spec
+++ b/dlls/msvcrt40/msvcrt40.spec
@@ -118,12 +118,12 @@
 @ stub -arch=win64 ??0stdiostream@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0stdiostream@@QAE at PAU_iobuf@@@Z
 @ stub -arch=win64 ??0stdiostream@@QEAA at PEAU_iobuf@@@Z
-@ stub -arch=win32 ??0streambuf@@IAE at PADH@Z
-@ stub -arch=win64 ??0streambuf@@IEAA at PEADH@Z
-@ stub -arch=win32 ??0streambuf@@IAE at XZ
-@ stub -arch=win64 ??0streambuf@@IEAA at XZ
-@ stub -arch=win32 ??0streambuf@@QAE at ABV0@@Z
-@ stub -arch=win64 ??0streambuf@@QEAA at AEBV0@@Z
+@ thiscall -arch=win32 ??0streambuf@@IAE at PADH@Z(ptr ptr long) msvcirt.??0streambuf@@IAE at PADH@Z
+@ cdecl -arch=win64 ??0streambuf@@IEAA at PEADH@Z(ptr ptr long) msvcirt.??0streambuf@@IEAA at PEADH@Z
+@ thiscall -arch=win32 ??0streambuf@@IAE at XZ(ptr) msvcirt.??0streambuf@@IAE at XZ
+@ cdecl -arch=win64 ??0streambuf@@IEAA at XZ(ptr) msvcirt.??0streambuf@@IEAA at XZ
+@ thiscall -arch=win32 ??0streambuf@@QAE at ABV0@@Z(ptr ptr) msvcirt.??0streambuf@@QAE at ABV0@@Z
+@ cdecl -arch=win64 ??0streambuf@@QEAA at AEBV0@@Z(ptr ptr) msvcirt.??0streambuf@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0strstream@@QAE at ABV0@@Z
 @ stub -arch=win64 ??0strstream@@QEAA at AEBV0@@Z
 @ stub -arch=win32 ??0strstream@@QAE at PADHH@Z
@@ -180,8 +180,8 @@
 @ stub -arch=win64 ??1stdiobuf@@UEAA at XZ
 @ stub -arch=win32 ??1stdiostream@@UAE at XZ
 @ stub -arch=win64 ??1stdiostream@@UEAA at XZ
-@ stub -arch=win32 ??1streambuf@@UAE at XZ
-@ stub -arch=win64 ??1streambuf@@UEAA at XZ
+@ thiscall -arch=win32 ??1streambuf@@UAE at XZ(ptr) msvcirt.??1streambuf@@UAE at XZ
+@ cdecl -arch=win64 ??1streambuf@@UEAA at XZ(ptr) msvcirt.??1streambuf@@UEAA at XZ
 @ stub -arch=win32 ??1strstream@@UAE at XZ
 @ stub -arch=win64 ??1strstream@@UEAA at XZ
 @ stub -arch=win32 ??1strstreambuf@@UAE at XZ
@@ -246,8 +246,8 @@
 @ stub -arch=win64 ??4stdiobuf@@QEAAAEAV0 at AEBV0@@Z
 @ stub -arch=win32 ??4stdiostream@@QAEAAV0 at AAV0@@Z
 @ stub -arch=win64 ??4stdiostream@@QEAAAEAV0 at AEAV0@@Z
-@ stub -arch=win32 ??4streambuf@@QAEAAV0 at ABV0@@Z
-@ stub -arch=win64 ??4streambuf@@QEAAAEAV0 at AEBV0@@Z
+@ thiscall -arch=win32 ??4streambuf@@QAEAAV0 at ABV0@@Z(ptr ptr) msvcirt.??4streambuf@@QAEAAV0 at ABV0@@Z
+@ cdecl -arch=win64 ??4streambuf@@QEAAAEAV0 at AEBV0@@Z(ptr ptr) msvcirt.??4streambuf@@QEAAAEAV0 at AEBV0@@Z
 @ stub -arch=win32 ??4strstream@@QAEAAV0 at AAV0@@Z
 @ stub -arch=win64 ??4strstream@@QEAAAEAV0 at AEAV0@@Z
 @ stub -arch=win32 ??4strstreambuf@@QAEAAV0 at ABV0@@Z
@@ -353,7 +353,7 @@
 # @ extern ??_7ostrstream@@6B@
 # @ extern ??_7stdiobuf@@6B@
 # @ extern ??_7stdiostream@@6B@
-# @ extern ??_7streambuf@@6B@
+@ extern ??_7streambuf@@6B@ msvcirt.??_7streambuf@@6B@
 # @ extern ??_7strstream@@6B@
 # @ extern ??_7strstreambuf@@6B@
 # @ extern ??_8fstream@@7Bistream@@@
@@ -416,7 +416,7 @@
 @ stub -arch=win32 ??_Eostrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estdiobuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estdiostream@@UAEPAXI at Z
-@ stub -arch=win32 ??_Estreambuf@@UAEPAXI at Z
+@ thiscall -arch=win32 ??_Estreambuf@@UAEPAXI at Z(ptr long) msvcirt.??_Estreambuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Estrstreambuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_GIostream_init@@QAEPAXI at Z
@@ -439,7 +439,7 @@
 @ stub -arch=win32 ??_Gostrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstdiobuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstdiostream@@UAEPAXI at Z
-@ stub -arch=win32 ??_Gstreambuf@@UAEPAXI at Z
+@ thiscall -arch=win32 ??_Gstreambuf@@UAEPAXI at Z(ptr long) msvcirt.??_Gstreambuf@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstrstream@@UAEPAXI at Z
 @ stub -arch=win32 ??_Gstrstreambuf@@UAEPAXI at Z
 @ cdecl -arch=win32 ?_query_new_handler@@YAP6AHI at ZXZ() msvcrt.?_query_new_handler@@YAP6AHI at ZXZ
@@ -717,8 +717,8 @@
 @ cdecl ?set_new_handler@@YAP6AXXZP6AXXZ at Z(ptr) msvcrt.?set_new_handler@@YAP6AXXZP6AXXZ at Z
 @ cdecl ?set_terminate@@YAP6AXXZP6AXXZ at Z(ptr) msvcrt.?set_terminate@@YAP6AXXZP6AXXZ at Z
 @ cdecl ?set_unexpected@@YAP6AXXZP6AXXZ at Z(ptr) msvcrt.?set_unexpected@@YAP6AXXZP6AXXZ at Z
-@ stub -arch=win32 ?setb at streambuf@@IAEXPAD0H at Z
-@ stub -arch=win64 ?setb at streambuf@@IEAAXPEAD0H at Z
+@ thiscall -arch=win32 ?setb at streambuf@@IAEXPAD0H at Z(ptr ptr ptr long) msvcirt.?setb at streambuf@@IAEXPAD0H at Z
+@ cdecl -arch=win64 ?setb at streambuf@@IEAAXPEAD0H at Z(ptr ptr ptr long) msvcirt.?setb at streambuf@@IEAAXPEAD0H at Z
 @ stub -arch=win32 ?setbuf at filebuf@@UAEPAVstreambuf@@PADH at Z
 @ stub -arch=win64 ?setbuf at filebuf@@UEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setbuf at fstream@@QAEPAVstreambuf@@PADH at Z
@@ -727,16 +727,16 @@
 @ stub -arch=win64 ?setbuf at ifstream@@QEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setbuf at ofstream@@QAEPAVstreambuf@@PADH at Z
 @ stub -arch=win64 ?setbuf at ofstream@@QEAAPEAVstreambuf@@PEADH at Z
-@ stub -arch=win32 ?setbuf at streambuf@@UAEPAV1 at PADH@Z
-@ stub -arch=win64 ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z
+@ thiscall -arch=win32 ?setbuf at streambuf@@UAEPAV1 at PADH@Z(ptr ptr long) msvcirt.?setbuf at streambuf@@UAEPAV1 at PADH@Z
+@ cdecl -arch=win64 ?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z(ptr ptr long) msvcirt.?setbuf at streambuf@@UEAAPEAV1 at PEADH@Z
 @ stub -arch=win32 ?setbuf at strstreambuf@@UAEPAVstreambuf@@PADH at Z
 @ stub -arch=win64 ?setbuf at strstreambuf@@UEAAPEAVstreambuf@@PEADH at Z
 @ stub -arch=win32 ?setf at ios@@QAEJJ at Z
 @ stub -arch=win64 ?setf at ios@@QEAAJJ at Z
 @ stub -arch=win32 ?setf at ios@@QAEJJJ at Z
 @ stub -arch=win64 ?setf at ios@@QEAAJJJ at Z
-@ stub -arch=win32 ?setg at streambuf@@IAEXPAD00 at Z
-@ stub -arch=win64 ?setg at streambuf@@IEAAXPEAD00 at Z
+@ thiscall -arch=win32 ?setg at streambuf@@IAEXPAD00 at Z(ptr ptr ptr ptr) msvcirt.?setg at streambuf@@IAEXPAD00 at Z
+@ cdecl -arch=win64 ?setg at streambuf@@IEAAXPEAD00 at Z(ptr ptr ptr ptr) msvcirt.?setg at streambuf@@IEAAXPEAD00 at Z
 @ stub -arch=win32 ?setlock at ios@@QAAXXZ
 @ stub -arch=win64 ?setlock at ios@@QEAAXXZ
 @ stub -arch=win32 ?setlock at streambuf@@QAEXXZ
@@ -749,8 +749,8 @@
 @ stub -arch=win64 ?setmode at ifstream@@QEAAHH at Z
 @ stub -arch=win32 ?setmode at ofstream@@QAEHH at Z
 @ stub -arch=win64 ?setmode at ofstream@@QEAAHH at Z
-@ stub -arch=win32 ?setp at streambuf@@IAEXPAD0 at Z
-@ stub -arch=win64 ?setp at streambuf@@IEAAXPEAD0 at Z
+@ thiscall -arch=win32 ?setp at streambuf@@IAEXPAD0 at Z(ptr ptr ptr) msvcirt.?setp at streambuf@@IAEXPAD0 at Z
+@ cdecl -arch=win64 ?setp at streambuf@@IEAAXPEAD0 at Z(ptr ptr ptr) msvcirt.?setp at streambuf@@IEAAXPEAD0 at Z
 @ stub -arch=win32 ?setrwbuf at stdiobuf@@QAEHHH at Z
 @ stub -arch=win64 ?setrwbuf at stdiobuf@@QEAAHHH at Z
 @ stub -arch=win32 ?sgetc at streambuf@@QAEHXZ
-- 
2.1.4




More information about the wine-patches mailing list