Wine-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
September 2020
- 79 participants
- 771 discussions
This was API mentioned on forum: https://forum.winehq.org/viewtopic.php?f=2&t=34291
(The app is ConsultantPlus)
Signed-off-by: Louis Lenders <xerox.xerox2000x(a)gmail.com>
---
dlls/advapi32/advapi.c | 57 ++++++++++++++++++++++++++-----------
dlls/advapi32/advapi32.spec | 4 +--
2 files changed, 42 insertions(+), 19 deletions(-)
diff --git a/dlls/advapi32/advapi.c b/dlls/advapi32/advapi.c
index 589405b59e..b494740bd8 100644
--- a/dlls/advapi32/advapi.c
+++ b/dlls/advapi32/advapi.c
@@ -237,36 +237,59 @@ DWORD WINAPI InitiateShutdownW(WCHAR *name, WCHAR *message, DWORD seconds, DWORD
return ERROR_CALL_NOT_IMPLEMENTED;
}
-BOOL WINAPI LogonUserA( LPCSTR lpszUsername, LPCSTR lpszDomain, LPCSTR lpszPassword,
- DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken )
+BOOL WINAPI LogonUserExW ( const WCHAR *name, const WCHAR *domain, const WCHAR *pwd,
+ DWORD type, DWORD provider, HANDLE *token, SID **sid, VOID **buf,
+ DWORD *size, QUOTA_LIMITS *quota_limits )
{
- WCHAR *usernameW = NULL, *domainW = NULL, *passwordW = NULL;
+ FIXME("%s %s %s 0x%08x 0x%08x %p %p %p %p %p\n", debugstr_w(name),
+ debugstr_w(domain), debugstr_w(pwd), type, provider, token, sid, buf, size, quota_limits);
+
+ if ( sid || buf || size || quota_limits )
+ {
+ FIXME(" %p %p %p %p - unsupported arguments\n", sid, buf, size, quota_limits);
+ return FALSE;
+ }
+
+ if ( token )
+ *token = (HANDLE *)0xdeadbeef;
+
+ return TRUE;
+}
+
+BOOL WINAPI LogonUserExA ( const char *name, const char *domain, const char *pwd,
+ DWORD type, DWORD provider, HANDLE *token, SID **sid, VOID **buf,
+ DWORD *size, QUOTA_LIMITS *quota_limits )
+{
+ WCHAR *nameW = NULL, *domainW = NULL, *pwdW = NULL;
BOOL ret = FALSE;
- TRACE("%s %s %p 0x%08x 0x%08x %p\n", debugstr_a(lpszUsername),
- debugstr_a(lpszDomain), lpszPassword, dwLogonType, dwLogonProvider, phToken);
+ TRACE("%s %s %s 0x%08x 0x%08x %p %p %p %p %p\n", debugstr_a(name),
+ debugstr_a(domain), debugstr_a(pwd), type, provider, token, sid, buf, size, quota_limits);
- if (lpszUsername && !(usernameW = strdupAW( lpszUsername ))) return FALSE;
- if (lpszDomain && !(domainW = strdupAW( lpszUsername ))) goto done;
- if (lpszPassword && !(passwordW = strdupAW( lpszPassword ))) goto done;
+ if (name && !(nameW = strdupAW( name ))) return FALSE;
+ if (domain && !(domainW = strdupAW( domain ))) goto done;
+ if (pwd && !(pwdW = strdupAW( pwd ))) goto done;
- ret = LogonUserW( usernameW, domainW, passwordW, dwLogonType, dwLogonProvider, phToken );
+ ret = LogonUserExW( nameW, domainW, pwdW, type, provider, token, sid, buf, size, quota_limits );
done:
- heap_free( usernameW );
+ heap_free( nameW );
heap_free( domainW );
- heap_free( passwordW );
+ heap_free( pwdW );
return ret;
}
-BOOL WINAPI LogonUserW( LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword,
- DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken )
+BOOL WINAPI LogonUserW( const WCHAR *name, const WCHAR *domain, const WCHAR *pwd,
+ DWORD type, DWORD provider, HANDLE *token )
{
- FIXME("%s %s %p 0x%08x 0x%08x %p - stub\n", debugstr_w(lpszUsername),
- debugstr_w(lpszDomain), lpszPassword, dwLogonType, dwLogonProvider, phToken);
+ return LogonUserExW ( name, domain, pwd, type, provider, token, NULL, NULL, NULL, NULL );
+}
- *phToken = (HANDLE *)0xdeadbeef;
- return TRUE;
+
+BOOL WINAPI LogonUserA( const char *name, const char *domain, const char *pwd,
+ DWORD type, DWORD provider, HANDLE *token )
+{
+ return LogonUserExA ( name, domain, pwd, type, provider, token, NULL, NULL, NULL, NULL );
}
typedef UINT (WINAPI *fnMsiProvideComponentFromDescriptor)(LPCWSTR,LPWSTR,DWORD*,DWORD*);
diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec
index fcef859a7c..6b41eb77dd 100644
--- a/dlls/advapi32/advapi32.spec
+++ b/dlls/advapi32/advapi32.spec
@@ -423,9 +423,9 @@
@ stdcall -import IsWellKnownSid(ptr long)
@ stdcall LockServiceDatabase(ptr)
@ stdcall LogonUserA(str str str long long ptr)
-# @ stub LogonUserExA
+@ stdcall LogonUserExA(str str str long long ptr ptr ptr ptr ptr)
# @ stub LogonUserExExW
-# @ stub LogonUserExW
+@ stdcall LogonUserExW(wstr wstr wstr long long ptr ptr ptr ptr ptr)
@ stdcall LogonUserW(wstr wstr wstr long long ptr)
@ stdcall LookupAccountNameA(str str ptr ptr ptr ptr ptr)
@ stdcall LookupAccountNameW(wstr wstr ptr ptr ptr ptr ptr)
--
2.28.0
1
0
Based on the semi-stubs by Gijs Vermeulen.
We need to check that calls to different methods translate correctly to
modifications done on the internal filebuf - not all methods call their
filebuf counterparts directly (see setbuf).
Tested with Power Tab Editor and GraphCalc - the crashes are gone and loading
saved files seems to work correctly.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=22616
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=30014
Signed-off-by: Arkadiusz Hiler <ahiler(a)codeweavers.com>
---
v2:
* use correct mangled symbols in the comment on top of setmode
* set p_ifstream_dtor and p_ifstream_vbase_dtor in win32 path
dlls/msvcirt/msvcirt.c | 185 ++++++++++++++++++++++++++
dlls/msvcirt/msvcirt.spec | 72 +++++------
dlls/msvcirt/tests/msvcirt.c | 243 +++++++++++++++++++++++++++++++++++
dlls/msvcrt20/msvcrt20.spec | 72 +++++------
dlls/msvcrt40/msvcrt40.spec | 72 +++++------
5 files changed, 536 insertions(+), 108 deletions(-)
diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index f76eaf6d7ac..df2d7dcffad 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -192,6 +192,8 @@ extern const vtable_ptr MSVCP_istream_vtable;
extern const vtable_ptr MSVCP_istream_withassign_vtable;
/* ??_7istrstream@@6B@ */
extern const vtable_ptr MSVCP_istrstream_vtable;
+/* ??_7ifstream@@6B@ */
+extern const vtable_ptr MSVCP_ifstream_vtable;
/* ??_7iostream@@6B@ */
extern const vtable_ptr MSVCP_iostream_vtable;
/* ??_7strstream@@6B@ */
@@ -262,6 +264,8 @@ __ASM_BLOCK_BEGIN(vtables)
VTABLE_ADD_FUNC(istream_vector_dtor));
__ASM_VTABLE(istrstream,
VTABLE_ADD_FUNC(istream_vector_dtor));
+ __ASM_VTABLE(ifstream,
+ VTABLE_ADD_FUNC(istream_vector_dtor));
__ASM_VTABLE(iostream,
VTABLE_ADD_FUNC(iostream_vector_dtor));
__ASM_VTABLE(strstream,
@@ -280,6 +284,7 @@ const int ostream_vbtable[] = {0, VBTABLE_ENTRY(ostream, FIELD_OFFSET(ostream, v
/* ??_8istream@@7B@ */
/* ??_8istream_withassign@@7B@ */
/* ??_8istrstream@@7B@ */
+/* ??_8ifstream@@7B@ */
const int istream_vbtable[] = {0, VBTABLE_ENTRY(istream, FIELD_OFFSET(istream, vbtable), ios)};
/* ??_8iostream@@7Bistream@@@ */
/* ??_8stdiostream@@7Bistream@@@ */
@@ -305,6 +310,8 @@ DEFINE_RTTI_DATA2(istream_withassign, sizeof(istream),
&istream_rtti_base_descriptor, &ios_rtti_base_descriptor, ".?AVistream_withassign@@")
DEFINE_RTTI_DATA2(istrstream, sizeof(istream),
&istream_rtti_base_descriptor, &ios_rtti_base_descriptor, ".?AVistrstream@@")
+DEFINE_RTTI_DATA2(ifstream, sizeof(istream),
+ &istream_rtti_base_descriptor, &ios_rtti_base_descriptor, ".?AVifstream@@")
DEFINE_RTTI_DATA4(iostream, sizeof(iostream),
&istream_rtti_base_descriptor, &ios_rtti_base_descriptor,
&ostream_rtti_base_descriptor, &ios_rtti_base_descriptor, ".?AViostream@@")
@@ -3113,6 +3120,8 @@ istream* __thiscall istream_copy_ctor(istream *this, const istream *copy, BOOL v
/* ??1istream_withassign@@UEAA(a)XZ */
/* ??1istrstream@@UAE(a)XZ */
/* ??1istrstream@@UEAA(a)XZ */
+/* ??1ifstream@@UAE(a)XZ */
+/* ??1ifstream@@UEAA(a)XZ */
DEFINE_THISCALL_WRAPPER(istream_dtor, 4)
void __thiscall istream_dtor(ios *base)
{
@@ -3152,6 +3161,8 @@ istream* __thiscall istream_assign_sb(istream *this, streambuf *sb)
/* ??4istream_withassign@@QEAAAEAVistream@@AEBV1@@Z */
/* ??4istrstream@@QAEAAV0(a)ABV0@@Z */
/* ??4istrstream@@QEAAAEAV0(a)AEBV0@@Z */
+/* ??4ifstream@@QAEAAV0(a)ABV0@@Z */
+/* ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z */
DEFINE_THISCALL_WRAPPER(istream_assign, 8)
istream* __thiscall istream_assign(istream *this, const istream *rhs)
{
@@ -3164,6 +3175,8 @@ istream* __thiscall istream_assign(istream *this, const istream *rhs)
/* ??_Distream_withassign@@QEAAXXZ */
/* ??_Distrstream@@QAEXXZ */
/* ??_Distrstream@@QEAAXXZ */
+/* ??_Difstream@@QAEXXZ */
+/* ??_Difstream@@QEAAXXZ */
DEFINE_THISCALL_WRAPPER(istream_vbase_dtor, 4)
void __thiscall istream_vbase_dtor(istream *this)
{
@@ -3178,6 +3191,7 @@ void __thiscall istream_vbase_dtor(istream *this)
/* ??_Eistream@@UAEPAXI(a)Z */
/* ??_Eistream_withassign@@UAEPAXI(a)Z */
/* ??_Eistrstream@@UAEPAXI(a)Z */
+/* ??_Eifstream@@UAEPAXI(a)Z */
DEFINE_THISCALL_WRAPPER(istream_vector_dtor, 8)
istream* __thiscall istream_vector_dtor(ios *base, unsigned int flags)
{
@@ -3203,6 +3217,7 @@ istream* __thiscall istream_vector_dtor(ios *base, unsigned int flags)
/* ??_Gistream@@UAEPAXI(a)Z */
/* ??_Gistream_withassign@@UAEPAXI(a)Z */
/* ??_Gistrstream@@UAEPAXI(a)Z */
+/* ??_Gifstream@@UAEPAXI(a)Z */
DEFINE_THISCALL_WRAPPER(istream_scalar_dtor, 8)
istream* __thiscall istream_scalar_dtor(ios *base, unsigned int flags)
{
@@ -4089,6 +4104,175 @@ char* __thiscall istrstream_str(istream *this)
return strstreambuf_str(istrstream_rdbuf(this));
}
+/* ??0ifstream@@QAE(a)ABV0@@Z */
+/* ??0ifstream@@QEAA(a)AEBV0@@Z */
+DEFINE_THISCALL_WRAPPER(ifstream_copy_ctor, 12)
+istream* __thiscall ifstream_copy_ctor(istream *this, const istream *copy, BOOL virt_init)
+{
+ TRACE("(%p %p %d)\n", this, copy, virt_init);
+
+ istream_withassign_copy_ctor(this, copy, virt_init);
+ istream_get_ios(this)->vtable = &MSVCP_ifstream_vtable;
+
+ return this;
+}
+
+/* ??0ifstream@@QAE(a)HPADH@Z */
+/* ??0ifstream@@QEAA(a)HPEADH@Z */
+DEFINE_THISCALL_WRAPPER(ifstream_buffer_ctor, 20)
+istream* __thiscall ifstream_buffer_ctor(istream *this, filedesc fd, char *buffer, int length, BOOL virt_init)
+{
+ ios *base;
+ filebuf *fb = MSVCRT_operator_new(sizeof(filebuf));
+
+ TRACE("(%p %d %p %d %d)\n", this, fd, buffer, length, virt_init);
+
+ if (fb)
+ {
+ filebuf_fd_reserve_ctor(fb, fd, buffer, length);
+ istream_sb_ctor(this, &fb->base, virt_init);
+ }
+ else
+ istream_ctor(this, virt_init);
+
+ base = istream_get_ios(this);
+ base->vtable = &MSVCP_ifstream_vtable;
+ base->delbuf = 1;
+
+ return this;
+}
+
+/* ??0ifstream@@QAE(a)H@Z */
+/* ??0ifstream@@QEAA(a)H@Z */
+DEFINE_THISCALL_WRAPPER(ifstream_fd_ctor, 12)
+istream* __thiscall ifstream_fd_ctor(istream *this, filedesc fd, BOOL virt_init)
+{
+ ios *base;
+ filebuf *fb = MSVCRT_operator_new(sizeof(filebuf));
+
+ TRACE("(%p %d %d)\n", this, fd, virt_init);
+
+ if (fb)
+ {
+ filebuf_fd_ctor(fb, fd);
+ istream_sb_ctor(this, &fb->base, virt_init);
+ }
+ else
+ istream_ctor(this, virt_init);
+
+ base = istream_get_ios(this);
+ base->vtable = &MSVCP_ifstream_vtable;
+ base->delbuf = 1;
+
+ return this;
+}
+
+/* ??0ifstream@@QAE(a)PBDHH@Z */
+/* ??0ifstream@@QEAA(a)PEBDHH@Z */
+DEFINE_THISCALL_WRAPPER(ifstream_open_ctor, 20)
+istream* __thiscall ifstream_open_ctor(istream *this, const char *name, ios_open_mode mode, int protection, BOOL virt_init)
+{
+ ios *base;
+ filebuf *fb = MSVCRT_operator_new(sizeof(filebuf));
+
+ TRACE("(%p %s %d %d %d)\n", this, name, mode, protection, virt_init);
+
+ if (fb)
+ {
+ filebuf_ctor(fb);
+ istream_sb_ctor(this, &fb->base, virt_init);
+ filebuf_open(fb, name, mode, protection);
+ }
+ else
+ istream_ctor(this, virt_init);
+
+ base = istream_get_ios(this);
+ base->vtable = &MSVCP_ifstream_vtable;
+ base->delbuf = 1;
+
+ return this;
+}
+
+/* ??0ifstream@@QAE(a)XZ */
+/* ??0ifstream@@QEAA(a)XZ */
+DEFINE_THISCALL_WRAPPER(ifstream_ctor, 8)
+istream* __thiscall ifstream_ctor(istream *this, BOOL virt_init)
+{
+ return ifstream_fd_ctor(this, -1, virt_init);
+}
+
+/* ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ */
+/* ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ */
+DEFINE_THISCALL_WRAPPER(ifstream_rdbuf, 4)
+filebuf* __thiscall ifstream_rdbuf(const istream *this)
+{
+ TRACE("(%p)\n", this);
+ return (filebuf*) istream_get_ios(this)->sb;
+}
+
+/* ?fd(a)ifstream@@QBEHXZ */
+/* ?fd(a)ifstream@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(ifstream_fd, 4)
+filedesc __thiscall ifstream_fd(istream *this)
+{
+ TRACE("(%p)\n", this);
+ return filebuf_fd(ifstream_rdbuf(this));
+}
+
+/* ?attach(a)ifstream@@QAEXH(a)Z */
+/* ?attach(a)ifstream@@QEAAXH(a)Z */
+DEFINE_THISCALL_WRAPPER(ifstream_attach, 8)
+void __thiscall ifstream_attach(istream *this, filedesc fd)
+{
+ TRACE("(%p %d)\n", this, fd);
+ filebuf_attach(ifstream_rdbuf(this), fd);
+}
+
+/* ?close(a)ifstream@@QAEXXZ */
+/* ?close(a)ifstream@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(ifstream_close, 4)
+void __thiscall ifstream_close(istream *this)
+{
+ TRACE("(%p)\n", this);
+ filebuf_close(ifstream_rdbuf(this));
+}
+
+/* ?is_open(a)ifstream@@QBEHXZ */
+/* ?is_open(a)ifstream@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(ifstream_is_open, 4)
+int __thiscall ifstream_is_open(const istream *this)
+{
+ TRACE("(%p)\n", this);
+ return filebuf_is_open(ifstream_rdbuf(this));
+}
+
+/* ?open(a)ifstream@@QAEXPBDHH(a)Z */
+/* ?open(a)ifstream@@QEAAXPEBDHH(a)Z */
+DEFINE_THISCALL_WRAPPER(ifstream_open, 16)
+void __thiscall ifstream_open(istream *this, const char *name, ios_open_mode mode, int protection)
+{
+ TRACE("(%p %s %d %d)\n", this, name, mode, protection);
+ filebuf_open(ifstream_rdbuf(this), name, mode, protection);
+}
+
+/* ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z */
+/* ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z */
+DEFINE_THISCALL_WRAPPER(ifstream_setbuf, 12)
+streambuf* __thiscall ifstream_setbuf(istream *this, char *buffer, int length)
+{
+ TRACE("(%p %p %d)\n", this, buffer, length);
+ return NULL;
+}
+
+/* ?setmode(a)ifstream@@QAEHH(a)Z */
+/* ?setmode(a)ifstream@@QEAAHH(a)Z */
+DEFINE_THISCALL_WRAPPER(ifstream_setmode, 8)
+int __thiscall ifstream_setmode(istream *this, int mode)
+{
+ TRACE("(%p %d)\n", this, mode);
+ return filebuf_setmode(ifstream_rdbuf(this), mode);
+}
+
static inline ios* iostream_to_ios(const iostream *this)
{
return (ios*)((char*)this + iostream_vbtable_istream[1]);
@@ -4522,6 +4706,7 @@ static void init_io(void *base)
init_istream_rtti(base);
init_istream_withassign_rtti(base);
init_istrstream_rtti(base);
+ init_ifstream_rtti(base);
init_iostream_rtti(base);
init_strstream_rtti(base);
init_stdiostream_rtti(base);
diff --git a/dlls/msvcirt/msvcirt.spec b/dlls/msvcirt/msvcirt.spec
index f2e875695ef..c2b4b9d30eb 100644
--- a/dlls/msvcirt/msvcirt.spec
+++ b/dlls/msvcirt/msvcirt.spec
@@ -26,16 +26,16 @@
@ stub -arch=win64 ??0fstream@@QEAA(a)PEBDHH@Z
@ stub -arch=win32 ??0fstream@@QAE(a)XZ # __thiscall fstream::fstream(void)
@ stub -arch=win64 ??0fstream@@QEAA(a)XZ
-@ stub -arch=win32 ??0ifstream@@QAE(a)ABV0@@Z # __thiscall ifstream::ifstream(class ifstream const &)
-@ stub -arch=win64 ??0ifstream@@QEAA(a)AEBV0@@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)H@Z # __thiscall ifstream::ifstream(int)
-@ stub -arch=win64 ??0ifstream@@QEAA(a)H@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)HPADH@Z # __thiscall ifstream::ifstream(int,char *,int)
-@ stub -arch=win64 ??0ifstream@@QEAA(a)HPEADH@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)PBDHH@Z # __thiscall ifstream::ifstream(char const *,int,int)
-@ stub -arch=win64 ??0ifstream@@QEAA(a)PEBDHH@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)XZ # __thiscall ifstream::ifstream(void)
-@ stub -arch=win64 ??0ifstream@@QEAA(a)XZ
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)ABV0@@Z(ptr ptr long) ifstream_copy_ctor
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)AEBV0@@Z(ptr ptr long) ifstream_copy_ctor
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)H@Z(ptr long long) ifstream_fd_ctor
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)H@Z(ptr long long) ifstream_fd_ctor
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)HPADH@Z(ptr long ptr long long) ifstream_buffer_ctor
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)HPEADH@Z(ptr long ptr long long) ifstream_buffer_ctor
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)PBDHH@Z(ptr str long long long) ifstream_open_ctor
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)PEBDHH@Z(ptr str long long long) ifstream_open_ctor
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)XZ(ptr long) ifstream_ctor
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)XZ(ptr long) ifstream_ctor
@ thiscall -arch=win32 ??0ios@@IAE(a)ABV0@@Z(ptr ptr) ios_copy_ctor
@ cdecl -arch=win64 ??0ios@@IEAA(a)AEBV0@@Z(ptr ptr) ios_copy_ctor
@ thiscall -arch=win32 ??0ios@@IAE(a)XZ(ptr) ios_ctor
@@ -138,8 +138,8 @@
@ cdecl -arch=win64 ??1filebuf@@UEAA(a)XZ(ptr) filebuf_dtor
@ stub -arch=win32 ??1fstream@@UAE(a)XZ # virtual __thiscall fstream::~fstream(void)
@ stub -arch=win64 ??1fstream@@UEAA(a)XZ
-@ stub -arch=win32 ??1ifstream@@UAE(a)XZ # virtual __thiscall ifstream::~ifstream(void)
-@ stub -arch=win64 ??1ifstream@@UEAA(a)XZ
+@ thiscall -arch=win32 ??1ifstream@@UAE(a)XZ(ptr) istream_dtor
+@ cdecl -arch=win64 ??1ifstream@@UEAA(a)XZ(ptr) istream_dtor
@ thiscall -arch=win32 ??1ios@@UAE(a)XZ(ptr) ios_dtor
@ cdecl -arch=win64 ??1ios@@UEAA(a)XZ(ptr) ios_dtor
@ thiscall -arch=win32 ??1iostream@@UAE(a)XZ(ptr) iostream_dtor
@@ -178,8 +178,8 @@
@ cdecl -arch=win64 ??4filebuf@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) filebuf_assign
@ stub -arch=win32 ??4fstream@@QAEAAV0(a)AAV0@@Z # class fstream & __thiscall fstream::operator=(class fstream &)
@ stub -arch=win64 ??4fstream@@QEAAAEAV0(a)AEAV0@@Z
-@ stub -arch=win32 ??4ifstream@@QAEAAV0(a)ABV0@@Z # class ifstream & __thiscall ifstream::operator=(class ifstream const &)
-@ stub -arch=win64 ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z
+@ thiscall -arch=win32 ??4ifstream@@QAEAAV0(a)ABV0@@Z(ptr ptr) istream_assign
+@ cdecl -arch=win64 ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) istream_assign
@ thiscall -arch=win32 ??4ios@@IAEAAV0(a)ABV0@@Z(ptr ptr) ios_assign
@ cdecl -arch=win64 ??4ios@@IEAAAEAV0(a)AEBV0@@Z(ptr ptr) ios_assign
@ thiscall -arch=win32 ??4iostream@@IAEAAV0(a)AAV0@@Z(ptr ptr) iostream_assign
@@ -305,7 +305,7 @@
@ extern ??_7exception@@6B@ MSVCP_exception_vtable
@ extern ??_7filebuf@@6B@ MSVCP_filebuf_vtable
# @ extern ??_7fstream@@6B@ # const fstream::`vftable'
-# @ extern ??_7ifstream@@6B@ # const ifstream::`vftable'
+@ extern ??_7ifstream@@6B@ MSVCP_ifstream_vtable
@ extern ??_7ios@@6B@ MSVCP_ios_vtable
@ extern ??_7iostream@@6B@ MSVCP_iostream_vtable
@ extern ??_7istream@@6B@ MSVCP_istream_vtable
@@ -323,7 +323,7 @@
@ extern ??_7strstreambuf@@6B@ MSVCP_strstreambuf_vtable
# @ extern ??_8fstream@@7Bistream@@@ # const fstream::`vbtable'{for `istream'}
# @ extern ??_8fstream@@7Bostream@@@ # const fstream::`vbtable'{for `ostream'}
-# @ extern ??_8ifstream@@7B@ # const ifstream::`vbtable'
+@ extern ??_8ifstream@@7B@ istream_vbtable
@ extern ??_8iostream@@7Bistream@@@ iostream_vbtable_istream
@ extern ??_8iostream@@7Bostream@@@ iostream_vbtable_ostream
@ extern ??_8istream@@7B@ istream_vbtable
@@ -339,8 +339,8 @@
@ extern ??_8strstream@@7Bostream@@@ iostream_vbtable_ostream
@ stub -arch=win32 ??_Dfstream@@QAEXXZ # void __thiscall fstream::`vbase destructor'(void)
@ stub -arch=win64 ??_Dfstream@@QEAAXXZ
-@ stub -arch=win32 ??_Difstream@@QAEXXZ # void __thiscall ifstream::`vbase destructor'(void)
-@ stub -arch=win64 ??_Difstream@@QEAAXXZ
+@ thiscall -arch=win32 ??_Difstream@@QAEXXZ(ptr) istream_vbase_dtor
+@ cdecl -arch=win64 ??_Difstream@@QEAAXXZ(ptr) istream_vbase_dtor
@ thiscall -arch=win32 ??_Diostream@@QAEXXZ(ptr) iostream_vbase_dtor
@ cdecl -arch=win64 ??_Diostream@@QEAAXXZ(ptr) iostream_vbase_dtor
@ thiscall -arch=win32 ??_Distream@@QAEXXZ(ptr) istream_vbase_dtor
@@ -364,7 +364,7 @@
@ thiscall -arch=win32 ??_Eexception@@UAEPAXI(a)Z(ptr long) MSVCP_exception_vector_dtor
@ thiscall -arch=win32 ??_Efilebuf@@UAEPAXI(a)Z(ptr long) filebuf_vector_dtor
@ stub -arch=win32 ??_Efstream@@UAEPAXI(a)Z # virtual void * __thiscall fstream::`vector deleting destructor'(unsigned int)
-@ stub -arch=win32 ??_Eifstream@@UAEPAXI(a)Z # virtual void * __thiscall ifstream::`vector deleting destructor'(unsigned int)
+@ thiscall -arch=win32 ??_Eifstream@@UAEPAXI(a)Z(ptr long) istream_vector_dtor
@ thiscall -arch=win32 ??_Eios@@UAEPAXI(a)Z(ptr long) ios_vector_dtor
@ thiscall -arch=win32 ??_Eiostream@@UAEPAXI(a)Z(ptr long) iostream_vector_dtor
@ thiscall -arch=win32 ??_Eistream@@UAEPAXI(a)Z(ptr long) istream_vector_dtor
@@ -383,7 +383,7 @@
@ thiscall -arch=win32 ??_Gexception@@UAEPAXI(a)Z(ptr long) MSVCP_exception_scalar_dtor
@ thiscall -arch=win32 ??_Gfilebuf@@UAEPAXI(a)Z(ptr long) filebuf_scalar_dtor
@ stub -arch=win32 ??_Gfstream@@UAEPAXI(a)Z # virtual void * __thiscall fstream::`scalar deleting destructor'(unsigned int)
-@ stub -arch=win32 ??_Gifstream@@UAEPAXI(a)Z # virtual void * __thiscall ifstream::`scalar deleting destructor'(unsigned int)
+@ thiscall -arch=win32 ??_Gifstream@@UAEPAXI(a)Z(ptr long) istream_scalar_dtor
@ thiscall -arch=win32 ??_Gios@@UAEPAXI(a)Z(ptr long) ios_scalar_dtor
@ thiscall -arch=win32 ??_Giostream@@UAEPAXI(a)Z(ptr long) iostream_scalar_dtor
@ thiscall -arch=win32 ??_Gistream@@UAEPAXI(a)Z(ptr long) istream_scalar_dtor
@@ -406,8 +406,8 @@
@ cdecl -arch=win64 ?attach(a)filebuf@@QEAAPEAV1(a)H@Z(ptr long) filebuf_attach
@ stub -arch=win32 ?attach(a)fstream@@QAEXH(a)Z # void __thiscall fstream::attach(int)
@ stub -arch=win64 ?attach(a)fstream@@QEAAXH(a)Z
-@ stub -arch=win32 ?attach(a)ifstream@@QAEXH(a)Z # void __thiscall ifstream::attach(int)
-@ stub -arch=win64 ?attach(a)ifstream@@QEAAXH(a)Z
+@ thiscall -arch=win32 ?attach(a)ifstream@@QAEXH(a)Z(ptr long) ifstream_attach
+@ cdecl -arch=win64 ?attach(a)ifstream@@QEAAXH(a)Z(ptr long) ifstream_attach
@ stub -arch=win32 ?attach(a)ofstream@@QAEXH(a)Z # void __thiscall ofstream::attach(int)
@ stub -arch=win64 ?attach(a)ofstream@@QEAAXH(a)Z
@ thiscall -arch=win32 ?bad(a)ios@@QBEHXZ(ptr) ios_bad
@@ -428,8 +428,8 @@
@ cdecl -arch=win64 ?close(a)filebuf@@QEAAPEAV1(a)XZ(ptr) filebuf_close
@ stub -arch=win32 ?close(a)fstream@@QAEXXZ # void __thiscall fstream::close(void)
@ stub -arch=win64 ?close(a)fstream@@QEAAXXZ
-@ stub -arch=win32 ?close(a)ifstream@@QAEXXZ # void __thiscall ifstream::close(void)
-@ stub -arch=win64 ?close(a)ifstream@@QEAAXXZ
+@ thiscall -arch=win32 ?close(a)ifstream@@QAEXXZ(ptr) ifstream_close
+@ cdecl -arch=win64 ?close(a)ifstream@@QEAAXXZ(ptr) ifstream_close
@ stub -arch=win32 ?close(a)ofstream@@QAEXXZ # void __thiscall ofstream::close(void)
@ stub -arch=win64 ?close(a)ofstream@@QEAAXXZ
@ cdecl -arch=win32 ?clrlock(a)ios@@QAAXXZ(ptr) ios_clrlock
@@ -472,8 +472,8 @@
@ cdecl -arch=win64 ?fd(a)filebuf@@QEBAHXZ(ptr) filebuf_fd
@ stub -arch=win32 ?fd(a)fstream@@QBEHXZ # int __thiscall fstream::fd(void)const
@ stub -arch=win64 ?fd(a)fstream@@QEBAHXZ
-@ stub -arch=win32 ?fd(a)ifstream@@QBEHXZ # int __thiscall ifstream::fd(void)const
-@ stub -arch=win64 ?fd(a)ifstream@@QEBAHXZ
+@ thiscall -arch=win32 ?fd(a)ifstream@@QBEHXZ(ptr) ifstream_fd
+@ cdecl -arch=win64 ?fd(a)ifstream@@QEBAHXZ(ptr) ifstream_fd
@ stub -arch=win32 ?fd(a)ofstream@@QBEHXZ # int __thiscall ofstream::fd(void)const
@ stub -arch=win64 ?fd(a)ofstream@@QEBAHXZ
@ thiscall -arch=win32 ?fill(a)ios@@QAEDD(a)Z(ptr long) ios_fill_set
@@ -541,8 +541,8 @@
@ cdecl -arch=win64 ?is_open(a)filebuf@@QEBAHXZ(ptr) filebuf_is_open
@ stub -arch=win32 ?is_open(a)fstream@@QBEHXZ # int __thiscall fstream::is_open(void)const
@ stub -arch=win64 ?is_open(a)fstream@@QEBAHXZ
-@ stub -arch=win32 ?is_open(a)ifstream@@QBEHXZ # int __thiscall ifstream::is_open(void)const
-@ stub -arch=win64 ?is_open(a)ifstream@@QEBAHXZ
+@ thiscall -arch=win32 ?is_open(a)ifstream@@QBEHXZ(ptr) ifstream_is_open
+@ cdecl -arch=win64 ?is_open(a)ifstream@@QEBAHXZ(ptr) ifstream_is_open
@ stub -arch=win32 ?is_open(a)ofstream@@QBEHXZ # int __thiscall ofstream::is_open(void)const
@ stub -arch=win64 ?is_open(a)ofstream@@QEBAHXZ
@ thiscall -arch=win32 ?isfx(a)istream@@QAEXXZ(ptr) istream_isfx
@@ -566,8 +566,8 @@
@ cdecl -arch=win64 ?open(a)filebuf@@QEAAPEAV1(a)PEBDHH@Z(ptr str long long) filebuf_open
@ stub -arch=win32 ?open(a)fstream@@QAEXPBDHH(a)Z # void __thiscall fstream::open(char const *,int,int)
@ stub -arch=win64 ?open(a)fstream@@QEAAXPEBDHH(a)Z
-@ stub -arch=win32 ?open(a)ifstream@@QAEXPBDHH(a)Z # void __thiscall ifstream::open(char const *,int,int)
-@ stub -arch=win64 ?open(a)ifstream@@QEAAXPEBDHH(a)Z
+@ thiscall -arch=win32 ?open(a)ifstream@@QAEXPBDHH(a)Z(ptr str long long) ifstream_open
+@ cdecl -arch=win64 ?open(a)ifstream@@QEAAXPEBDHH(a)Z(ptr str long long) ifstream_open
@ stub -arch=win32 ?open(a)ofstream@@QAEXPBDHH(a)Z # void __thiscall ofstream::open(char const *,int,int)
@ stub -arch=win64 ?open(a)ofstream@@QEAAXPEBDHH(a)Z
@ extern ?openprot(a)filebuf@@2HB filebuf_openprot
@@ -615,8 +615,8 @@
@ cdecl -arch=win64 ?pword(a)ios@@QEBAAEAPEAXH(a)Z(ptr long) ios_pword
@ stub -arch=win32 ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ # class filebuf * __thiscall fstream::rdbuf(void)const
@ stub -arch=win64 ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ
-@ stub -arch=win32 ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ # class filebuf * __thiscall ifstream::rdbuf(void)const
-@ stub -arch=win64 ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ
+@ thiscall -arch=win32 ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ(ptr) ifstream_rdbuf
+@ cdecl -arch=win64 ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ(ptr) ifstream_rdbuf
@ thiscall -arch=win32 ?rdbuf(a)ios@@QBEPAVstreambuf@@XZ(ptr) ios_rdbuf
@ cdecl -arch=win64 ?rdbuf(a)ios@@QEBAPEAVstreambuf@@XZ(ptr) ios_rdbuf
@ thiscall -arch=win32 ?rdbuf(a)istrstream@@QBEPAVstrstreambuf@@XZ(ptr) istrstream_rdbuf
@@ -663,8 +663,8 @@
@ cdecl -arch=win64 ?setbuf(a)filebuf@@UEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) filebuf_setbuf
@ stub -arch=win32 ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z # class streambuf * __thiscall fstream::setbuf(char *,int)
@ stub -arch=win64 ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z
-@ stub -arch=win32 ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z # class streambuf * __thiscall ifstream::setbuf(char *,int)
-@ stub -arch=win64 ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z
+@ thiscall -arch=win32 ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) ifstream_setbuf
+@ cdecl -arch=win64 ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) ifstream_setbuf
@ stub -arch=win32 ?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z # class streambuf * __thiscall ofstream::setbuf(char *,int)
@ stub -arch=win64 ?setbuf(a)ofstream@@QEAAPEAVstreambuf@@PEADH(a)Z
@ thiscall -arch=win32 ?setbuf(a)streambuf@@UAEPAV1(a)PADH@Z(ptr ptr long) streambuf_setbuf
@@ -685,8 +685,8 @@
@ cdecl -arch=win64 ?setmode(a)filebuf@@QEAAHH(a)Z(ptr long) filebuf_setmode
@ stub -arch=win32 ?setmode(a)fstream@@QAEHH(a)Z # int __thiscall fstream::setmode(int)
@ stub -arch=win64 ?setmode(a)fstream@@QEAAHH(a)Z
-@ stub -arch=win32 ?setmode(a)ifstream@@QAEHH(a)Z # int __thiscall ifstream::setmode(int)
-@ stub -arch=win64 ?setmode(a)ifstream@@QEAAHH(a)Z
+@ thiscall -arch=win32 ?setmode(a)ifstream@@QAEHH(a)Z(ptr long) ifstream_setmode
+@ cdecl -arch=win64 ?setmode(a)ifstream@@QEAAHH(a)Z(ptr long) ifstream_setmode
@ stub -arch=win32 ?setmode(a)ofstream@@QAEHH(a)Z # int __thiscall ofstream::setmode(int)
@ stub -arch=win64 ?setmode(a)ofstream@@QEAAHH(a)Z
@ thiscall -arch=win32 ?setp(a)streambuf@@IAEXPAD0(a)Z(ptr ptr ptr) streambuf_setp
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 6440bc0dab7..fa1f001d6cd 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -23,6 +23,7 @@
#include <stdio.h>
#include <windef.h>
#include <winbase.h>
+#include <sys/stat.h>
#include "wine/test.h"
typedef void (*vtable_ptr)(void);
@@ -403,6 +404,23 @@ static void (*__thiscall p_iostream_vbase_dtor)(iostream*);
static iostream* (*__thiscall p_iostream_assign_sb)(iostream*, streambuf*);
static iostream* (*__thiscall p_iostream_assign)(iostream*, const iostream*);
+/* ifstream */
+static istream* (*__thiscall p_ifstream_copy_ctor)(istream*, const istream*, BOOL);
+static istream* (*__thiscall p_ifstream_buffer_ctor)(istream*, filedesc, char*, int, BOOL);
+static istream* (*__thiscall p_ifstream_fd_ctor)(istream*, filedesc fd, BOOL virt_init);
+static istream* (*__thiscall p_ifstream_open_ctor)(istream*, const char *name, ios_open_mode, int, BOOL);
+static istream* (*__thiscall p_ifstream_ctor)(istream*, BOOL);
+static void (*__thiscall p_ifstream_dtor)(ios*);
+static void (*__thiscall p_ifstream_vbase_dtor)(istream*);
+static void (*__thiscall p_ifstream_attach)(istream*, filedesc);
+static void (*__thiscall p_ifstream_close)(istream*);
+static filedesc (*__thiscall p_ifstream_fd)(istream*);
+static int (*__thiscall p_ifstream_is_open)(const istream*);
+static void (*__thiscall p_ifstream_open)(istream*, const char*, ios_open_mode, int);
+static filebuf* (*__thiscall p_ifstream_rdbuf)(const istream*);
+static streambuf* (*__thiscall p_ifstream_setbuf)(istream*, char*, int);
+static int (*__thiscall p_ifstream_setmode)(istream*, int);
+
/* strstream */
static iostream* (*__thiscall p_strstream_copy_ctor)(iostream*, const iostream*, BOOL);
static iostream* (*__thiscall p_strstream_buffer_ctor)(iostream*, char*, int, int, BOOL);
@@ -703,6 +721,22 @@ static BOOL init(void)
SET(p_iostream_assign_sb, "??4iostream@@IEAAAEAV0(a)PEAVstreambuf@@@Z");
SET(p_iostream_assign, "??4iostream@@IEAAAEAV0(a)AEAV0@@Z");
+ SET(p_ifstream_copy_ctor, "??0ifstream@@QEAA(a)AEBV0@@Z");
+ SET(p_ifstream_buffer_ctor, "??0ifstream@@QEAA(a)HPEADH@Z");
+ SET(p_ifstream_fd_ctor, "??0ifstream@@QEAA(a)H@Z");
+ SET(p_ifstream_open_ctor, "??0ifstream@@QEAA(a)PEBDHH@Z");
+ SET(p_ifstream_ctor, "??0ifstream@@QEAA(a)XZ");
+ SET(p_ifstream_dtor, "??1ifstream@@UEAA(a)XZ");
+ SET(p_ifstream_vbase_dtor, "??_Difstream@@QEAAXXZ");
+ SET(p_ifstream_attach, "?attach(a)ifstream@@QEAAXH(a)Z");
+ SET(p_ifstream_close, "?close(a)ifstream@@QEAAXXZ");
+ SET(p_ifstream_fd, "?fd(a)ifstream@@QEBAHXZ");
+ SET(p_ifstream_is_open, "?is_open(a)ifstream@@QEBAHXZ");
+ SET(p_ifstream_open, "?open(a)ifstream@@QEAAXPEBDHH(a)Z");
+ SET(p_ifstream_rdbuf, "?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ");
+ SET(p_ifstream_setbuf, "?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z");
+ SET(p_ifstream_setmode, "?setmode(a)ifstream@@QEAAHH(a)Z");
+
SET(p_strstream_copy_ctor, "??0strstream@@QEAA(a)AEBV0@@Z");
SET(p_strstream_buffer_ctor, "??0strstream@@QEAA(a)PEADHH@Z");
SET(p_strstream_ctor, "??0strstream@@QEAA(a)XZ");
@@ -917,6 +951,22 @@ static BOOL init(void)
SET(p_iostream_assign_sb, "??4iostream@@IAEAAV0(a)PAVstreambuf@@@Z");
SET(p_iostream_assign, "??4iostream@@IAEAAV0(a)AAV0@@Z");
+ SET(p_ifstream_copy_ctor, "??0ifstream@@QAE(a)ABV0@@Z");
+ SET(p_ifstream_fd_ctor, "??0ifstream@@QAE(a)H@Z");
+ SET(p_ifstream_buffer_ctor, "??0ifstream@@QAE(a)HPADH@Z");
+ SET(p_ifstream_open_ctor, "??0ifstream@@QAE(a)PBDHH@Z");
+ SET(p_ifstream_ctor, "??0ifstream@@QAE(a)XZ");
+ SET(p_ifstream_dtor, "??1ifstream@@UAE(a)XZ");
+ SET(p_ifstream_vbase_dtor, "??_Difstream@@QAEXXZ");
+ SET(p_ifstream_attach, "?attach(a)ifstream@@QAEXH(a)Z");
+ SET(p_ifstream_close, "?close(a)ifstream@@QAEXXZ");
+ SET(p_ifstream_fd, "?fd(a)ifstream@@QBEHXZ");
+ SET(p_ifstream_is_open, "?is_open(a)ifstream@@QBEHXZ");
+ SET(p_ifstream_open, "?open(a)ifstream@@QAEXPBDHH(a)Z");
+ SET(p_ifstream_rdbuf, "?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ");
+ SET(p_ifstream_setbuf, "?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z");
+ SET(p_ifstream_setmode, "?setmode(a)ifstream@@QAEHH(a)Z");
+
SET(p_strstream_copy_ctor, "??0strstream@@QAE(a)ABV0@@Z");
SET(p_strstream_buffer_ctor, "??0strstream@@QAE(a)PADHH@Z");
SET(p_strstream_ctor, "??0strstream@@QAE(a)XZ");
@@ -6720,6 +6770,198 @@ static void test_iostream(void)
ok(ios2.base_ios.do_lock == 0xcdcdcdcd, "expected %d got %d\n", 0xcdcdcdcd, ios2.base_ios.do_lock);
}
+static void test_ifstream(void)
+{
+ const char *filename = "ifstream_test";
+ istream ifs, ifs_copy, *pifs;
+ streambuf *psb;
+ filebuf *pfb;
+ char buffer[64];
+ char st[8];
+ int fd, ret, i;
+
+ memset(&ifs, 0xab, sizeof(istream));
+
+ /* constructors/destructors */
+ pifs = call_func2(p_ifstream_ctor, &ifs, TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(ifs.extract_delim == 0, "expected 0 got %d\n", ifs.extract_delim);
+ ok(ifs.count == 0, "expected 0 got %d\n", ifs.count);
+ ok(ifs.base_ios.sb != NULL, "expected not %p got %p\n", NULL, ifs.base_ios.sb);
+ ok(ifs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, ifs.base_ios.state);
+ ok(ifs.base_ios.delbuf == 1, "expected 1 got %d\n", ifs.base_ios.delbuf);
+ ok(ifs.base_ios.tie == NULL, "expected %p got %p\n", NULL, ifs.base_ios.tie);
+ ok(ifs.base_ios.flags == FLAGS_skipws, "expected %x got %x\n", FLAGS_skipws, ifs.base_ios.flags);
+ ok(ifs.base_ios.precision == 6, "expected 6 got %d\n", ifs.base_ios.precision);
+ ok(ifs.base_ios.fill == ' ', "expected 32 got %d\n", ifs.base_ios.fill);
+ ok(ifs.base_ios.width == 0, "expected 0 got %d\n", ifs.base_ios.width);
+ ok(ifs.base_ios.do_lock == -1, "expected -1 got %d\n", ifs.base_ios.do_lock);
+ ok(pfb->fd == -1, "wrong fd, expected -1 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf == NULL, "wrong ebuf, expected %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd == -1, "wrong fd, expected 0 got %d\n", pfb->fd);
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+
+ pifs = call_func3(p_ifstream_fd_ctor, &ifs, 42, TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(ifs.base_ios.delbuf == 1, "expected 1 got %d\n", ifs.base_ios.delbuf);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf == NULL, "wrong ebuf, expected %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd == 42, "wrong fd, expected 42 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+
+ pifs = call_func3(p_ifstream_copy_ctor, &ifs_copy, &ifs, TRUE);
+ pfb = (filebuf*) ifs_copy.base_ios.sb;
+ ok(pifs == &ifs_copy, "wrong return, expected %p got %p\n", &ifs_copy, pifs);
+ ok(ifs_copy.base_ios.sb == ifs.base_ios.sb, "expected shared streambuf\n");
+
+ call_func1(p_ifstream_vbase_dtor, &ifs_copy);
+ call_func1(p_ifstream_dtor, &ifs.base_ios);
+
+ pifs = call_func5(p_ifstream_buffer_ctor, &ifs, 53, buffer, ARRAY_SIZE(buffer), TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(ifs.base_ios.delbuf == 1, "expected 1 got %d\n", ifs.base_ios.delbuf);
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == buffer, "wrong buffer, expected %p got %p\n", buffer, pfb->base.base);
+ ok(pfb->base.ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), pfb->base.ebuf);
+ ok(pfb->fd == 53, "wrong fd, expected 53 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+ call_func1(p_ifstream_dtor, &ifs.base_ios);
+
+ pifs = call_func5(p_ifstream_buffer_ctor, &ifs, 64, NULL, 0, TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(ifs.base_ios.delbuf == 1, "expected 1 got %d\n", ifs.base_ios.delbuf);
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(pfb->base.allocated == 0, "wrong allocate value, expected 0 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base == NULL, "wrong buffer, expected %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf == NULL, "wrong ebuf, expected %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd == 64, "wrong fd, expected 64 got %d\n", pfb->fd);
+ ok(pfb->close == 0, "wrong value, expected 0 got %d\n", pfb->close);
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+
+ pifs = call_func5(p_ifstream_open_ctor, &ifs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(ifs.base_ios.delbuf == 1, "expected 1 got %d\n", ifs.base_ios.delbuf);
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(pfb->base.allocated == 1, "wrong allocate value, expected 1 got %d\n", pfb->base.allocated);
+ ok(pfb->base.unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", pfb->base.unbuffered);
+ ok(pfb->base.base != NULL, "wrong buffer, expected not %p got %p\n", NULL, pfb->base.base);
+ ok(pfb->base.ebuf != NULL, "wrong ebuf, expected not %p got %p\n", NULL, pfb->base.ebuf);
+ ok(pfb->fd != -1, "wrong fd, expected not -1 got %d\n", pfb->fd);
+ fd = pfb->fd;
+ ok(pfb->close == 1, "wrong value, expected 1 got %d\n", pfb->close);
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+ ok(_close(fd) == -1, "expected ifstream to close opened file\n");
+
+ /* setbuf - seems to be a nop and always return NULL */
+ pifs = call_func5(p_ifstream_buffer_ctor, &ifs, 64, NULL, 0, TRUE);
+ ok(ifs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", ifs.base_ios.sb->base);
+ ok(ifs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", ifs.base_ios.sb->ebuf);
+ ok(ifs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", pfb->base.unbuffered);
+ ok(ifs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", ifs.base_ios.sb->allocated);
+
+ psb = call_func3(p_ifstream_setbuf, &ifs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", pfb);
+ ok(ifs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", ifs.base_ios.sb->base);
+ ok(ifs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", ifs.base_ios.sb->ebuf);
+ ok(ifs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", ifs.base_ios.sb->unbuffered);
+ ok(ifs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", ifs.base_ios.sb->allocated);
+
+ psb = call_func3(p_ifstream_setbuf, &ifs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", pfb);
+ ok(ifs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", ifs.base_ios.sb->base);
+ ok(ifs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", ifs.base_ios.sb->ebuf);
+ ok(ifs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", ifs.base_ios.sb->unbuffered);
+ ok(ifs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got \n", ifs.base_ios.sb->allocated);
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+
+ pifs = call_func5(p_ifstream_open_ctor, &ifs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ psb = call_func3(p_ifstream_setbuf, &ifs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", pfb);
+ ok(ifs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", ifs.base_ios.sb->base);
+ ok(ifs.base_ios.sb->ebuf != NULL, "wrong ebuf value, expected NULL got %p\n", ifs.base_ios.sb->ebuf);
+ ok(ifs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", ifs.base_ios.sb->unbuffered);
+ ok(ifs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", ifs.base_ios.sb->allocated);
+
+ psb = call_func3(p_ifstream_setbuf, &ifs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", pfb);
+ ok(ifs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", ifs.base_ios.sb->base);
+ ok(ifs.base_ios.sb->base != buffer, "wrong base value, expected not %p got %p\n", buffer, ifs.base_ios.sb->base);
+ ok(ifs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 1 got %d\n", ifs.base_ios.sb->unbuffered);
+ ok(ifs.base_ios.sb->allocated == 1, "wrong allocated value, expected 0 got %d\n", ifs.base_ios.sb->allocated);
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+
+ /* attach */
+ pifs = call_func2(p_ifstream_ctor, &ifs, TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ call_func2(p_ifstream_attach, &ifs, 42);
+ fd = call_func1(p_ifstream_fd, &ifs);
+ ok(fd == 42, "wrong fd, expected 42 got %d\n", fd);
+ ok(pfb->close == 0, "wrong close value, expected 0 got %d\n", pfb->close);
+ call_func2(p_ifstream_attach, &ifs, 53);
+ ok(fd == 42, "wrong fd, expected 42 got %d\n", fd);
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+
+ /* fd */
+ pifs = call_func5(p_ifstream_open_ctor, &ifs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ pfb = (filebuf*) ifs.base_ios.sb;
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ fd = call_func1(p_ifstream_fd, &ifs);
+ ok(fd == pfb->fd, "wrong fd, expected %d but got %d\n", pfb->fd, fd);
+
+ /* rdbuf */
+ pfb = (filebuf*) call_func1(p_ifstream_rdbuf, &ifs);
+ ok((streambuf*) pfb == ifs.base_ios.sb, "wrong return, expected %p got %p\n", ifs.base_ios.sb, pfb);
+
+ /* setmode */
+ ret = call_func2(p_ifstream_setmode, &ifs, filebuf_binary);
+ ok(ret == filebuf_text, "wrong return, expected %d got %d\n", filebuf_text, ret);
+ ret = call_func2(p_ifstream_setmode, &ifs, filebuf_binary);
+ ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
+ ret = call_func2(p_ifstream_setmode, &ifs, filebuf_text);
+ ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
+ ret = call_func2(p_ifstream_setmode, &ifs, 0x9000);
+ ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
+
+ /* close && is_open */
+ ok(call_func1(p_ifstream_is_open, &ifs) == 1, "expected ifstream to be open\n");
+ call_func1(p_ifstream_close, &ifs);
+ ok(call_func1(p_ifstream_is_open, &ifs) == 0, "expected ifstream to not be open\n");
+ ok(_close(fd) == -1, "expected close to close the opened file\n");
+
+ /* integration with parent istream - reading */
+ fd = _open(filename, _O_TRUNC|_O_CREAT|_O_RDWR, _S_IWRITE);
+ ok(fd != -1, "_open failed\n");
+ ok(_write(fd, "test 12", 7) == 7, "_write failed\n");
+ ok(_close(fd) == 0, "_close failed\n");
+
+ call_func4(p_ifstream_open, &ifs, filename, OPENMODE_in, filebuf_openprot);
+ memset(st, 'A', sizeof(st));
+ st[7] = 0;
+ pifs = call_func2(p_istream_read_str, &ifs, st);
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(!strcmp(st, "test"), "expected 'test' got '%s'\n", st);
+
+ i = 12345;
+ pifs = call_func2(p_istream_read_int, pifs, &i);
+ ok(pifs == &ifs, "wrong return, expected %p got %p\n", &ifs, pifs);
+ ok(i == 12, "expected 12 got %d\n", i);
+
+ call_func1(p_ifstream_vbase_dtor, &ifs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+}
+
static void test_strstream(void)
{
iostream ios1, ios2, *pios;
@@ -7538,6 +7780,7 @@ START_TEST(msvcirt)
test_istream_withassign();
test_istrstream();
test_iostream();
+ test_ifstream();
test_strstream();
test_stdiostream();
test_Iostream_init();
diff --git a/dlls/msvcrt20/msvcrt20.spec b/dlls/msvcrt20/msvcrt20.spec
index f06a53cc601..2ce72c6b13c 100644
--- a/dlls/msvcrt20/msvcrt20.spec
+++ b/dlls/msvcrt20/msvcrt20.spec
@@ -20,16 +20,16 @@
@ stub -arch=win64 ??0fstream@@QEAA(a)PEBDHH@Z
@ stub -arch=win32 ??0fstream@@QAE(a)XZ
@ stub -arch=win64 ??0fstream@@QEAA(a)XZ
-@ stub -arch=win32 ??0ifstream@@QAE(a)ABV0@@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)AEBV0@@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)H@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)H@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)HPADH@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)HPEADH@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)PBDHH@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)PEBDHH@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)XZ
-@ stub -arch=win64 ??0ifstream@@QEAA(a)XZ
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)ABV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QAE(a)ABV0@@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)AEBV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QEAA(a)AEBV0@@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)H@Z(ptr long long) msvcirt.??0ifstream@@QAE(a)H@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)H@Z(ptr long long) msvcirt.??0ifstream@@QEAA(a)H@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)HPADH@Z(ptr long ptr long long) msvcirt.??0ifstream@@QAE(a)HPADH@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)HPEADH@Z(ptr long ptr long long) msvcirt.??0ifstream@@QEAA(a)HPEADH@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)PBDHH@Z(ptr str long long long) msvcirt.??0ifstream@@QAE(a)PBDHH@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)PEBDHH@Z(ptr str long long long) msvcirt.??0ifstream@@QEAA(a)PEBDHH@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)XZ(ptr long) msvcirt.??0ifstream@@QAE(a)XZ
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)XZ(ptr long) msvcirt.??0ifstream@@QEAA(a)XZ
@ thiscall -arch=win32 ??0ios@@IAE(a)ABV0@@Z(ptr ptr) msvcirt.??0ios@@IAE(a)ABV0@@Z
@ cdecl -arch=win64 ??0ios@@IEAA(a)AEBV0@@Z(ptr ptr) msvcirt.??0ios@@IEAA(a)AEBV0@@Z
@ thiscall -arch=win32 ??0ios@@IAE(a)XZ(ptr) msvcirt.??0ios@@IAE(a)XZ
@@ -124,8 +124,8 @@
@ cdecl -arch=win64 ??1filebuf@@UEAA(a)XZ(ptr) msvcirt.??1filebuf@@UEAA(a)XZ
@ stub -arch=win32 ??1fstream@@UAE(a)XZ
@ stub -arch=win64 ??1fstream@@UEAA(a)XZ
-@ stub -arch=win32 ??1ifstream@@UAE(a)XZ
-@ stub -arch=win64 ??1ifstream@@UEAA(a)XZ
+@ thiscall -arch=win32 ??1ifstream@@UAE(a)XZ(ptr) msvcirt.??1ifstream@@UAE(a)XZ
+@ cdecl -arch=win64 ??1ifstream@@UEAA(a)XZ(ptr) msvcirt.??1ifstream@@UEAA(a)XZ
@ thiscall -arch=win32 ??1ios@@UAE(a)XZ(ptr) msvcirt.??1ios@@UAE(a)XZ
@ cdecl -arch=win64 ??1ios@@UEAA(a)XZ(ptr) msvcirt.??1ios@@UEAA(a)XZ
@ thiscall -arch=win32 ??1iostream@@UAE(a)XZ(ptr) msvcirt.??1iostream@@UAE(a)XZ
@@ -164,8 +164,8 @@
@ cdecl -arch=win64 ??4filebuf@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4filebuf@@QEAAAEAV0(a)AEBV0@@Z
@ stub -arch=win32 ??4fstream@@QAEAAV0(a)AAV0@@Z
@ stub -arch=win64 ??4fstream@@QEAAAEAV0(a)AEAV0@@Z
-@ stub -arch=win32 ??4ifstream@@QAEAAV0(a)ABV0@@Z
-@ stub -arch=win64 ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z
+@ thiscall -arch=win32 ??4ifstream@@QAEAAV0(a)ABV0@@Z(ptr ptr) msvcirt.??4ifstream@@QAEAAV0(a)ABV0@@Z
+@ cdecl -arch=win64 ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4ifstream@@QEAAAEAV0(a)AEBV0@@Z
@ thiscall -arch=win32 ??4ios@@IAEAAV0(a)ABV0@@Z(ptr ptr) msvcirt.??4ios@@IAEAAV0(a)ABV0@@Z
@ cdecl -arch=win64 ??4ios@@IEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4ios@@IEAAAEAV0(a)AEBV0@@Z
@ thiscall -arch=win32 ??4iostream@@IAEAAV0(a)AAV0@@Z(ptr ptr) msvcirt.??4iostream@@IAEAAV0(a)AAV0@@Z
@@ -288,7 +288,7 @@
@ cdecl -arch=win64 ??Bios@@QEBAPEAXXZ(ptr) msvcirt.??Bios@@QEBAPEAXXZ
@ extern ??_7filebuf@@6B@ msvcirt.??_7filebuf@@6B@
# @ extern ??_7fstream@@6B@
-# @ extern ??_7ifstream@@6B@
+@ extern ??_7ifstream@@6B@ msvcirt.??_7ifstream@@6B@
@ extern ??_7ios@@6B@ msvcirt.??_7ios@@6B@
@ extern ??_7iostream@@6B@ msvcirt.??_7iostream@@6B@
@ extern ??_7istream@@6B@ msvcirt.??_7istream@@6B@
@@ -305,7 +305,7 @@
@ extern ??_7strstreambuf@@6B@ msvcirt.??_7strstreambuf@@6B@
# @ extern ??_8fstream@@7Bistream@@@
# @ extern ??_8fstream@@7Bostream@@@
-# @ extern ??_8ifstream@@7B@
+@ extern ??_8ifstream@@7B@ msvcirt.??_8ifstream@@7B@
@ extern ??_8iostream@@7Bistream@@@ msvcirt.??_8iostream@@7Bistream@@@
@ extern ??_8iostream@@7Bostream@@@ msvcirt.??_8iostream@@7Bostream@@@
@ extern ??_8istream@@7B@ msvcirt.??_8istream@@7B@
@@ -321,8 +321,8 @@
@ extern ??_8strstream@@7Bostream@@@ msvcirt.??_8strstream@@7Bostream@@@
@ stub -arch=win32 ??_Dfstream@@QAEXXZ
@ stub -arch=win64 ??_Dfstream@@QEAAXXZ
-@ stub -arch=win32 ??_Difstream@@QAEXXZ
-@ stub -arch=win64 ??_Difstream@@QEAAXXZ
+@ thiscall -arch=win32 ??_Difstream@@QAEXXZ(ptr) msvcirt.??_Difstream@@QAEXXZ
+@ cdecl -arch=win64 ??_Difstream@@QEAAXXZ(ptr) msvcirt.??_Difstream@@QEAAXXZ
@ thiscall -arch=win32 ??_Diostream@@QAEXXZ(ptr) msvcirt.??_Diostream@@QAEXXZ
@ cdecl -arch=win64 ??_Diostream@@QEAAXXZ(ptr) msvcirt.??_Diostream@@QEAAXXZ
@ thiscall -arch=win32 ??_Distream@@QAEXXZ(ptr) msvcirt.??_Distream@@QAEXXZ
@@ -346,7 +346,7 @@
@ stub -arch=win32 ??_EIostream_init@@QAEPAXI(a)Z
@ thiscall -arch=win32 ??_Efilebuf@@UAEPAXI(a)Z(ptr long) msvcirt.??_Efilebuf@@UAEPAXI(a)Z
@ stub -arch=win32 ??_Efstream@@UAEPAXI(a)Z
-@ stub -arch=win32 ??_Eifstream@@UAEPAXI(a)Z
+@ thiscall -arch=win32 ??_Eifstream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eifstream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Eios@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eios@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Eiostream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eiostream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Eistream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eistream@@UAEPAXI(a)Z
@@ -364,7 +364,7 @@
@ stub -arch=win32 ??_GIostream_init@@QAEPAXI(a)Z
@ thiscall -arch=win32 ??_Gfilebuf@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gfilebuf@@UAEPAXI(a)Z
@ stub -arch=win32 ??_Gfstream@@UAEPAXI(a)Z
-@ stub -arch=win32 ??_Gifstream@@UAEPAXI(a)Z
+@ thiscall -arch=win32 ??_Gifstream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gifstream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Gios@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gios@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Giostream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Giostream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Gistream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gistream@@UAEPAXI(a)Z
@@ -394,8 +394,8 @@
@ cdecl -arch=win64 ?attach(a)filebuf@@QEAAPEAV1(a)H@Z(ptr long) msvcirt.?attach(a)filebuf@@QEAAPEAV1(a)H@Z
@ stub -arch=win32 ?attach(a)fstream@@QAEXH(a)Z
@ stub -arch=win64 ?attach(a)fstream@@QEAAXH(a)Z
-@ stub -arch=win32 ?attach(a)ifstream@@QAEXH(a)Z
-@ stub -arch=win64 ?attach(a)ifstream@@QEAAXH(a)Z
+@ thiscall -arch=win32 ?attach(a)ifstream@@QAEXH(a)Z(ptr long) msvcirt.?attach(a)ifstream@@QAEXH(a)Z
+@ cdecl -arch=win64 ?attach(a)ifstream@@QEAAXH(a)Z(ptr long) msvcirt.?attach(a)ifstream@@QEAAXH(a)Z
@ stub -arch=win32 ?attach(a)ofstream@@QAEXH(a)Z
@ stub -arch=win64 ?attach(a)ofstream@@QEAAXH(a)Z
@ thiscall -arch=win32 ?bad(a)ios@@QBEHXZ(ptr) msvcirt.?bad(a)ios@@QBEHXZ
@@ -416,8 +416,8 @@
@ cdecl -arch=win64 ?close(a)filebuf@@QEAAPEAV1(a)XZ(ptr) msvcirt.?close(a)filebuf@@QEAAPEAV1(a)XZ
@ stub -arch=win32 ?close(a)fstream@@QAEXXZ
@ stub -arch=win64 ?close(a)fstream@@QEAAXXZ
-@ stub -arch=win32 ?close(a)ifstream@@QAEXXZ
-@ stub -arch=win64 ?close(a)ifstream@@QEAAXXZ
+@ thiscall -arch=win32 ?close(a)ifstream@@QAEXXZ(ptr) msvcirt.?close(a)ifstream@@QAEXXZ
+@ cdecl -arch=win64 ?close(a)ifstream@@QEAAXXZ(ptr) msvcirt.?close(a)ifstream@@QEAAXXZ
@ stub -arch=win32 ?close(a)ofstream@@QAEXXZ
@ stub -arch=win64 ?close(a)ofstream@@QEAAXXZ
@ cdecl -arch=win32 ?clrlock(a)ios@@QAAXXZ(ptr) msvcirt.?clrlock(a)ios@@QAAXXZ
@@ -460,8 +460,8 @@
@ cdecl -arch=win64 ?fd(a)filebuf@@QEBAHXZ(ptr) msvcirt.?fd(a)filebuf@@QEBAHXZ
@ stub -arch=win32 ?fd(a)fstream@@QBEHXZ
@ stub -arch=win64 ?fd(a)fstream@@QEBAHXZ
-@ stub -arch=win32 ?fd(a)ifstream@@QBEHXZ
-@ stub -arch=win64 ?fd(a)ifstream@@QEBAHXZ
+@ thiscall -arch=win32 ?fd(a)ifstream@@QBEHXZ(ptr) msvcirt.?fd(a)ifstream@@QBEHXZ
+@ cdecl -arch=win64 ?fd(a)ifstream@@QEBAHXZ(ptr) msvcirt.?fd(a)ifstream@@QEBAHXZ
@ stub -arch=win32 ?fd(a)ofstream@@QBEHXZ
@ stub -arch=win64 ?fd(a)ofstream@@QEBAHXZ
@ thiscall -arch=win32 ?fill(a)ios@@QAEDD(a)Z(ptr long) msvcirt.?fill(a)ios@@QAEDD(a)Z
@@ -527,8 +527,8 @@
@ cdecl -arch=win64 ?is_open(a)filebuf@@QEBAHXZ(ptr) msvcirt.?is_open(a)filebuf@@QEBAHXZ
@ stub -arch=win32 ?is_open(a)fstream@@QBEHXZ
@ stub -arch=win64 ?is_open(a)fstream@@QEBAHXZ
-@ stub -arch=win32 ?is_open(a)ifstream@@QBEHXZ
-@ stub -arch=win64 ?is_open(a)ifstream@@QEBAHXZ
+@ thiscall -arch=win32 ?is_open(a)ifstream@@QBEHXZ(ptr) msvcirt.?is_open(a)ifstream@@QBEHXZ
+@ cdecl -arch=win64 ?is_open(a)ifstream@@QEBAHXZ(ptr) msvcirt.?is_open(a)ifstream@@QEBAHXZ
@ stub -arch=win32 ?is_open(a)ofstream@@QBEHXZ
@ stub -arch=win64 ?is_open(a)ofstream@@QEBAHXZ
@ thiscall -arch=win32 ?isfx(a)istream@@QAEXXZ(ptr) msvcirt.?isfx(a)istream@@QAEXXZ
@@ -552,8 +552,8 @@
@ cdecl -arch=win64 ?open(a)filebuf@@QEAAPEAV1(a)PEBDHH@Z(ptr str long long) msvcirt.?open(a)filebuf@@QEAAPEAV1(a)PEBDHH@Z
@ stub -arch=win32 ?open(a)fstream@@QAEXPBDHH(a)Z
@ stub -arch=win64 ?open(a)fstream@@QEAAXPEBDHH(a)Z
-@ stub -arch=win32 ?open(a)ifstream@@QAEXPBDHH(a)Z
-@ stub -arch=win64 ?open(a)ifstream@@QEAAXPEBDHH(a)Z
+@ thiscall -arch=win32 ?open(a)ifstream@@QAEXPBDHH(a)Z(ptr str long long) msvcirt.?open(a)ifstream@@QAEXPBDHH(a)Z
+@ cdecl -arch=win64 ?open(a)ifstream@@QEAAXPEBDHH(a)Z(ptr str long long) msvcirt.?open(a)ifstream@@QEAAXPEBDHH(a)Z
@ stub -arch=win32 ?open(a)ofstream@@QAEXPBDHH(a)Z
@ stub -arch=win64 ?open(a)ofstream@@QEAAXPEBDHH(a)Z
@ extern ?openprot(a)filebuf@@2HB msvcirt.?openprot(a)filebuf@@2HB
@@ -601,8 +601,8 @@
@ cdecl -arch=win64 ?pword(a)ios@@QEBAAEAPEAXH(a)Z(ptr long) msvcirt.?pword(a)ios@@QEBAAEAPEAXH(a)Z
@ stub -arch=win32 ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ
@ stub -arch=win64 ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ
-@ stub -arch=win32 ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ
-@ stub -arch=win64 ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ
+@ thiscall -arch=win32 ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ
+@ cdecl -arch=win64 ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ
@ thiscall -arch=win32 ?rdbuf(a)ios@@QBEPAVstreambuf@@XZ(ptr) msvcirt.?rdbuf(a)ios@@QBEPAVstreambuf@@XZ
@ cdecl -arch=win64 ?rdbuf(a)ios@@QEBAPEAVstreambuf@@XZ(ptr) msvcirt.?rdbuf(a)ios@@QEBAPEAVstreambuf@@XZ
@ thiscall -arch=win32 ?rdbuf(a)istrstream@@QBEPAVstrstreambuf@@XZ(ptr) msvcirt.?rdbuf(a)istrstream@@QBEPAVstrstreambuf@@XZ
@@ -651,8 +651,8 @@
@ cdecl -arch=win64 ?setbuf(a)filebuf@@UEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)filebuf@@UEAAPEAVstreambuf@@PEADH(a)Z
@ stub -arch=win32 ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z
@ stub -arch=win64 ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z
-@ stub -arch=win32 ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z
-@ stub -arch=win64 ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z
+@ thiscall -arch=win32 ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z
+@ cdecl -arch=win64 ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z
@ stub -arch=win32 ?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z
@ stub -arch=win64 ?setbuf(a)ofstream@@QEAAPEAVstreambuf@@PEADH(a)Z
@ thiscall -arch=win32 ?setbuf(a)streambuf@@UAEPAV1(a)PADH@Z(ptr ptr long) msvcirt.?setbuf(a)streambuf@@UAEPAV1(a)PADH@Z
@@ -673,8 +673,8 @@
@ cdecl -arch=win64 ?setmode(a)filebuf@@QEAAHH(a)Z(ptr long) msvcirt.?setmode(a)filebuf@@QEAAHH(a)Z
@ stub -arch=win32 ?setmode(a)fstream@@QAEHH(a)Z
@ stub -arch=win64 ?setmode(a)fstream@@QEAAHH(a)Z
-@ stub -arch=win32 ?setmode(a)ifstream@@QAEHH(a)Z
-@ stub -arch=win64 ?setmode(a)ifstream@@QEAAHH(a)Z
+@ thiscall -arch=win32 ?setmode(a)ifstream@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)ifstream@@QAEHH(a)Z
+@ cdecl -arch=win64 ?setmode(a)ifstream@@QEAAHH(a)Z(ptr long) msvcirt.?setmode(a)ifstream@@QEAAHH(a)Z
@ stub -arch=win32 ?setmode(a)ofstream@@QAEHH(a)Z
@ stub -arch=win64 ?setmode(a)ofstream@@QEAAHH(a)Z
@ thiscall -arch=win32 ?setp(a)streambuf@@IAEXPAD0(a)Z(ptr ptr ptr) msvcirt.?setp(a)streambuf@@IAEXPAD0(a)Z
diff --git a/dlls/msvcrt40/msvcrt40.spec b/dlls/msvcrt40/msvcrt40.spec
index f0d966acd7c..efa3e3251d6 100644
--- a/dlls/msvcrt40/msvcrt40.spec
+++ b/dlls/msvcrt40/msvcrt40.spec
@@ -38,16 +38,16 @@
@ stub -arch=win64 ??0fstream@@QEAA(a)PEBDHH@Z
@ stub -arch=win32 ??0fstream@@QAE(a)XZ
@ stub -arch=win64 ??0fstream@@QEAA(a)XZ
-@ stub -arch=win32 ??0ifstream@@QAE(a)ABV0@@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)AEBV0@@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)H@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)H@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)HPADH@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)HPEADH@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)PBDHH@Z
-@ stub -arch=win64 ??0ifstream@@QEAA(a)PEBDHH@Z
-@ stub -arch=win32 ??0ifstream@@QAE(a)XZ
-@ stub -arch=win64 ??0ifstream@@QEAA(a)XZ
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)ABV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QAE(a)ABV0@@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)AEBV0@@Z(ptr ptr long) msvcirt.??0ifstream@@QEAA(a)AEBV0@@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)H@Z(ptr long long) msvcirt.??0ifstream@@QAE(a)H@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)H@Z(ptr long long) msvcirt.??0ifstream@@QEAA(a)H@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)HPADH@Z(ptr long ptr long long) msvcirt.??0ifstream@@QAE(a)HPADH@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)HPEADH@Z(ptr long ptr long long) msvcirt.??0ifstream@@QEAA(a)HPEADH@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)PBDHH@Z(ptr str long long long) msvcirt.??0ifstream@@QAE(a)PBDHH@Z
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)PEBDHH@Z(ptr str long long long) msvcirt.??0ifstream@@QEAA(a)PEBDHH@Z
+@ thiscall -arch=win32 ??0ifstream@@QAE(a)XZ(ptr long) msvcirt.??0ifstream@@QAE(a)XZ
+@ cdecl -arch=win64 ??0ifstream@@QEAA(a)XZ(ptr long) msvcirt.??0ifstream@@QEAA(a)XZ
@ thiscall -arch=win32 ??0ios@@IAE(a)ABV0@@Z(ptr ptr) msvcirt.??0ios@@IAE(a)ABV0@@Z
@ cdecl -arch=win64 ??0ios@@IEAA(a)AEBV0@@Z(ptr ptr) msvcirt.??0ios@@IEAA(a)AEBV0@@Z
@ thiscall -arch=win32 ??0ios@@IAE(a)XZ(ptr) msvcirt.??0ios@@IAE(a)XZ
@@ -154,8 +154,8 @@
@ cdecl -arch=win64 ??1filebuf@@UEAA(a)XZ(ptr) msvcirt.??1filebuf@@UEAA(a)XZ
@ stub -arch=win32 ??1fstream@@UAE(a)XZ
@ stub -arch=win64 ??1fstream@@UEAA(a)XZ
-@ stub -arch=win32 ??1ifstream@@UAE(a)XZ
-@ stub -arch=win64 ??1ifstream@@UEAA(a)XZ
+@ thiscall -arch=win32 ??1ifstream@@UAE(a)XZ(ptr) msvcirt.??1ifstream@@UAE(a)XZ
+@ cdecl -arch=win64 ??1ifstream@@UEAA(a)XZ(ptr) msvcirt.??1ifstream@@UEAA(a)XZ
@ thiscall -arch=win32 ??1ios@@UAE(a)XZ(ptr) msvcirt.??1ios@@UAE(a)XZ
@ cdecl -arch=win64 ??1ios@@UEAA(a)XZ(ptr) msvcirt.??1ios@@UEAA(a)XZ
@ thiscall -arch=win32 ??1iostream@@UAE(a)XZ(ptr) msvcirt.??1iostream@@UAE(a)XZ
@@ -206,8 +206,8 @@
@ cdecl -arch=win64 ??4filebuf@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4filebuf@@QEAAAEAV0(a)AEBV0@@Z
@ stub -arch=win32 ??4fstream@@QAEAAV0(a)AAV0@@Z
@ stub -arch=win64 ??4fstream@@QEAAAEAV0(a)AEAV0@@Z
-@ stub -arch=win32 ??4ifstream@@QAEAAV0(a)ABV0@@Z
-@ stub -arch=win64 ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z
+@ thiscall -arch=win32 ??4ifstream@@QAEAAV0(a)ABV0@@Z(ptr ptr) msvcirt.??4ifstream@@QAEAAV0(a)ABV0@@Z
+@ cdecl -arch=win64 ??4ifstream@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4ifstream@@QEAAAEAV0(a)AEBV0@@Z
@ thiscall -arch=win32 ??4ios@@IAEAAV0(a)ABV0@@Z(ptr ptr) msvcirt.??4ios@@IAEAAV0(a)ABV0@@Z
@ cdecl -arch=win64 ??4ios@@IEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4ios@@IEAAAEAV0(a)AEBV0@@Z
@ thiscall -arch=win32 ??4iostream@@IAEAAV0(a)AAV0@@Z(ptr ptr) msvcirt.??4iostream@@IAEAAV0(a)AAV0@@Z
@@ -340,7 +340,7 @@
@ extern ??_7exception@@6B@ msvcrt.??_7exception@@6B@
@ extern ??_7filebuf@@6B@ msvcirt.??_7filebuf@@6B@
# @ extern ??_7fstream@@6B@
-# @ extern ??_7ifstream@@6B@
+@ extern ??_7ifstream@@6B@ msvcirt.??_7ifstream@@6B@
@ extern ??_7ios@@6B@ msvcirt.??_7ios@@6B@
@ extern ??_7iostream@@6B@ msvcirt.??_7iostream@@6B@
@ extern ??_7istream@@6B@ msvcirt.??_7istream@@6B@
@@ -358,7 +358,7 @@
@ extern ??_7strstreambuf@@6B@ msvcirt.??_7strstreambuf@@6B@
# @ extern ??_8fstream@@7Bistream@@@
# @ extern ??_8fstream@@7Bostream@@@
-# @ extern ??_8ifstream@@7B@
+@ extern ??_8ifstream@@7B@ msvcirt.??_8ifstream@@7B@
@ extern ??_8iostream@@7Bistream@@@ msvcirt.??_8iostream@@7Bistream@@@
@ extern ??_8iostream@@7Bostream@@@ msvcirt.??_8iostream@@7Bostream@@@
@ extern ??_8istream@@7B@ msvcirt.??_8istream@@7B@
@@ -374,8 +374,8 @@
@ extern ??_8strstream@@7Bostream@@@ msvcirt.??_8strstream@@7Bostream@@@
@ stub -arch=win32 ??_Dfstream@@QAEXXZ
@ stub -arch=win64 ??_Dfstream@@QEAAXXZ
-@ stub -arch=win32 ??_Difstream@@QAEXXZ
-@ stub -arch=win64 ??_Difstream@@QEAAXXZ
+@ thiscall -arch=win32 ??_Difstream@@QAEXXZ(ptr) msvcirt.??_Difstream@@QAEXXZ
+@ cdecl -arch=win64 ??_Difstream@@QEAAXXZ(ptr) msvcirt.??_Difstream@@QEAAXXZ
@ thiscall -arch=win32 ??_Diostream@@QAEXXZ(ptr) msvcirt.??_Diostream@@QAEXXZ
@ cdecl -arch=win64 ??_Diostream@@QEAAXXZ(ptr) msvcirt.??_Diostream@@QEAAXXZ
@ thiscall -arch=win32 ??_Distream@@QAEXXZ(ptr) msvcirt.??_Distream@@QAEXXZ
@@ -403,7 +403,7 @@
@ thiscall -arch=win32 ??_Eexception@@UAEPAXI(a)Z(ptr long) msvcrt.??_Eexception@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Efilebuf@@UAEPAXI(a)Z(ptr long) msvcirt.??_Efilebuf@@UAEPAXI(a)Z
@ stub -arch=win32 ??_Efstream@@UAEPAXI(a)Z
-@ stub -arch=win32 ??_Eifstream@@UAEPAXI(a)Z
+@ thiscall -arch=win32 ??_Eifstream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eifstream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Eios@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eios@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Eiostream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eiostream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Eistream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Eistream@@UAEPAXI(a)Z
@@ -426,7 +426,7 @@
@ thiscall -arch=win32 ??_Gexception@@UAEPAXI(a)Z(ptr long) msvcrt.??_Gexception@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Gfilebuf@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gfilebuf@@UAEPAXI(a)Z
@ stub -arch=win32 ??_Gfstream@@UAEPAXI(a)Z
-@ stub -arch=win32 ??_Gifstream@@UAEPAXI(a)Z
+@ thiscall -arch=win32 ??_Gifstream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gifstream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Gios@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gios@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Giostream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Giostream@@UAEPAXI(a)Z
@ thiscall -arch=win32 ??_Gistream@@UAEPAXI(a)Z(ptr long) msvcirt.??_Gistream@@UAEPAXI(a)Z
@@ -457,8 +457,8 @@
@ cdecl -arch=win64 ?attach(a)filebuf@@QEAAPEAV1(a)H@Z(ptr long) msvcirt.?attach(a)filebuf@@QEAAPEAV1(a)H@Z
@ stub -arch=win32 ?attach(a)fstream@@QAEXH(a)Z
@ stub -arch=win64 ?attach(a)fstream@@QEAAXH(a)Z
-@ stub -arch=win32 ?attach(a)ifstream@@QAEXH(a)Z
-@ stub -arch=win64 ?attach(a)ifstream@@QEAAXH(a)Z
+@ thiscall -arch=win32 ?attach(a)ifstream@@QAEXH(a)Z(ptr long) msvcirt.?attach(a)ifstream@@QAEXH(a)Z
+@ cdecl -arch=win64 ?attach(a)ifstream@@QEAAXH(a)Z(ptr long) msvcirt.?attach(a)ifstream@@QEAAXH(a)Z
@ stub -arch=win32 ?attach(a)ofstream@@QAEXH(a)Z
@ stub -arch=win64 ?attach(a)ofstream@@QEAAXH(a)Z
@ thiscall -arch=win32 ?bad(a)ios@@QBEHXZ(ptr) msvcirt.?bad(a)ios@@QBEHXZ
@@ -481,8 +481,8 @@
@ cdecl -arch=win64 ?close(a)filebuf@@QEAAPEAV1(a)XZ(ptr) msvcirt.?close(a)filebuf@@QEAAPEAV1(a)XZ
@ stub -arch=win32 ?close(a)fstream@@QAEXXZ
@ stub -arch=win64 ?close(a)fstream@@QEAAXXZ
-@ stub -arch=win32 ?close(a)ifstream@@QAEXXZ
-@ stub -arch=win64 ?close(a)ifstream@@QEAAXXZ
+@ thiscall -arch=win32 ?close(a)ifstream@@QAEXXZ(ptr) msvcirt.?close(a)ifstream@@QAEXXZ
+@ cdecl -arch=win64 ?close(a)ifstream@@QEAAXXZ(ptr) msvcirt.?close(a)ifstream@@QEAAXXZ
@ stub -arch=win32 ?close(a)ofstream@@QAEXXZ
@ stub -arch=win64 ?close(a)ofstream@@QEAAXXZ
@ cdecl -arch=win32 ?clrlock(a)ios@@QAAXXZ(ptr) msvcirt.?clrlock(a)ios@@QAAXXZ
@@ -525,8 +525,8 @@
@ cdecl -arch=win64 ?fd(a)filebuf@@QEBAHXZ(ptr) msvcirt.?fd(a)filebuf@@QEBAHXZ
@ stub -arch=win32 ?fd(a)fstream@@QBEHXZ
@ stub -arch=win64 ?fd(a)fstream@@QEBAHXZ
-@ stub -arch=win32 ?fd(a)ifstream@@QBEHXZ
-@ stub -arch=win64 ?fd(a)ifstream@@QEBAHXZ
+@ thiscall -arch=win32 ?fd(a)ifstream@@QBEHXZ(ptr) msvcirt.?fd(a)ifstream@@QBEHXZ
+@ cdecl -arch=win64 ?fd(a)ifstream@@QEBAHXZ(ptr) msvcirt.?fd(a)ifstream@@QEBAHXZ
@ stub -arch=win32 ?fd(a)ofstream@@QBEHXZ
@ stub -arch=win64 ?fd(a)ofstream@@QEBAHXZ
@ thiscall -arch=win32 ?fill(a)ios@@QAEDD(a)Z(ptr long) msvcirt.?fill(a)ios@@QAEDD(a)Z
@@ -594,8 +594,8 @@
@ cdecl -arch=win64 ?is_open(a)filebuf@@QEBAHXZ(ptr) msvcirt.?is_open(a)filebuf@@QEBAHXZ
@ stub -arch=win32 ?is_open(a)fstream@@QBEHXZ
@ stub -arch=win64 ?is_open(a)fstream@@QEBAHXZ
-@ stub -arch=win32 ?is_open(a)ifstream@@QBEHXZ
-@ stub -arch=win64 ?is_open(a)ifstream@@QEBAHXZ
+@ thiscall -arch=win32 ?is_open(a)ifstream@@QBEHXZ(ptr) msvcirt.?is_open(a)ifstream@@QBEHXZ
+@ cdecl -arch=win64 ?is_open(a)ifstream@@QEBAHXZ(ptr) msvcirt.?is_open(a)ifstream@@QEBAHXZ
@ stub -arch=win32 ?is_open(a)ofstream@@QBEHXZ
@ stub -arch=win64 ?is_open(a)ofstream@@QEBAHXZ
@ thiscall -arch=win32 ?isfx(a)istream@@QAEXXZ(ptr) msvcirt.?isfx(a)istream@@QAEXXZ
@@ -621,8 +621,8 @@
@ cdecl -arch=win64 ?open(a)filebuf@@QEAAPEAV1(a)PEBDHH@Z(ptr str long long) msvcirt.?open(a)filebuf@@QEAAPEAV1(a)PEBDHH@Z
@ stub -arch=win32 ?open(a)fstream@@QAEXPBDHH(a)Z
@ stub -arch=win64 ?open(a)fstream@@QEAAXPEBDHH(a)Z
-@ stub -arch=win32 ?open(a)ifstream@@QAEXPBDHH(a)Z
-@ stub -arch=win64 ?open(a)ifstream@@QEAAXPEBDHH(a)Z
+@ thiscall -arch=win32 ?open(a)ifstream@@QAEXPBDHH(a)Z(ptr str long long) msvcirt.?open(a)ifstream@@QAEXPBDHH(a)Z
+@ cdecl -arch=win64 ?open(a)ifstream@@QEAAXPEBDHH(a)Z(ptr str long long) msvcirt.?open(a)ifstream@@QEAAXPEBDHH(a)Z
@ stub -arch=win32 ?open(a)ofstream@@QAEXPBDHH(a)Z
@ stub -arch=win64 ?open(a)ofstream@@QEAAXPEBDHH(a)Z
@ extern ?openprot(a)filebuf@@2HB msvcirt.?openprot(a)filebuf@@2HB
@@ -672,8 +672,8 @@
@ cdecl -arch=win64 ?raw_name(a)type_info@@QEBAPEBDXZ(ptr) msvcrt.?raw_name(a)type_info@@QEBAPEBDXZ
@ stub -arch=win32 ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ
@ stub -arch=win64 ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ
-@ stub -arch=win32 ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ
-@ stub -arch=win64 ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ
+@ thiscall -arch=win32 ?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)ifstream@@QBEPAVfilebuf@@XZ
+@ cdecl -arch=win64 ?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)ifstream@@QEBAPEAVfilebuf@@XZ
@ thiscall -arch=win32 ?rdbuf(a)ios@@QBEPAVstreambuf@@XZ(ptr) msvcirt.?rdbuf(a)ios@@QBEPAVstreambuf@@XZ
@ cdecl -arch=win64 ?rdbuf(a)ios@@QEBAPEAVstreambuf@@XZ(ptr) msvcirt.?rdbuf(a)ios@@QEBAPEAVstreambuf@@XZ
@ thiscall -arch=win32 ?rdbuf(a)istrstream@@QBEPAVstrstreambuf@@XZ(ptr) msvcirt.?rdbuf(a)istrstream@@QBEPAVstrstreambuf@@XZ
@@ -723,8 +723,8 @@
@ cdecl -arch=win64 ?setbuf(a)filebuf@@UEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)filebuf@@UEAAPEAVstreambuf@@PEADH(a)Z
@ stub -arch=win32 ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z
@ stub -arch=win64 ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z
-@ stub -arch=win32 ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z
-@ stub -arch=win64 ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z
+@ thiscall -arch=win32 ?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)ifstream@@QAEPAVstreambuf@@PADH(a)Z
+@ cdecl -arch=win64 ?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)ifstream@@QEAAPEAVstreambuf@@PEADH(a)Z
@ stub -arch=win32 ?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z
@ stub -arch=win64 ?setbuf(a)ofstream@@QEAAPEAVstreambuf@@PEADH(a)Z
@ thiscall -arch=win32 ?setbuf(a)streambuf@@UAEPAV1(a)PADH@Z(ptr ptr long) msvcirt.?setbuf(a)streambuf@@UAEPAV1(a)PADH@Z
@@ -745,8 +745,8 @@
@ cdecl -arch=win64 ?setmode(a)filebuf@@QEAAHH(a)Z(ptr long) msvcirt.?setmode(a)filebuf@@QEAAHH(a)Z
@ stub -arch=win32 ?setmode(a)fstream@@QAEHH(a)Z
@ stub -arch=win64 ?setmode(a)fstream@@QEAAHH(a)Z
-@ stub -arch=win32 ?setmode(a)ifstream@@QAEHH(a)Z
-@ stub -arch=win64 ?setmode(a)ifstream@@QEAAHH(a)Z
+@ thiscall -arch=win32 ?setmode(a)ifstream@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)ifstream@@QAEHH(a)Z
+@ cdecl -arch=win64 ?setmode(a)ifstream@@QEAAHH(a)Z(ptr long) msvcirt.?setmode(a)ifstream@@QEAAHH(a)Z
@ stub -arch=win32 ?setmode(a)ofstream@@QAEHH(a)Z
@ stub -arch=win64 ?setmode(a)ofstream@@QEAAHH(a)Z
@ thiscall -arch=win32 ?setp(a)streambuf@@IAEXPAD0(a)Z(ptr ptr ptr) msvcirt.?setp(a)streambuf@@IAEXPAD0(a)Z
--
2.28.0
4
4
Signed-off-by: Derek Lesho <dlesho(a)codeweavers.com>
---
dlls/mfplat/main.c | 207 +------------------------------------
dlls/mfplat/tests/mfplat.c | 106 +++++++++++--------
2 files changed, 64 insertions(+), 249 deletions(-)
diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c
index 6cd409d63b7..ea1b1770e15 100644
--- a/dlls/mfplat/main.c
+++ b/dlls/mfplat/main.c
@@ -5679,188 +5679,6 @@ HRESULT WINAPI MFGetPluginControl(IMFPluginControl **ret)
return S_OK;
}
-typedef struct _mfsource
-{
- IMFMediaSource IMFMediaSource_iface;
- LONG ref;
-} mfsource;
-
-static inline mfsource *impl_from_IMFMediaSource(IMFMediaSource *iface)
-{
- return CONTAINING_RECORD(iface, mfsource, IMFMediaSource_iface);
-}
-
-static HRESULT WINAPI mfsource_QueryInterface(IMFMediaSource *iface, REFIID riid, void **out)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), out);
-
- if (IsEqualIID(riid, &IID_IMFMediaSource) ||
- IsEqualIID(riid, &IID_IMFMediaEventGenerator) ||
- IsEqualIID(riid, &IID_IUnknown))
- {
- *out = &This->IMFMediaSource_iface;
- }
- else
- {
- FIXME("(%s, %p)\n", debugstr_guid(riid), out);
- *out = NULL;
- return E_NOINTERFACE;
- }
-
- IUnknown_AddRef((IUnknown*)*out);
- return S_OK;
-}
-
-static ULONG WINAPI mfsource_AddRef(IMFMediaSource *iface)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
- ULONG ref = InterlockedIncrement(&This->ref);
-
- TRACE("(%p) ref=%u\n", This, ref);
-
- return ref;
-}
-
-static ULONG WINAPI mfsource_Release(IMFMediaSource *iface)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
- ULONG ref = InterlockedDecrement(&This->ref);
-
- TRACE("(%p) ref=%u\n", This, ref);
-
- if (!ref)
- {
- HeapFree(GetProcessHeap(), 0, This);
- }
-
- return ref;
-}
-
-static HRESULT WINAPI mfsource_GetEvent(IMFMediaSource *iface, DWORD flags, IMFMediaEvent **event)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p)->(%#x, %p)\n", This, flags, event);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_BeginGetEvent(IMFMediaSource *iface, IMFAsyncCallback *callback, IUnknown *state)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p)->(%p, %p)\n", This, callback, state);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_EndGetEvent(IMFMediaSource *iface, IMFAsyncResult *result, IMFMediaEvent **event)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p)->(%p, %p)\n", This, result, event);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_QueueEvent(IMFMediaSource *iface, MediaEventType event_type, REFGUID ext_type,
- HRESULT hr, const PROPVARIANT *value)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p)->(%d, %s, %#x, %p)\n", This, event_type, debugstr_guid(ext_type), hr, value);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_GetCharacteristics(IMFMediaSource *iface, DWORD *characteristics)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p)->(%p): stub\n", This, characteristics);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_CreatePresentationDescriptor(IMFMediaSource *iface, IMFPresentationDescriptor **descriptor)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
- IMFStreamDescriptor *sd;
- IMFMediaType *mediatype;
- HRESULT hr;
-
- FIXME("(%p)->(%p): stub\n", This, descriptor);
-
- if (FAILED(hr = MFCreateMediaType(&mediatype)))
- return hr;
-
- hr = MFCreateStreamDescriptor(0, 1, &mediatype, &sd);
- IMFMediaType_Release(mediatype);
- if (FAILED(hr))
- return hr;
-
- hr = MFCreatePresentationDescriptor(1, &sd, descriptor);
- IMFStreamDescriptor_Release(sd);
-
- return hr;
-}
-
-static HRESULT WINAPI mfsource_Start(IMFMediaSource *iface, IMFPresentationDescriptor *descriptor,
- const GUID *time_format, const PROPVARIANT *start_position)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p)->(%p, %p, %p): stub\n", This, descriptor, time_format, start_position);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_Stop(IMFMediaSource *iface)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p): stub\n", This);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_Pause(IMFMediaSource *iface)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p): stub\n", This);
-
- return E_NOTIMPL;
-}
-
-static HRESULT WINAPI mfsource_Shutdown(IMFMediaSource *iface)
-{
- mfsource *This = impl_from_IMFMediaSource(iface);
-
- FIXME("(%p): stub\n", This);
-
- return S_OK;
-}
-
-static const IMFMediaSourceVtbl mfsourcevtbl =
-{
- mfsource_QueryInterface,
- mfsource_AddRef,
- mfsource_Release,
- mfsource_GetEvent,
- mfsource_BeginGetEvent,
- mfsource_EndGetEvent,
- mfsource_QueueEvent,
- mfsource_GetCharacteristics,
- mfsource_CreatePresentationDescriptor,
- mfsource_Start,
- mfsource_Stop,
- mfsource_Pause,
- mfsource_Shutdown,
-};
-
enum resolved_object_origin
{
OBJECT_FROM_BYTESTREAM,
@@ -6505,7 +6323,7 @@ static HRESULT WINAPI source_resolver_CreateObjectFromByteStream(IMFSourceResolv
return E_POINTER;
if (FAILED(hr = resolver_get_bytestream_handler(stream, url, flags, &handler)))
- goto fallback;
+ return MF_E_UNSUPPORTED_BYTESTREAM_TYPE;
hr = RtwqCreateAsyncResult((IUnknown *)handler, NULL, NULL, &result);
IMFByteStreamHandler_Release(handler);
@@ -6528,28 +6346,7 @@ static HRESULT WINAPI source_resolver_CreateObjectFromByteStream(IMFSourceResolv
hr = resolver_end_create_object(resolver, OBJECT_FROM_BYTESTREAM, result, obj_type, object);
IRtwqAsyncResult_Release(result);
- /* TODO: following stub is left intentionally until real source plugins are implemented. */
- if (SUCCEEDED(hr))
- return hr;
-
-fallback:
- if (flags & MF_RESOLUTION_MEDIASOURCE)
- {
- mfsource *new_object;
-
- new_object = HeapAlloc( GetProcessHeap(), 0, sizeof(*new_object) );
- if (!new_object)
- return E_OUTOFMEMORY;
-
- new_object->IMFMediaSource_iface.lpVtbl = &mfsourcevtbl;
- new_object->ref = 1;
-
- *object = (IUnknown *)&new_object->IMFMediaSource_iface;
- *obj_type = MF_OBJECT_MEDIASOURCE;
- return S_OK;
- }
-
- return E_NOTIMPL;
+ return hr;
}
static HRESULT WINAPI source_resolver_BeginCreateObjectFromURL(IMFSourceResolver *iface, const WCHAR *url,
diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c
index 01749dd9ef8..fa90f1e4bac 100644
--- a/dlls/mfplat/tests/mfplat.c
+++ b/dlls/mfplat/tests/mfplat.c
@@ -382,12 +382,16 @@ static HRESULT WINAPI test_create_from_file_handler_callback_Invoke(IMFAsyncCall
handler = (IMFSchemeHandler *)IMFAsyncResult_GetStateNoAddRef(result);
hr = IMFSchemeHandler_EndCreateObject(handler, result, &obj_type, &object);
+todo_wine
ok(hr == S_OK, "Failed to create an object, hr %#x.\n", hr);
- hr = IMFAsyncResult_GetObject(result, &object2);
- ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
+ if (SUCCEEDED(hr))
+ {
+ hr = IMFAsyncResult_GetObject(result, &object2);
+ ok(hr == E_POINTER, "Unexpected hr %#x.\n", hr);
- IUnknown_Release(object);
+ IUnknown_Release(object);
+ }
SetEvent(callback->event);
@@ -502,13 +506,43 @@ static void test_source_resolver(void)
hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_MEDIASOURCE, NULL,
&obj_type, (IUnknown **)&mediasource);
- todo_wine ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "got 0x%08x\n", hr);
+ ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "got 0x%08x\n", hr);
if (hr == S_OK) IMFMediaSource_Release(mediasource);
hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_BYTESTREAM, NULL,
&obj_type, (IUnknown **)&mediasource);
- todo_wine ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "got 0x%08x\n", hr);
+ ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "got 0x%08x\n", hr);
+
+ IMFByteStream_Release(stream);
+
+ /* Create from URL. */
+ callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
+
+ hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"nonexisting.mp4", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
+ (IUnknown **)&stream);
+ ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#x.\n", hr);
+
+ hr = IMFSourceResolver_CreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
+ (IUnknown **)&stream);
+ ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr);
+ IMFByteStream_Release(stream);
+
+ hr = IMFSourceResolver_BeginCreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL,
+ &cancel_cookie, &callback.IMFAsyncCallback_iface, (IUnknown *)resolver);
+ ok(hr == S_OK, "Create request failed, hr %#x.\n", hr);
+ ok(cancel_cookie != NULL, "Unexpected cancel object.\n");
+ IUnknown_Release(cancel_cookie);
+
+ if (SUCCEEDED(hr))
+ WaitForSingleObject(callback.event, INFINITE);
+
+ /* With explicit scheme. */
+ lstrcpyW(pathW, fileschemeW);
+ lstrcatW(pathW, filename);
+ hr = IMFSourceResolver_CreateObjectFromURL(resolver, pathW, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
+ (IUnknown **)&stream);
+ ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr);
IMFByteStream_Release(stream);
/* We have to create a new bytestream here, because all following
@@ -522,14 +556,31 @@ static void test_source_resolver(void)
ok(hr == S_OK, "Failed to set string value, hr %#x.\n", hr);
IMFAttributes_Release(attributes);
+ /* Start of gstreamer dependent tests */
+
hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, stream, NULL, MF_RESOLUTION_MEDIASOURCE, NULL,
&obj_type, (IUnknown **)&mediasource);
- ok(hr == S_OK, "got 0x%08x\n", hr);
+ if (strcmp(winetest_platform, "wine"))
+ ok(hr == S_OK, "got 0x%08x\n", hr);
+ if (FAILED(hr))
+ {
+ IMFByteStream_Release(stream);
+ IMFSourceResolver_Release(resolver);
+
+ hr = MFShutdown();
+ ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
+
+ DeleteFileW(filename);
+ return;
+ }
ok(mediasource != NULL, "got %p\n", mediasource);
ok(obj_type == MF_OBJECT_MEDIASOURCE, "got %d\n", obj_type);
hr = IMFMediaSource_CreatePresentationDescriptor(mediasource, &descriptor);
+todo_wine
ok(hr == S_OK, "Failed to get presentation descriptor, hr %#x.\n", hr);
+ if (FAILED(hr))
+ goto skip_source_tests;
ok(descriptor != NULL, "got %p\n", descriptor);
hr = IMFPresentationDescriptor_GetStreamDescriptorByIndex(descriptor, 0, &selected, &sd);
@@ -540,10 +591,7 @@ static void test_source_resolver(void)
IMFStreamDescriptor_Release(sd);
hr = IMFMediaTypeHandler_GetMajorType(handler, &guid);
-todo_wine
ok(hr == S_OK, "Failed to get stream major type, hr %#x.\n", hr);
- if (FAILED(hr))
- goto skip_source_tests;
/* Check major/minor type for the test media. */
ok(IsEqualGUID(&guid, &MFMediaType_Video), "Unexpected major type %s.\n", debugstr_guid(&guid));
@@ -624,6 +672,7 @@ todo_wine
get_event((IMFMediaEventGenerator *)mediasource, MEEndOfPresentation, NULL);
IMFMediaTypeHandler_Release(handler);
+ IMFPresentationDescriptor_Release(descriptor);
hr = IMFMediaSource_Shutdown(mediasource);
ok(hr == S_OK, "Unexpected hr %#x.\n", hr);
@@ -633,42 +682,9 @@ todo_wine
skip_source_tests:
- IMFPresentationDescriptor_Release(descriptor);
IMFMediaSource_Release(mediasource);
IMFByteStream_Release(stream);
- /* Create from URL. */
- callback.event = CreateEventA(NULL, FALSE, FALSE, NULL);
-
- hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"nonexisting.mp4", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
- (IUnknown **)&stream);
- ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#x.\n", hr);
-
- hr = IMFSourceResolver_CreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
- (IUnknown **)&stream);
- ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr);
- IMFByteStream_Release(stream);
-
- hr = IMFSourceResolver_BeginCreateObjectFromURL(resolver, filename, MF_RESOLUTION_BYTESTREAM, NULL,
- &cancel_cookie, &callback.IMFAsyncCallback_iface, (IUnknown *)resolver);
- ok(hr == S_OK, "Create request failed, hr %#x.\n", hr);
- ok(cancel_cookie != NULL, "Unexpected cancel object.\n");
- IUnknown_Release(cancel_cookie);
-
- if (SUCCEEDED(hr))
- WaitForSingleObject(callback.event, INFINITE);
-
- /* With explicit scheme. */
- lstrcpyW(pathW, fileschemeW);
- lstrcatW(pathW, filename);
-
- hr = IMFSourceResolver_CreateObjectFromURL(resolver, pathW, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type,
- (IUnknown **)&stream);
- ok(hr == S_OK, "Failed to resolve url, hr %#x.\n", hr);
- IMFByteStream_Release(stream);
-
- IMFSourceResolver_Release(resolver);
-
/* Create directly through scheme handler. */
hr = CoInitialize(NULL);
ok(SUCCEEDED(hr), "Failed to initialize, hr %#x.\n", hr);
@@ -693,12 +709,14 @@ skip_source_tests:
if (do_uninit)
CoUninitialize();
+ CloseHandle(callback.event);
+
+ IMFSourceResolver_Release(resolver);
+
hr = MFShutdown();
ok(hr == S_OK, "Failed to shut down, hr %#x.\n", hr);
DeleteFileW(filename);
-
- CloseHandle(callback.event);
}
static void init_functions(void)
--
2.28.0
4
21
[PATCH] ntdll/exception: Change return type to CONTEXT* of RtlLocateLegacyContext.
by Biswapriyo Nath 02 Sep '20
by Biswapriyo Nath 02 Sep '20
02 Sep '20
3
5
[PATCH 1/5] d3d11/tests: Test specifying the multisample mask via OMSetBlendState().
by Zebediah Figura 02 Sep '20
by Zebediah Figura 02 Sep '20
02 Sep '20
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
dlls/d3d11/tests/d3d11.c | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/dlls/d3d11/tests/d3d11.c b/dlls/d3d11/tests/d3d11.c
index e107d522b20..4704dad1aa3 100644
--- a/dlls/d3d11/tests/d3d11.c
+++ b/dlls/d3d11/tests/d3d11.c
@@ -29012,6 +29012,13 @@ static void test_sample_mask(void)
(ID3D11Resource *)texture, 0, texture_desc.Format);
check_texture_color(test_context.backbuffer, 0x7f7f7f7f, 1);
+ ID3D11DeviceContext_OMSetBlendState(context, NULL, NULL, 0xb);
+ ID3D11DeviceContext_ClearRenderTargetView(context, rtv, black);
+ draw_quad(&test_context);
+ ID3D11DeviceContext_ResolveSubresource(context, (ID3D11Resource *)test_context.backbuffer, 0,
+ (ID3D11Resource *)texture, 0, texture_desc.Format);
+ todo_wine check_texture_color(test_context.backbuffer, 0x3f3f3f3f, 1);
+
ID3D11RenderTargetView_Release(rtv);
ID3D11Texture2D_Release(texture);
ID3D11PixelShader_Release(ps);
--
2.28.0
3
11
02 Sep '20
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/advapi32/cred.c | 154 ++++++++++++++++++++++++-------------------
1 file changed, 88 insertions(+), 66 deletions(-)
diff --git a/dlls/advapi32/cred.c b/dlls/advapi32/cred.c
index 49a1c34d1cc..07f4b9b03a0 100644
--- a/dlls/advapi32/cred.c
+++ b/dlls/advapi32/cred.c
@@ -33,6 +33,9 @@
#include "winreg.h"
#include "wincred.h"
#include "winternl.h"
+#include "winioctl.h"
+#define WINE_MOUNTMGR_EXTENSIONS
+#include "ddk/mountmgr.h"
#include "crypt.h"
@@ -1389,6 +1392,86 @@ BOOL WINAPI CredReadA(LPCSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALA *
return TRUE;
}
+static DWORD host_read_credential( const WCHAR *targetname, CREDENTIALW **ret_credential )
+{
+ struct mountmgr_credential *cred_in, *cred_out = NULL, *tmp;
+ DWORD err = ERROR_OUTOFMEMORY, size_in, size_out, size_name = (strlenW( targetname ) + 1) * sizeof(WCHAR);
+ HANDLE mgr;
+ WCHAR *ptr;
+ BOOL ret;
+
+ mgr = CreateFileW( MOUNTMGR_DOS_DEVICE_NAME, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
+ OPEN_EXISTING, 0, 0 );
+ if (mgr == INVALID_HANDLE_VALUE) return GetLastError();
+
+ size_in = sizeof(*cred_in) + size_name;
+ if (!(cred_in = heap_alloc( size_in )))
+ {
+ CloseHandle( mgr );
+ return ERROR_OUTOFMEMORY;
+ }
+ cred_in->targetname_offset = sizeof(*cred_in);
+ cred_in->targetname_size = size_name;
+ ptr = (WCHAR *)(cred_in + 1);
+ strcpyW( ptr, targetname );
+
+ size_out = 256;
+ if (!(cred_out = heap_alloc( size_out ))) goto done;
+
+ for (;;)
+ {
+ ret = DeviceIoControl( mgr, IOCTL_MOUNTMGR_READ_CREDENTIAL, cred_in, size_in, cred_out, size_out, NULL, NULL );
+ if (ret || (err = GetLastError()) != ERROR_MORE_DATA) break;
+ size_out *= 2;
+ if (!(tmp = heap_realloc( cred_out, size_out ))) goto done;
+ cred_out = tmp;
+ }
+
+ if (ret)
+ {
+ CREDENTIALW *credential;
+ DWORD size = sizeof(*credential) + cred_out->targetname_size + cred_out->username_size + cred_out->comment_size +
+ cred_out->blob_size;
+
+ if (!(credential = heap_alloc_zero( size )))
+ {
+ err = ERROR_OUTOFMEMORY;
+ goto done;
+ }
+ ptr = (WCHAR *)(credential + 1);
+
+ credential->Type = CRED_TYPE_DOMAIN_PASSWORD;
+ memcpy( ptr, (char *)cred_out + cred_out->targetname_offset, cred_out->targetname_size );
+ credential->TargetName = ptr;
+ ptr += strlenW( ptr ) + 1;
+ if (cred_out->comment_size)
+ {
+ memcpy( ptr, (char *)cred_out + cred_out->comment_offset, cred_out->comment_size );
+ credential->Comment = ptr;
+ ptr += strlenW( ptr ) + 1;
+ }
+ credential->LastWritten = cred_out->last_written;
+ if ((credential->CredentialBlobSize = cred_out->blob_size))
+ {
+ memcpy( ptr, (char *)cred_out + cred_out->blob_offset, cred_out->blob_size );
+ credential->CredentialBlob = (BYTE *)ptr;
+ ptr += cred_out->blob_size / sizeof(WCHAR);
+ }
+ credential->Persist = CRED_PERSIST_LOCAL_MACHINE;
+ memcpy( ptr, (char *)cred_out + cred_out->username_offset, cred_out->username_size );
+ credential->UserName = ptr;
+
+ *ret_credential = credential;
+ err = ERROR_SUCCESS;
+ }
+
+done:
+ heap_free( cred_in );
+ heap_free( cred_out );
+ CloseHandle( mgr );
+ return err;
+}
+
/******************************************************************************
* CredReadW [ADVAPI32.@]
*/
@@ -1423,77 +1506,16 @@ BOOL WINAPI CredReadW(LPCWSTR TargetName, DWORD Type, DWORD Flags, PCREDENTIALW
return FALSE;
}
-#ifdef __APPLE__
if (Type == CRED_TYPE_DOMAIN_PASSWORD)
{
- int status;
- SecKeychainSearchRef search;
- status = SecKeychainSearchCreateFromAttributes(NULL, kSecGenericPasswordItemClass, NULL, &search);
- if (status == noErr)
+ ret = host_read_credential( TargetName, Credential );
+ if (ret != ERROR_SUCCESS && ret != ERROR_NOT_SUPPORTED)
{
- SecKeychainItemRef item;
- while (SecKeychainSearchCopyNext(search, &item) == noErr)
- {
- SecKeychainAttributeInfo info;
- SecKeychainAttributeList *attr_list;
- UInt32 info_tags[] = { kSecServiceItemAttr };
- LPWSTR target_name;
- INT str_len;
- info.count = ARRAY_SIZE(info_tags);
- info.tag = info_tags;
- info.format = NULL;
- status = SecKeychainItemCopyAttributesAndData(item, &info, NULL, &attr_list, NULL, NULL);
- len = sizeof(**Credential);
- if (status != noErr)
- {
- WARN("SecKeychainItemCopyAttributesAndData returned status %d\n", status);
- continue;
- }
- if (attr_list->count != 1 || attr_list->attr[0].tag != kSecServiceItemAttr)
- {
- CFRelease(item);
- continue;
- }
- str_len = MultiByteToWideChar(CP_UTF8, 0, attr_list->attr[0].data, attr_list->attr[0].length, NULL, 0);
- target_name = heap_alloc((str_len + 1) * sizeof(WCHAR));
- MultiByteToWideChar(CP_UTF8, 0, attr_list->attr[0].data, attr_list->attr[0].length, target_name, str_len);
- /* nul terminate */
- target_name[str_len] = '\0';
- if (strcmpiW(TargetName, target_name))
- {
- CFRelease(item);
- heap_free(target_name);
- continue;
- }
- heap_free(target_name);
- SecKeychainItemFreeAttributesAndData(attr_list, NULL);
- ret = mac_read_credential_from_item(item, TRUE, NULL, NULL, &len);
- if (ret == ERROR_SUCCESS)
- {
- *Credential = heap_alloc(len);
- if (*Credential)
- {
- len = sizeof(**Credential);
- ret = mac_read_credential_from_item(item, TRUE, *Credential,
- (char *)(*Credential + 1), &len);
- }
- else
- ret = ERROR_OUTOFMEMORY;
- CFRelease(item);
- CFRelease(search);
- if (ret != ERROR_SUCCESS)
- {
- SetLastError(ret);
- return FALSE;
- }
- return TRUE;
- }
- CFRelease(item);
- }
- CFRelease(search);
+ SetLastError(ret);
+ return FALSE;
}
+ if (ret == ERROR_SUCCESS) return TRUE;
}
-#endif
ret = open_cred_mgr_key(&hkeyMgr, FALSE);
if (ret != ERROR_SUCCESS)
--
2.20.1
1
0
02 Sep '20
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
---
dlls/mountmgr.sys/Makefile.in | 2 +-
dlls/mountmgr.sys/mountmgr.c | 246 ++++++++++++++++++++++++++++++++++
include/ddk/mountmgr.h | 16 +++
3 files changed, 263 insertions(+), 1 deletion(-)
diff --git a/dlls/mountmgr.sys/Makefile.in b/dlls/mountmgr.sys/Makefile.in
index e229164280f..83204e66504 100644
--- a/dlls/mountmgr.sys/Makefile.in
+++ b/dlls/mountmgr.sys/Makefile.in
@@ -3,7 +3,7 @@ IMPORTS = uuid advapi32 ntoskrnl
DELAYIMPORTS = user32 iphlpapi
EXTRADLLFLAGS = -Wl,--subsystem,native
EXTRAINCL = $(DBUS_CFLAGS) $(HAL_CFLAGS)
-EXTRALIBS = $(DISKARBITRATION_LIBS) $(SYSTEMCONFIGURATION_LIBS) $(CORESERVICES_LIBS)
+EXTRALIBS = $(DISKARBITRATION_LIBS) $(SYSTEMCONFIGURATION_LIBS) $(CORESERVICES_LIBS) $(SECURITY_LIBS)
C_SRCS = \
dbus.c \
diff --git a/dlls/mountmgr.sys/mountmgr.c b/dlls/mountmgr.sys/mountmgr.c
index 1961eab9836..d55ca643018 100644
--- a/dlls/mountmgr.sys/mountmgr.c
+++ b/dlls/mountmgr.sys/mountmgr.c
@@ -496,6 +496,241 @@ done:
irp->IoStatus.u.Status = status;
IoCompleteRequest( irp, IO_NO_INCREMENT );
}
+
+static inline BOOL check_credential_string( const void *buf, SIZE_T buflen, ULONG size, ULONG offset )
+{
+ const WCHAR *ptr = buf;
+ if (!size || size % sizeof(WCHAR) || offset + size > buflen || ptr[(offset + size) / sizeof(WCHAR) - 1]) return FALSE;
+ return TRUE;
+}
+
+static SecKeychainItemRef find_credential( const WCHAR *name )
+{
+ int status;
+ SecKeychainSearchRef search;
+ SecKeychainItemRef item;
+
+ status = SecKeychainSearchCreateFromAttributes( NULL, kSecGenericPasswordItemClass, NULL, &search );
+ if (status != noErr) return NULL;
+
+ while (SecKeychainSearchCopyNext( search, &item ) == noErr)
+ {
+ SecKeychainAttributeInfo info;
+ SecKeychainAttributeList *attr_list;
+ UInt32 info_tags[] = { kSecServiceItemAttr };
+ WCHAR *itemname;
+ int len;
+
+ info.count = ARRAY_SIZE(info_tags);
+ info.tag = info_tags;
+ info.format = NULL;
+ status = SecKeychainItemCopyAttributesAndData( item, &info, NULL, &attr_list, NULL, NULL );
+ if (status != noErr)
+ {
+ WARN( "SecKeychainItemCopyAttributesAndData returned status %d\n", status );
+ continue;
+ }
+ if (attr_list->count != 1 || attr_list->attr[0].tag != kSecServiceItemAttr)
+ {
+ CFRelease( item );
+ continue;
+ }
+ len = MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[0].data, attr_list->attr[0].length, NULL, 0 );
+ if (!(itemname = RtlAllocateHeap( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) )))
+ {
+ CFRelease( item );
+ CFRelease( search );
+ return NULL;
+ }
+ MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[0].data, attr_list->attr[0].length, itemname, len );
+ itemname[len] = 0;
+ if (strcmpiW( itemname, name ))
+ {
+ CFRelease( item );
+ RtlFreeHeap( GetProcessHeap(), 0, itemname );
+ continue;
+ }
+ RtlFreeHeap( GetProcessHeap(), 0, itemname );
+ SecKeychainItemFreeAttributesAndData( attr_list, NULL );
+ CFRelease( search );
+ return item;
+ }
+
+ CFRelease( search );
+ return NULL;
+}
+
+static NTSTATUS fill_credential( SecKeychainItemRef item, BOOL require_password, void *buf, SIZE_T data_offset,
+ SIZE_T buflen, SIZE_T *retlen )
+{
+ struct mountmgr_credential *cred = buf;
+ int status, len;
+ SIZE_T size;
+ UInt32 i, cred_blob_len = 0;
+ void *cred_blob;
+ WCHAR *ptr;
+ BOOL user_name_present = FALSE;
+ SecKeychainAttributeInfo info;
+ SecKeychainAttributeList *attr_list = NULL;
+ UInt32 info_tags[] = { kSecServiceItemAttr, kSecAccountItemAttr, kSecCommentItemAttr, kSecCreationDateItemAttr };
+
+ info.count = ARRAY_SIZE(info_tags);
+ info.tag = info_tags;
+ info.format = NULL;
+ status = SecKeychainItemCopyAttributesAndData( item, &info, NULL, &attr_list, &cred_blob_len, &cred_blob );
+ if (status == errSecAuthFailed && !require_password)
+ {
+ cred_blob_len = 0;
+ cred_blob = NULL;
+ status = SecKeychainItemCopyAttributesAndData( item, &info, NULL, &attr_list, &cred_blob_len, NULL );
+ }
+ if (status != noErr)
+ {
+ WARN( "SecKeychainItemCopyAttributesAndData returned status %d\n", status );
+ return STATUS_NOT_FOUND;
+ }
+ for (i = 0; i < attr_list->count; i++)
+ {
+ if (attr_list->attr[i].tag == kSecAccountItemAttr && attr_list->attr[i].data)
+ {
+ user_name_present = TRUE;
+ break;
+ }
+ }
+ if (!user_name_present)
+ {
+ WARN( "no kSecAccountItemAttr for item\n" );
+ SecKeychainItemFreeAttributesAndData( attr_list, cred_blob );
+ return STATUS_NOT_FOUND;
+ }
+
+ *retlen = sizeof(*cred);
+ for (i = 0; i < attr_list->count; i++)
+ {
+ switch (attr_list->attr[i].tag)
+ {
+ case kSecServiceItemAttr:
+ TRACE( "kSecServiceItemAttr: %.*s\n", (int)attr_list->attr[i].length, (char *)attr_list->attr[i].data );
+ if (cred) cred->targetname_offset = cred->targetname_size = 0;
+ if (!attr_list->attr[i].data) continue;
+
+ len = MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[i].data, attr_list->attr[i].length, NULL, 0 );
+ size = (len + 1) * sizeof(WCHAR);
+ if (cred && *retlen + size <= buflen)
+ {
+ cred->targetname_offset = data_offset;
+ cred->targetname_size = size;
+ ptr = (WCHAR *)((char *)cred + cred->targetname_offset);
+ MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[i].data, attr_list->attr[i].length, ptr, len );
+ ptr[len] = 0;
+ data_offset += size;
+ }
+ *retlen += size;
+ break;
+ case kSecAccountItemAttr:
+ {
+ TRACE( "kSecAccountItemAttr: %.*s\n", (int)attr_list->attr[i].length, (char *)attr_list->attr[i].data );
+ if (cred) cred->username_offset = cred->username_size = 0;
+ if (!attr_list->attr[i].data) continue;
+
+ len = MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[i].data, attr_list->attr[i].length, NULL, 0 );
+ size = (len + 1) * sizeof(WCHAR);
+ if (cred && *retlen + size <= buflen)
+ {
+ cred->username_offset = data_offset;
+ cred->username_size = size;
+ ptr = (WCHAR *)((char *)cred + cred->username_offset);
+ MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[i].data, attr_list->attr[i].length, ptr, len );
+ ptr[len] = 0;
+ data_offset += size;
+ }
+ *retlen += size;
+ break;
+ }
+ case kSecCommentItemAttr:
+ TRACE( "kSecCommentItemAttr: %.*s\n", (int)attr_list->attr[i].length, (char *)attr_list->attr[i].data );
+ if (cred) cred->comment_offset = cred->comment_size = 0;
+ if (!attr_list->attr[i].data) continue;
+
+ len = MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[i].data, attr_list->attr[i].length, NULL, 0 );
+ size = (len + 1) * sizeof(WCHAR);
+ if (cred && *retlen + size <= buflen)
+ {
+ cred->comment_offset = data_offset;
+ cred->comment_size = size;
+ ptr = (WCHAR *)((char *)cred + cred->comment_offset);
+ len = MultiByteToWideChar( CP_UTF8, 0, attr_list->attr[i].data, attr_list->attr[i].length, ptr, len );
+ ptr[len] = 0;
+ data_offset += size;
+ }
+ *retlen += size;
+ break;
+ case kSecCreationDateItemAttr:
+ {
+ LARGE_INTEGER wintime;
+ struct tm tm;
+ time_t time;
+
+ TRACE( "kSecCreationDateItemAttr: %.*s\n", (int)attr_list->attr[i].length, (char *)attr_list->attr[i].data );
+ if (cred) cred->last_written.dwLowDateTime = cred->last_written.dwHighDateTime = 0;
+ if (!attr_list->attr[i].data) continue;
+
+ if (cred)
+ {
+ memset( &tm, 0, sizeof(tm) );
+ strptime( attr_list->attr[i].data, "%Y%m%d%H%M%SZ", &tm );
+ time = mktime( &tm );
+ RtlSecondsSince1970ToTime( time, &wintime );
+ cred->last_written.dwLowDateTime = wintime.u.LowPart;
+ cred->last_written.dwHighDateTime = wintime.u.HighPart;
+ }
+ break;
+ }
+ default:
+ FIXME( "unhandled attribute %u\n", (unsigned)attr_list->attr[i].tag );
+ break;
+ }
+ }
+
+ if (cred)
+ {
+ if (*retlen + cred_blob_len <= buflen)
+ {
+ len = MultiByteToWideChar( CP_UTF8, 0, cred_blob, cred_blob_len, NULL, 0 );
+ cred->blob_offset = data_offset;
+ cred->blob_size = len * sizeof(WCHAR);
+ ptr = (WCHAR *)((char *)cred + cred->blob_offset);
+ MultiByteToWideChar( CP_UTF8, 0, cred_blob, cred_blob_len, ptr, len );
+ }
+ else cred->blob_offset = cred->blob_size = 0;
+ }
+ *retlen += cred_blob_len;
+
+ if (attr_list) SecKeychainItemFreeAttributesAndData( attr_list, cred_blob );
+ return STATUS_SUCCESS;
+}
+
+static NTSTATUS read_credential( void *buff, SIZE_T insize, SIZE_T outsize, IO_STATUS_BLOCK *iosb )
+{
+ struct mountmgr_credential *cred = buff;
+ const WCHAR *targetname;
+ SecKeychainItemRef item;
+ SIZE_T size;
+ NTSTATUS status;
+
+ if (!check_credential_string( buff, insize, cred->targetname_size, cred->targetname_offset ))
+ return STATUS_INVALID_PARAMETER;
+ targetname = (const WCHAR *)((const char *)cred + cred->targetname_offset);
+
+ if (!(item = find_credential( targetname ))) return STATUS_NOT_FOUND;
+
+ status = fill_credential( item, TRUE, cred, sizeof(*cred), outsize, &size );
+ CFRelease( item );
+ if (status != STATUS_SUCCESS) return status;
+
+ iosb->Information = size;
+ return (size > outsize) ? STATUS_BUFFER_OVERFLOW : STATUS_SUCCESS;
+}
#endif /* __APPLE__ */
/* handler for ioctls on the mount manager device */
@@ -564,6 +799,17 @@ static NTSTATUS WINAPI mountmgr_ioctl( DEVICE_OBJECT *device, IRP *irp )
if (TrySubmitThreadpoolCallback( query_symbol_file, irp, NULL )) return STATUS_PENDING;
irp->IoStatus.u.Status = STATUS_NO_MEMORY;
break;
+ case IOCTL_MOUNTMGR_READ_CREDENTIAL:
+ if (irpsp->Parameters.DeviceIoControl.InputBufferLength < sizeof(struct mountmgr_credential))
+ {
+ irp->IoStatus.u.Status = STATUS_INVALID_PARAMETER;
+ break;
+ }
+ irp->IoStatus.u.Status = read_credential( irp->AssociatedIrp.SystemBuffer,
+ irpsp->Parameters.DeviceIoControl.InputBufferLength,
+ irpsp->Parameters.DeviceIoControl.OutputBufferLength,
+ &irp->IoStatus );
+ break;
#endif
default:
FIXME( "ioctl %x not supported\n", irpsp->Parameters.DeviceIoControl.IoControlCode );
diff --git a/include/ddk/mountmgr.h b/include/ddk/mountmgr.h
index 13829a53954..c3d94078197 100644
--- a/include/ddk/mountmgr.h
+++ b/include/ddk/mountmgr.h
@@ -74,6 +74,22 @@ struct mountmgr_unix_drive
USHORT label_offset;
};
+#define IOCTL_MOUNTMGR_READ_CREDENTIAL CTL_CODE(MOUNTMGRCONTROLTYPE, 48, METHOD_BUFFERED, FILE_READ_ACCESS)
+
+struct mountmgr_credential
+{
+ ULONG targetname_offset;
+ ULONG targetname_size;
+ ULONG username_offset;
+ ULONG username_size;
+ ULONG comment_offset;
+ ULONG comment_size;
+ ULONG blob_offset;
+ ULONG blob_size;
+ BOOL blob_preserve;
+ FILETIME last_written;
+};
+
#define IOCTL_MOUNTMGR_QUERY_DHCP_REQUEST_PARAMS CTL_CODE(MOUNTMGRCONTROLTYPE, 64, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
struct mountmgr_dhcp_request_param
--
2.20.1
1
0
02 Sep '20
This is built on Doxygen. I'm not personally attached to Doxygen, but it was
easy enough to set up and write for, and I've found its compiled HTML to be
reasonably legible.
Note that Doxygen does allow for specifying documentation in external files,
if keeping the documentation out of the header is desired.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
v4: actually fix build system integration right, and test it first...
.gitignore | 2 +
Doxyfile.in | 17 ++
Makefile.am | 6 +
configure.ac | 5 +
include/vkd3d_types.h | 18 +-
m4/ax_prog_doxygen.m4 | 586 ++++++++++++++++++++++++++++++++++++++++++
6 files changed, 633 insertions(+), 1 deletion(-)
create mode 100644 Doxyfile.in
create mode 100644 m4/ax_prog_doxygen.m4
diff --git a/.gitignore b/.gitignore
index 72037ddb..51cba319 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@ autom4te.cache
config.log
config.status
configure
+doc
+Doxyfile
libtool
Makefile
Makefile.in
diff --git a/Doxyfile.in b/Doxyfile.in
new file mode 100644
index 00000000..a20e6f02
--- /dev/null
+++ b/Doxyfile.in
@@ -0,0 +1,17 @@
+# Doxyfile 1.8.18
+
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = @PACKAGE_NAME@
+PROJECT_NUMBER = @PACKAGE_VERSION@
+PROJECT_BRIEF = "The vkd3d 3D Graphics Library"
+OUTPUT_DIRECTORY = doc
+JAVADOC_AUTOBRIEF = YES
+OPTIMIZE_OUTPUT_FOR_C = YES
+EXTRACT_STATIC = YES
+
+INPUT = @srcdir@/include/vkd3d.h \
+ @srcdir@/include/vkd3d_shader.h \
+ @srcdir@/include/vkd3d_types.h \
+ @srcdir@/include/vkd3d_utils.h
+
+EXCLUDE_SYMBOLS = VKD3D_FORCE_32_BIT_ENUM
diff --git a/Makefile.am b/Makefile.am
index 58b3174c..dd624856 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -282,3 +282,9 @@ endif
.PHONY: crosstest crosstest32 crosstest64
crosstest: crosstest32 crosstest64
+
+if BUILD_DOC
+(a)DX_RULES@
+all: doxygen-doc
+CLEANFILES += $(DX_CLEANFILES)
+endif
diff --git a/configure.ac b/configure.ac
index ca9d7600..d5f6588f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -29,6 +29,10 @@ AC_PROG_MKDIR_P
VKD3D_PROG_WIDL(3, 20)
AS_IF([test "x$WIDL" = "xno"], [AC_MSG_WARN([widl is required to build header files.])])
+DX_PS_FEATURE([OFF])
+DX_INIT_DOXYGEN([vkd3d], [Doxyfile], [doc])
+AC_CONFIG_FILES([Doxyfile])
+
AM_INIT_AUTOMAKE([1.11 foreign silent-rules subdir-objects no-dist-gzip dist-xz -Wall -Werror])
AM_MAINTAINER_MODE([enable])
AM_SILENT_RULES([yes])
@@ -129,6 +133,7 @@ dnl Makefiles
AS_IF([test "x$enable_demos" = "xyes" -a "x$HAVE_XCB" != "xyes"],
[AC_MSG_ERROR([libxcb is required for demos.])])
AM_CONDITIONAL([BUILD_DEMOS], [test "x$enable_demos" = "xyes"])
+AM_CONDITIONAL([BUILD_DOC], [test $DX_FLAG_doc = 1])
AM_CONDITIONAL([BUILD_TESTS], [test "x$enable_tests" != "xno"])
AM_CONDITIONAL([HAVE_WIDL], [test "x$WIDL" != "xno"])
AM_CONDITIONAL([HAVE_CROSSTARGET32], [test "x$CROSSTARGET32" != "xno"])
diff --git a/include/vkd3d_types.h b/include/vkd3d_types.h
index 34c66748..020eb240 100644
--- a/include/vkd3d_types.h
+++ b/include/vkd3d_types.h
@@ -23,15 +23,31 @@
extern "C" {
#endif /* __cplusplus */
+/**
+ * \file vkd3d_types.h
+ *
+ * This file contains definitions for basic types used by vkd3d libraries.
+ */
+
#define VKD3D_FORCE_32_BIT_ENUM(name) name##_FORCE_32BIT = 0x7fffffff
+/**
+ * Result codes returned by some vkd3d functions. Error codes always have
+ * negative values; non-error codes never do.
+ */
enum vkd3d_result
{
+ /** Success. */
VKD3D_OK = 0,
- VKD3D_ERROR = -1, /* unspecified failure */
+ /** An unspecified failure occurred. */
+ VKD3D_ERROR = -1,
+ /** There are not enough resources available to complete the operation. */
VKD3D_ERROR_OUT_OF_MEMORY = -2,
+ /** One or more parameters passed to a vkd3d function were invalid. */
VKD3D_ERROR_INVALID_ARGUMENT = -3,
+ /** A shader passed to a vkd3d function was invalid. */
VKD3D_ERROR_INVALID_SHADER = -4,
+ /** The operation is not implemented in this version of vkd3d. */
VKD3D_ERROR_NOT_IMPLEMENTED = -5,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_RESULT),
diff --git a/m4/ax_prog_doxygen.m4 b/m4/ax_prog_doxygen.m4
new file mode 100644
index 00000000..ed1dc83b
--- /dev/null
+++ b/m4/ax_prog_doxygen.m4
@@ -0,0 +1,586 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_prog_doxygen.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# DX_INIT_DOXYGEN(PROJECT-NAME, [DOXYFILE-PATH], [OUTPUT-DIR], ...)
+# DX_DOXYGEN_FEATURE(ON|OFF)
+# DX_DOT_FEATURE(ON|OFF)
+# DX_HTML_FEATURE(ON|OFF)
+# DX_CHM_FEATURE(ON|OFF)
+# DX_CHI_FEATURE(ON|OFF)
+# DX_MAN_FEATURE(ON|OFF)
+# DX_RTF_FEATURE(ON|OFF)
+# DX_XML_FEATURE(ON|OFF)
+# DX_PDF_FEATURE(ON|OFF)
+# DX_PS_FEATURE(ON|OFF)
+#
+# DESCRIPTION
+#
+# The DX_*_FEATURE macros control the default setting for the given
+# Doxygen feature. Supported features are 'DOXYGEN' itself, 'DOT' for
+# generating graphics, 'HTML' for plain HTML, 'CHM' for compressed HTML
+# help (for MS users), 'CHI' for generating a separate .chi file by the
+# .chm file, and 'MAN', 'RTF', 'XML', 'PDF' and 'PS' for the appropriate
+# output formats. The environment variable DOXYGEN_PAPER_SIZE may be
+# specified to override the default 'a4wide' paper size.
+#
+# By default, HTML, PDF and PS documentation is generated as this seems to
+# be the most popular and portable combination. MAN pages created by
+# Doxygen are usually problematic, though by picking an appropriate subset
+# and doing some massaging they might be better than nothing. CHM and RTF
+# are specific for MS (note that you can't generate both HTML and CHM at
+# the same time). The XML is rather useless unless you apply specialized
+# post-processing to it.
+#
+# The macros mainly control the default state of the feature. The use can
+# override the default by specifying --enable or --disable. The macros
+# ensure that contradictory flags are not given (e.g.,
+# --enable-doxygen-html and --enable-doxygen-chm,
+# --enable-doxygen-anything with --disable-doxygen, etc.) Finally, each
+# feature will be automatically disabled (with a warning) if the required
+# programs are missing.
+#
+# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN
+# with the following parameters: a one-word name for the project for use
+# as a filename base etc., an optional configuration file name (the
+# default is '$(srcdir)/Doxyfile', the same as Doxygen's default), and an
+# optional output directory name (the default is 'doxygen-doc'). To run
+# doxygen multiple times for different configuration files and output
+# directories provide more parameters: the second, forth, sixth, etc
+# parameter are configuration file names and the third, fifth, seventh,
+# etc parameter are output directories. No checking is done to catch
+# duplicates.
+#
+# Automake Support
+#
+# The DX_RULES substitution can be used to add all needed rules to the
+# Makefile. Note that this is a substitution without being a variable:
+# only the @DX_RULES@ syntax will work.
+#
+# The provided targets are:
+#
+# doxygen-doc: Generate all doxygen documentation.
+#
+# doxygen-run: Run doxygen, which will generate some of the
+# documentation (HTML, CHM, CHI, MAN, RTF, XML)
+# but will not do the post processing required
+# for the rest of it (PS, PDF).
+#
+# doxygen-ps: Generate doxygen PostScript documentation.
+#
+# doxygen-pdf: Generate doxygen PDF documentation.
+#
+# Note that by default these are not integrated into the automake targets.
+# If doxygen is used to generate man pages, you can achieve this
+# integration by setting man3_MANS to the list of man pages generated and
+# then adding the dependency:
+#
+# $(man3_MANS): doxygen-doc
+#
+# This will cause make to run doxygen and generate all the documentation.
+#
+# The following variable is intended for use in Makefile.am:
+#
+# DX_CLEANFILES = everything to clean.
+#
+# Then add this variable to MOSTLYCLEANFILES.
+#
+# LICENSE
+#
+# Copyright (c) 2009 Oren Ben-Kiki <oren(a)ben-kiki.org>
+# Copyright (c) 2015 Olaf Mandel <olaf(a)mandel.name>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 24
+
+## ----------##
+## Defaults. ##
+## ----------##
+
+DX_ENV=""
+AC_DEFUN([DX_FEATURE_doc], ON)
+AC_DEFUN([DX_FEATURE_dot], OFF)
+AC_DEFUN([DX_FEATURE_man], OFF)
+AC_DEFUN([DX_FEATURE_html], ON)
+AC_DEFUN([DX_FEATURE_chm], OFF)
+AC_DEFUN([DX_FEATURE_chi], OFF)
+AC_DEFUN([DX_FEATURE_rtf], OFF)
+AC_DEFUN([DX_FEATURE_xml], OFF)
+AC_DEFUN([DX_FEATURE_pdf], ON)
+AC_DEFUN([DX_FEATURE_ps], ON)
+
+## --------------- ##
+## Private macros. ##
+## --------------- ##
+
+# DX_ENV_APPEND(VARIABLE, VALUE)
+# ------------------------------
+# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen and add it
+# as a substitution (but not a Makefile variable). The substitution
+# is skipped if the variable name is VERSION.
+AC_DEFUN([DX_ENV_APPEND],
+[AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])dnl
+m4_if([$1], [VERSION], [], [AC_SUBST([$1], [$2])dnl
+AM_SUBST_NOTMAKE([$1])])dnl
+])
+
+# DX_DIRNAME_EXPR
+# ---------------
+# Expand into a shell expression prints the directory part of a path.
+AC_DEFUN([DX_DIRNAME_EXPR],
+ [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']])
+
+# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF)
+# -------------------------------------
+# Expands according to the M4 (static) status of the feature.
+AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])])
+
+# DX_REQUIRE_PROG(VARIABLE, PROGRAM)
+# ----------------------------------
+# Require the specified program to be found for the DX_CURRENT_FEATURE to work.
+AC_DEFUN([DX_REQUIRE_PROG], [
+AC_PATH_TOOL([$1], [$2])
+if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then
+ AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
+ AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
+fi
+])
+
+# DX_TEST_FEATURE(FEATURE)
+# ------------------------
+# Expand to a shell expression testing whether the feature is active.
+AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1])
+
+# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE)
+# -------------------------------------------------
+# Verify that a required features has the right state before trying to turn on
+# the DX_CURRENT_FEATURE.
+AC_DEFUN([DX_CHECK_DEPEND], [
+test "$DX_FLAG_$1" = "$2" \
+|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1,
+ requires, contradicts) doxygen-$1])
+])
+
+# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE)
+# ----------------------------------------------------------
+# Turn off the DX_CURRENT_FEATURE if the required feature is off.
+AC_DEFUN([DX_CLEAR_DEPEND], [
+test "$DX_FLAG_$1" = "$2" || AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
+])
+
+# DX_FEATURE_ARG(FEATURE, DESCRIPTION,
+# CHECK_DEPEND, CLEAR_DEPEND,
+# REQUIRE, DO-IF-ON, DO-IF-OFF)
+# --------------------------------------------
+# Parse the command-line option controlling a feature. CHECK_DEPEND is called
+# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND),
+# otherwise CLEAR_DEPEND is called to turn off the default state if a required
+# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional
+# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and
+# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature.
+AC_DEFUN([DX_ARG_ABLE], [
+ AC_DEFUN([DX_CURRENT_FEATURE], [$1])
+ AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2])
+ AC_ARG_ENABLE(doxygen-$1,
+ [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1],
+ [--enable-doxygen-$1]),
+ DX_IF_FEATURE([$1], [don't $2], [$2]))],
+ [
+case "$enableval" in
+#(
+y|Y|yes|Yes|YES)
+ AC_SUBST([DX_FLAG_$1], 1)
+ $3
+;; #(
+n|N|no|No|NO)
+ AC_SUBST([DX_FLAG_$1], 0)
+;; #(
+*)
+ AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1])
+;;
+esac
+], [
+AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)])
+$4
+])
+if DX_TEST_FEATURE([$1]); then
+ $5
+ :
+fi
+if DX_TEST_FEATURE([$1]); then
+ $6
+ :
+else
+ $7
+ :
+fi
+])
+
+## -------------- ##
+## Public macros. ##
+## -------------- ##
+
+# DX_XXX_FEATURE(DEFAULT_STATE)
+# -----------------------------
+AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])])
+AC_DEFUN([DX_DOT_FEATURE], [AC_DEFUN([DX_FEATURE_dot], [$1])])
+AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])])
+AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])])
+AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])])
+AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])])
+AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])])
+AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
+AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
+AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])])
+AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])])
+
+# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR], ...)
+# --------------------------------------------------------------
+# PROJECT also serves as the base name for the documentation files.
+# The default CONFIG-FILE is "$(srcdir)/Doxyfile" and OUTPUT-DOC-DIR is
+# "doxygen-doc".
+# More arguments are interpreted as interleaved CONFIG-FILE and
+# OUTPUT-DOC-DIR values.
+AC_DEFUN([DX_INIT_DOXYGEN], [
+
+# Files:
+AC_SUBST([DX_PROJECT], [$1])
+AC_SUBST([DX_CONFIG], ['ifelse([$2], [], [$(srcdir)/Doxyfile], [$2])'])
+AC_SUBST([DX_DOCDIR], ['ifelse([$3], [], [doxygen-doc], [$3])'])
+m4_if(m4_eval(3 < m4_count($@)), 1, [m4_for([DX_i], 4, m4_count($@), 2,
+ [AC_SUBST([DX_CONFIG]m4_eval(DX_i[/2]),
+ 'm4_default_nblank_quoted(m4_argn(DX_i, $@),
+ [$(srcdir)/Doxyfile])')])])dnl
+m4_if(m4_eval(3 < m4_count($@)), 1, [m4_for([DX_i], 5, m4_count($@,), 2,
+ [AC_SUBST([DX_DOCDIR]m4_eval([(]DX_i[-1)/2]),
+ 'm4_default_nblank_quoted(m4_argn(DX_i, $@),
+ [doxygen-doc])')])])dnl
+m4_define([DX_loop], m4_dquote(m4_if(m4_eval(3 < m4_count($@)), 1,
+ [m4_for([DX_i], 4, m4_count($@), 2, [, m4_eval(DX_i[/2])])],
+ [])))dnl
+
+# Environment variables used inside doxygen.cfg:
+DX_ENV_APPEND(SRCDIR, $srcdir)
+DX_ENV_APPEND(PROJECT, $DX_PROJECT)
+DX_ENV_APPEND(VERSION, $PACKAGE_VERSION)
+
+# Doxygen itself:
+DX_ARG_ABLE(doc, [generate any doxygen documentation],
+ [],
+ [],
+ [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen)
+ DX_REQUIRE_PROG([DX_PERL], perl)],
+ [DX_ENV_APPEND(PERL_PATH, $DX_PERL)])
+
+# Dot for graphics:
+DX_ARG_ABLE(dot, [generate graphics for doxygen documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_DOT], dot)],
+ [DX_ENV_APPEND(HAVE_DOT, YES)
+ DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])],
+ [DX_ENV_APPEND(HAVE_DOT, NO)])
+
+# Man pages generation:
+DX_ARG_ABLE(man, [generate doxygen manual pages],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_MAN, YES)],
+ [DX_ENV_APPEND(GENERATE_MAN, NO)])
+
+# RTF file generation:
+DX_ARG_ABLE(rtf, [generate doxygen RTF documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_RTF, YES)],
+ [DX_ENV_APPEND(GENERATE_RTF, NO)])
+
+# XML file generation:
+DX_ARG_ABLE(xml, [generate doxygen XML documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_XML, YES)],
+ [DX_ENV_APPEND(GENERATE_XML, NO)])
+
+# (Compressed) HTML help generation:
+DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_HHC], hhc)],
+ [DX_ENV_APPEND(HHC_PATH, $DX_HHC)
+ DX_ENV_APPEND(GENERATE_HTML, YES)
+ DX_ENV_APPEND(GENERATE_HTMLHELP, YES)],
+ [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)])
+
+# Separate CHI file generation.
+DX_ARG_ABLE(chi, [generate doxygen separate compressed HTML help index file],
+ [DX_CHECK_DEPEND(chm, 1)],
+ [DX_CLEAR_DEPEND(chm, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_CHI, YES)],
+ [DX_ENV_APPEND(GENERATE_CHI, NO)])
+
+# Plain HTML pages generation:
+DX_ARG_ABLE(html, [generate doxygen plain HTML documentation],
+ [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)],
+ [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)],
+ [],
+ [DX_ENV_APPEND(GENERATE_HTML, YES)],
+ [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)])
+
+# PostScript file generation:
+DX_ARG_ABLE(ps, [generate doxygen PostScript documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_LATEX], latex)
+ DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
+ DX_REQUIRE_PROG([DX_DVIPS], dvips)
+ DX_REQUIRE_PROG([DX_EGREP], egrep)])
+
+# PDF file generation:
+DX_ARG_ABLE(pdf, [generate doxygen PDF documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex)
+ DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
+ DX_REQUIRE_PROG([DX_EGREP], egrep)])
+
+# LaTeX generation for PS and/or PDF:
+if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then
+ DX_ENV_APPEND(GENERATE_LATEX, YES)
+else
+ DX_ENV_APPEND(GENERATE_LATEX, NO)
+fi
+
+# Paper size for PS and/or PDF:
+AC_ARG_VAR(DOXYGEN_PAPER_SIZE,
+ [a4wide (default), a4, letter, legal or executive])
+case "$DOXYGEN_PAPER_SIZE" in
+#(
+"")
+ AC_SUBST(DOXYGEN_PAPER_SIZE, "")
+;; #(
+a4wide|a4|letter|legal|executive)
+ DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE)
+;; #(
+*)
+ AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'])
+;;
+esac
+
+# Rules:
+AS_IF([[test $DX_FLAG_html -eq 1]],
+[[DX_SNIPPET_html="## ------------------------------- ##
+## Rules specific for HTML output. ##
+## ------------------------------- ##
+
+DX_CLEAN_HTML = \$(DX_DOCDIR)/html]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/html]])[
+
+"]],
+[[DX_SNIPPET_html=""]])
+AS_IF([[test $DX_FLAG_chi -eq 1]],
+[[DX_SNIPPET_chi="
+DX_CLEAN_CHI = \$(DX_DOCDIR)/\$(PACKAGE).chi]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).chi]])["]],
+[[DX_SNIPPET_chi=""]])
+AS_IF([[test $DX_FLAG_chm -eq 1]],
+[[DX_SNIPPET_chm="## ------------------------------ ##
+## Rules specific for CHM output. ##
+## ------------------------------ ##
+
+DX_CLEAN_CHM = \$(DX_DOCDIR)/chm]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/chm]])[\
+${DX_SNIPPET_chi}
+
+"]],
+[[DX_SNIPPET_chm=""]])
+AS_IF([[test $DX_FLAG_man -eq 1]],
+[[DX_SNIPPET_man="## ------------------------------ ##
+## Rules specific for MAN output. ##
+## ------------------------------ ##
+
+DX_CLEAN_MAN = \$(DX_DOCDIR)/man]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/man]])[
+
+"]],
+[[DX_SNIPPET_man=""]])
+AS_IF([[test $DX_FLAG_rtf -eq 1]],
+[[DX_SNIPPET_rtf="## ------------------------------ ##
+## Rules specific for RTF output. ##
+## ------------------------------ ##
+
+DX_CLEAN_RTF = \$(DX_DOCDIR)/rtf]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/rtf]])[
+
+"]],
+[[DX_SNIPPET_rtf=""]])
+AS_IF([[test $DX_FLAG_xml -eq 1]],
+[[DX_SNIPPET_xml="## ------------------------------ ##
+## Rules specific for XML output. ##
+## ------------------------------ ##
+
+DX_CLEAN_XML = \$(DX_DOCDIR)/xml]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/xml]])[
+
+"]],
+[[DX_SNIPPET_xml=""]])
+AS_IF([[test $DX_FLAG_ps -eq 1]],
+[[DX_SNIPPET_ps="## ----------------------------- ##
+## Rules specific for PS output. ##
+## ----------------------------- ##
+
+DX_CLEAN_PS = \$(DX_DOCDIR)/\$(PACKAGE).ps]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).ps]])[
+
+DX_PS_GOAL = doxygen-ps
+
+doxygen-ps: \$(DX_CLEAN_PS)
+
+]m4_foreach([DX_i], [DX_loop],
+[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).ps: \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag
+ \$(DX_V_LATEX)cd \$(DX_DOCDIR]DX_i[)/latex; \\
+ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \\
+ \$(DX_LATEX) refman.tex; \\
+ \$(DX_MAKEINDEX) refman.idx; \\
+ \$(DX_LATEX) refman.tex; \\
+ countdown=5; \\
+ while \$(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \\
+ refman.log > /dev/null 2>&1 \\
+ && test \$\$countdown -gt 0; do \\
+ \$(DX_LATEX) refman.tex; \\
+ countdown=\`expr \$\$countdown - 1\`; \\
+ done; \\
+ \$(DX_DVIPS) -o ../\$(PACKAGE).ps refman.dvi
+
+]])["]],
+[[DX_SNIPPET_ps=""]])
+AS_IF([[test $DX_FLAG_pdf -eq 1]],
+[[DX_SNIPPET_pdf="## ------------------------------ ##
+## Rules specific for PDF output. ##
+## ------------------------------ ##
+
+DX_CLEAN_PDF = \$(DX_DOCDIR)/\$(PACKAGE).pdf]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).pdf]])[
+
+DX_PDF_GOAL = doxygen-pdf
+
+doxygen-pdf: \$(DX_CLEAN_PDF)
+
+]m4_foreach([DX_i], [DX_loop],
+[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).pdf: \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag
+ \$(DX_V_LATEX)cd \$(DX_DOCDIR]DX_i[)/latex; \\
+ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \\
+ \$(DX_PDFLATEX) refman.tex; \\
+ \$(DX_MAKEINDEX) refman.idx; \\
+ \$(DX_PDFLATEX) refman.tex; \\
+ countdown=5; \\
+ while \$(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \\
+ refman.log > /dev/null 2>&1 \\
+ && test \$\$countdown -gt 0; do \\
+ \$(DX_PDFLATEX) refman.tex; \\
+ countdown=\`expr \$\$countdown - 1\`; \\
+ done; \\
+ mv refman.pdf ../\$(PACKAGE).pdf
+
+]])["]],
+[[DX_SNIPPET_pdf=""]])
+AS_IF([[test $DX_FLAG_ps -eq 1 -o $DX_FLAG_pdf -eq 1]],
+[[DX_SNIPPET_latex="## ------------------------------------------------- ##
+## Rules specific for LaTeX (shared for PS and PDF). ##
+## ------------------------------------------------- ##
+
+DX_V_LATEX = \$(_DX_v_LATEX_\$(V))
+_DX_v_LATEX_ = \$(_DX_v_LATEX_\$(AM_DEFAULT_VERBOSITY))
+_DX_v_LATEX_0 = @echo \" LATEX \" \$][@;
+
+DX_CLEAN_LATEX = \$(DX_DOCDIR)/latex]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/latex]])[
+
+"]],
+[[DX_SNIPPET_latex=""]])
+
+AS_IF([[test $DX_FLAG_doc -eq 1]],
+[[DX_SNIPPET_doc="## --------------------------------- ##
+## Format-independent Doxygen rules. ##
+## --------------------------------- ##
+
+${DX_SNIPPET_html}\
+${DX_SNIPPET_chm}\
+${DX_SNIPPET_man}\
+${DX_SNIPPET_rtf}\
+${DX_SNIPPET_xml}\
+${DX_SNIPPET_ps}\
+${DX_SNIPPET_pdf}\
+${DX_SNIPPET_latex}\
+DX_V_DXGEN = \$(_DX_v_DXGEN_\$(V))
+_DX_v_DXGEN_ = \$(_DX_v_DXGEN_\$(AM_DEFAULT_VERBOSITY))
+_DX_v_DXGEN_0 = @echo \" DXGEN \" \$<;
+
+.PHONY: doxygen-run doxygen-doc \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
+
+.INTERMEDIATE: doxygen-run \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
+
+doxygen-run:]m4_foreach([DX_i], [DX_loop],
+ [[ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag]])[
+
+doxygen-doc: doxygen-run \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
+
+]m4_foreach([DX_i], [DX_loop],
+[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag: \$(DX_CONFIG]DX_i[) \$(pkginclude_HEADERS)
+ \$(A""M_V_at)rm -rf \$(DX_DOCDIR]DX_i[)
+ \$(DX_V_DXGEN)\$(DX_ENV) DOCDIR=\$(DX_DOCDIR]DX_i[) \$(DX_DOXYGEN) \$(DX_CONFIG]DX_i[)
+ \$(A""M_V_at)echo Timestamp >\$][@
+
+]])dnl
+[DX_CLEANFILES = \\]
+m4_foreach([DX_i], [DX_loop],
+[[ \$(DX_DOCDIR]DX_i[)/doxygen_sqlite3.db \\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag \\
+]])dnl
+[ -r \\
+ \$(DX_CLEAN_HTML) \\
+ \$(DX_CLEAN_CHM) \\
+ \$(DX_CLEAN_CHI) \\
+ \$(DX_CLEAN_MAN) \\
+ \$(DX_CLEAN_RTF) \\
+ \$(DX_CLEAN_XML) \\
+ \$(DX_CLEAN_PS) \\
+ \$(DX_CLEAN_PDF) \\
+ \$(DX_CLEAN_LATEX)"]],
+[[DX_SNIPPET_doc=""]])
+AC_SUBST([DX_RULES],
+["${DX_SNIPPET_doc}"])dnl
+AM_SUBST_NOTMAKE([DX_RULES])
+
+#For debugging:
+#echo DX_FLAG_doc=$DX_FLAG_doc
+#echo DX_FLAG_dot=$DX_FLAG_dot
+#echo DX_FLAG_man=$DX_FLAG_man
+#echo DX_FLAG_html=$DX_FLAG_html
+#echo DX_FLAG_chm=$DX_FLAG_chm
+#echo DX_FLAG_chi=$DX_FLAG_chi
+#echo DX_FLAG_rtf=$DX_FLAG_rtf
+#echo DX_FLAG_xml=$DX_FLAG_xml
+#echo DX_FLAG_pdf=$DX_FLAG_pdf
+#echo DX_FLAG_ps=$DX_FLAG_ps
+#echo DX_ENV=$DX_ENV
+])
--
2.28.0
3
2
[PATCH vkd3d v3 1/5] include: Add basic documentation for vkd3d_types.h.
by Zebediah Figura 02 Sep '20
by Zebediah Figura 02 Sep '20
02 Sep '20
This is built on Doxygen. I'm not personally attached to Doxygen, but it was
easy enough to set up and write for, and I've found its compiled HTML to be
reasonably legible.
Note that Doxygen does allow for specifying documentation in external files,
if keeping the documentation out of the header is desired.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com>
---
v3: Default PostScript to off; add "all" and "clean" rules.
.gitignore | 2 +
Doxyfile.in | 17 ++
Makefile.am | 4 +
configure.ac | 4 +
include/vkd3d_types.h | 18 +-
m4/ax_prog_doxygen.m4 | 586 ++++++++++++++++++++++++++++++++++++++++++
6 files changed, 630 insertions(+), 1 deletion(-)
create mode 100644 Doxyfile.in
create mode 100644 m4/ax_prog_doxygen.m4
diff --git a/.gitignore b/.gitignore
index 72037ddb..51cba319 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,8 @@ autom4te.cache
config.log
config.status
configure
+doc
+Doxyfile
libtool
Makefile
Makefile.in
diff --git a/Doxyfile.in b/Doxyfile.in
new file mode 100644
index 00000000..a20e6f02
--- /dev/null
+++ b/Doxyfile.in
@@ -0,0 +1,17 @@
+# Doxyfile 1.8.18
+
+DOXYFILE_ENCODING = UTF-8
+PROJECT_NAME = @PACKAGE_NAME@
+PROJECT_NUMBER = @PACKAGE_VERSION@
+PROJECT_BRIEF = "The vkd3d 3D Graphics Library"
+OUTPUT_DIRECTORY = doc
+JAVADOC_AUTOBRIEF = YES
+OPTIMIZE_OUTPUT_FOR_C = YES
+EXTRACT_STATIC = YES
+
+INPUT = @srcdir@/include/vkd3d.h \
+ @srcdir@/include/vkd3d_shader.h \
+ @srcdir@/include/vkd3d_types.h \
+ @srcdir@/include/vkd3d_utils.h
+
+EXCLUDE_SYMBOLS = VKD3D_FORCE_32_BIT_ENUM
diff --git a/Makefile.am b/Makefile.am
index 58b3174c..460818c4 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -167,6 +167,10 @@ demos_triangle_CFLAGS = $(DEMOS_CFLAGS)
demos_triangle_LDADD = $(DEMOS_LDADD)
endif
+(a)DX_RULES@
+all: doxygen-doc
+CLEANFILES += DX_CLEANFILES
+
EXTRA_DIST += $(vkd3d_test_headers) $(vkd3d_demos_headers)
VKD3D_V_WIDL = $(vkd3d_v_widl_(a)AM_V@)
diff --git a/configure.ac b/configure.ac
index ca9d7600..e665c5cf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -29,6 +29,10 @@ AC_PROG_MKDIR_P
VKD3D_PROG_WIDL(3, 20)
AS_IF([test "x$WIDL" = "xno"], [AC_MSG_WARN([widl is required to build header files.])])
+DX_PS_FEATURE([OFF])
+DX_INIT_DOXYGEN([vkd3d], [Doxyfile], [doc])
+AC_CONFIG_FILES([Doxyfile])
+
AM_INIT_AUTOMAKE([1.11 foreign silent-rules subdir-objects no-dist-gzip dist-xz -Wall -Werror])
AM_MAINTAINER_MODE([enable])
AM_SILENT_RULES([yes])
diff --git a/include/vkd3d_types.h b/include/vkd3d_types.h
index 34c66748..020eb240 100644
--- a/include/vkd3d_types.h
+++ b/include/vkd3d_types.h
@@ -23,15 +23,31 @@
extern "C" {
#endif /* __cplusplus */
+/**
+ * \file vkd3d_types.h
+ *
+ * This file contains definitions for basic types used by vkd3d libraries.
+ */
+
#define VKD3D_FORCE_32_BIT_ENUM(name) name##_FORCE_32BIT = 0x7fffffff
+/**
+ * Result codes returned by some vkd3d functions. Error codes always have
+ * negative values; non-error codes never do.
+ */
enum vkd3d_result
{
+ /** Success. */
VKD3D_OK = 0,
- VKD3D_ERROR = -1, /* unspecified failure */
+ /** An unspecified failure occurred. */
+ VKD3D_ERROR = -1,
+ /** There are not enough resources available to complete the operation. */
VKD3D_ERROR_OUT_OF_MEMORY = -2,
+ /** One or more parameters passed to a vkd3d function were invalid. */
VKD3D_ERROR_INVALID_ARGUMENT = -3,
+ /** A shader passed to a vkd3d function was invalid. */
VKD3D_ERROR_INVALID_SHADER = -4,
+ /** The operation is not implemented in this version of vkd3d. */
VKD3D_ERROR_NOT_IMPLEMENTED = -5,
VKD3D_FORCE_32_BIT_ENUM(VKD3D_RESULT),
diff --git a/m4/ax_prog_doxygen.m4 b/m4/ax_prog_doxygen.m4
new file mode 100644
index 00000000..ed1dc83b
--- /dev/null
+++ b/m4/ax_prog_doxygen.m4
@@ -0,0 +1,586 @@
+# ===========================================================================
+# https://www.gnu.org/software/autoconf-archive/ax_prog_doxygen.html
+# ===========================================================================
+#
+# SYNOPSIS
+#
+# DX_INIT_DOXYGEN(PROJECT-NAME, [DOXYFILE-PATH], [OUTPUT-DIR], ...)
+# DX_DOXYGEN_FEATURE(ON|OFF)
+# DX_DOT_FEATURE(ON|OFF)
+# DX_HTML_FEATURE(ON|OFF)
+# DX_CHM_FEATURE(ON|OFF)
+# DX_CHI_FEATURE(ON|OFF)
+# DX_MAN_FEATURE(ON|OFF)
+# DX_RTF_FEATURE(ON|OFF)
+# DX_XML_FEATURE(ON|OFF)
+# DX_PDF_FEATURE(ON|OFF)
+# DX_PS_FEATURE(ON|OFF)
+#
+# DESCRIPTION
+#
+# The DX_*_FEATURE macros control the default setting for the given
+# Doxygen feature. Supported features are 'DOXYGEN' itself, 'DOT' for
+# generating graphics, 'HTML' for plain HTML, 'CHM' for compressed HTML
+# help (for MS users), 'CHI' for generating a separate .chi file by the
+# .chm file, and 'MAN', 'RTF', 'XML', 'PDF' and 'PS' for the appropriate
+# output formats. The environment variable DOXYGEN_PAPER_SIZE may be
+# specified to override the default 'a4wide' paper size.
+#
+# By default, HTML, PDF and PS documentation is generated as this seems to
+# be the most popular and portable combination. MAN pages created by
+# Doxygen are usually problematic, though by picking an appropriate subset
+# and doing some massaging they might be better than nothing. CHM and RTF
+# are specific for MS (note that you can't generate both HTML and CHM at
+# the same time). The XML is rather useless unless you apply specialized
+# post-processing to it.
+#
+# The macros mainly control the default state of the feature. The use can
+# override the default by specifying --enable or --disable. The macros
+# ensure that contradictory flags are not given (e.g.,
+# --enable-doxygen-html and --enable-doxygen-chm,
+# --enable-doxygen-anything with --disable-doxygen, etc.) Finally, each
+# feature will be automatically disabled (with a warning) if the required
+# programs are missing.
+#
+# Once all the feature defaults have been specified, call DX_INIT_DOXYGEN
+# with the following parameters: a one-word name for the project for use
+# as a filename base etc., an optional configuration file name (the
+# default is '$(srcdir)/Doxyfile', the same as Doxygen's default), and an
+# optional output directory name (the default is 'doxygen-doc'). To run
+# doxygen multiple times for different configuration files and output
+# directories provide more parameters: the second, forth, sixth, etc
+# parameter are configuration file names and the third, fifth, seventh,
+# etc parameter are output directories. No checking is done to catch
+# duplicates.
+#
+# Automake Support
+#
+# The DX_RULES substitution can be used to add all needed rules to the
+# Makefile. Note that this is a substitution without being a variable:
+# only the @DX_RULES@ syntax will work.
+#
+# The provided targets are:
+#
+# doxygen-doc: Generate all doxygen documentation.
+#
+# doxygen-run: Run doxygen, which will generate some of the
+# documentation (HTML, CHM, CHI, MAN, RTF, XML)
+# but will not do the post processing required
+# for the rest of it (PS, PDF).
+#
+# doxygen-ps: Generate doxygen PostScript documentation.
+#
+# doxygen-pdf: Generate doxygen PDF documentation.
+#
+# Note that by default these are not integrated into the automake targets.
+# If doxygen is used to generate man pages, you can achieve this
+# integration by setting man3_MANS to the list of man pages generated and
+# then adding the dependency:
+#
+# $(man3_MANS): doxygen-doc
+#
+# This will cause make to run doxygen and generate all the documentation.
+#
+# The following variable is intended for use in Makefile.am:
+#
+# DX_CLEANFILES = everything to clean.
+#
+# Then add this variable to MOSTLYCLEANFILES.
+#
+# LICENSE
+#
+# Copyright (c) 2009 Oren Ben-Kiki <oren(a)ben-kiki.org>
+# Copyright (c) 2015 Olaf Mandel <olaf(a)mandel.name>
+#
+# Copying and distribution of this file, with or without modification, are
+# permitted in any medium without royalty provided the copyright notice
+# and this notice are preserved. This file is offered as-is, without any
+# warranty.
+
+#serial 24
+
+## ----------##
+## Defaults. ##
+## ----------##
+
+DX_ENV=""
+AC_DEFUN([DX_FEATURE_doc], ON)
+AC_DEFUN([DX_FEATURE_dot], OFF)
+AC_DEFUN([DX_FEATURE_man], OFF)
+AC_DEFUN([DX_FEATURE_html], ON)
+AC_DEFUN([DX_FEATURE_chm], OFF)
+AC_DEFUN([DX_FEATURE_chi], OFF)
+AC_DEFUN([DX_FEATURE_rtf], OFF)
+AC_DEFUN([DX_FEATURE_xml], OFF)
+AC_DEFUN([DX_FEATURE_pdf], ON)
+AC_DEFUN([DX_FEATURE_ps], ON)
+
+## --------------- ##
+## Private macros. ##
+## --------------- ##
+
+# DX_ENV_APPEND(VARIABLE, VALUE)
+# ------------------------------
+# Append VARIABLE="VALUE" to DX_ENV for invoking doxygen and add it
+# as a substitution (but not a Makefile variable). The substitution
+# is skipped if the variable name is VERSION.
+AC_DEFUN([DX_ENV_APPEND],
+[AC_SUBST([DX_ENV], ["$DX_ENV $1='$2'"])dnl
+m4_if([$1], [VERSION], [], [AC_SUBST([$1], [$2])dnl
+AM_SUBST_NOTMAKE([$1])])dnl
+])
+
+# DX_DIRNAME_EXPR
+# ---------------
+# Expand into a shell expression prints the directory part of a path.
+AC_DEFUN([DX_DIRNAME_EXPR],
+ [[expr ".$1" : '\(\.\)[^/]*$' \| "x$1" : 'x\(.*\)/[^/]*$']])
+
+# DX_IF_FEATURE(FEATURE, IF-ON, IF-OFF)
+# -------------------------------------
+# Expands according to the M4 (static) status of the feature.
+AC_DEFUN([DX_IF_FEATURE], [ifelse(DX_FEATURE_$1, ON, [$2], [$3])])
+
+# DX_REQUIRE_PROG(VARIABLE, PROGRAM)
+# ----------------------------------
+# Require the specified program to be found for the DX_CURRENT_FEATURE to work.
+AC_DEFUN([DX_REQUIRE_PROG], [
+AC_PATH_TOOL([$1], [$2])
+if test "$DX_FLAG_[]DX_CURRENT_FEATURE$$1" = 1; then
+ AC_MSG_WARN([$2 not found - will not DX_CURRENT_DESCRIPTION])
+ AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
+fi
+])
+
+# DX_TEST_FEATURE(FEATURE)
+# ------------------------
+# Expand to a shell expression testing whether the feature is active.
+AC_DEFUN([DX_TEST_FEATURE], [test "$DX_FLAG_$1" = 1])
+
+# DX_CHECK_DEPEND(REQUIRED_FEATURE, REQUIRED_STATE)
+# -------------------------------------------------
+# Verify that a required features has the right state before trying to turn on
+# the DX_CURRENT_FEATURE.
+AC_DEFUN([DX_CHECK_DEPEND], [
+test "$DX_FLAG_$1" = "$2" \
+|| AC_MSG_ERROR([doxygen-DX_CURRENT_FEATURE ifelse([$2], 1,
+ requires, contradicts) doxygen-$1])
+])
+
+# DX_CLEAR_DEPEND(FEATURE, REQUIRED_FEATURE, REQUIRED_STATE)
+# ----------------------------------------------------------
+# Turn off the DX_CURRENT_FEATURE if the required feature is off.
+AC_DEFUN([DX_CLEAR_DEPEND], [
+test "$DX_FLAG_$1" = "$2" || AC_SUBST(DX_FLAG_[]DX_CURRENT_FEATURE, 0)
+])
+
+# DX_FEATURE_ARG(FEATURE, DESCRIPTION,
+# CHECK_DEPEND, CLEAR_DEPEND,
+# REQUIRE, DO-IF-ON, DO-IF-OFF)
+# --------------------------------------------
+# Parse the command-line option controlling a feature. CHECK_DEPEND is called
+# if the user explicitly turns the feature on (and invokes DX_CHECK_DEPEND),
+# otherwise CLEAR_DEPEND is called to turn off the default state if a required
+# feature is disabled (using DX_CLEAR_DEPEND). REQUIRE performs additional
+# requirement tests (DX_REQUIRE_PROG). Finally, an automake flag is set and
+# DO-IF-ON or DO-IF-OFF are called according to the final state of the feature.
+AC_DEFUN([DX_ARG_ABLE], [
+ AC_DEFUN([DX_CURRENT_FEATURE], [$1])
+ AC_DEFUN([DX_CURRENT_DESCRIPTION], [$2])
+ AC_ARG_ENABLE(doxygen-$1,
+ [AS_HELP_STRING(DX_IF_FEATURE([$1], [--disable-doxygen-$1],
+ [--enable-doxygen-$1]),
+ DX_IF_FEATURE([$1], [don't $2], [$2]))],
+ [
+case "$enableval" in
+#(
+y|Y|yes|Yes|YES)
+ AC_SUBST([DX_FLAG_$1], 1)
+ $3
+;; #(
+n|N|no|No|NO)
+ AC_SUBST([DX_FLAG_$1], 0)
+;; #(
+*)
+ AC_MSG_ERROR([invalid value '$enableval' given to doxygen-$1])
+;;
+esac
+], [
+AC_SUBST([DX_FLAG_$1], [DX_IF_FEATURE([$1], 1, 0)])
+$4
+])
+if DX_TEST_FEATURE([$1]); then
+ $5
+ :
+fi
+if DX_TEST_FEATURE([$1]); then
+ $6
+ :
+else
+ $7
+ :
+fi
+])
+
+## -------------- ##
+## Public macros. ##
+## -------------- ##
+
+# DX_XXX_FEATURE(DEFAULT_STATE)
+# -----------------------------
+AC_DEFUN([DX_DOXYGEN_FEATURE], [AC_DEFUN([DX_FEATURE_doc], [$1])])
+AC_DEFUN([DX_DOT_FEATURE], [AC_DEFUN([DX_FEATURE_dot], [$1])])
+AC_DEFUN([DX_MAN_FEATURE], [AC_DEFUN([DX_FEATURE_man], [$1])])
+AC_DEFUN([DX_HTML_FEATURE], [AC_DEFUN([DX_FEATURE_html], [$1])])
+AC_DEFUN([DX_CHM_FEATURE], [AC_DEFUN([DX_FEATURE_chm], [$1])])
+AC_DEFUN([DX_CHI_FEATURE], [AC_DEFUN([DX_FEATURE_chi], [$1])])
+AC_DEFUN([DX_RTF_FEATURE], [AC_DEFUN([DX_FEATURE_rtf], [$1])])
+AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
+AC_DEFUN([DX_XML_FEATURE], [AC_DEFUN([DX_FEATURE_xml], [$1])])
+AC_DEFUN([DX_PDF_FEATURE], [AC_DEFUN([DX_FEATURE_pdf], [$1])])
+AC_DEFUN([DX_PS_FEATURE], [AC_DEFUN([DX_FEATURE_ps], [$1])])
+
+# DX_INIT_DOXYGEN(PROJECT, [CONFIG-FILE], [OUTPUT-DOC-DIR], ...)
+# --------------------------------------------------------------
+# PROJECT also serves as the base name for the documentation files.
+# The default CONFIG-FILE is "$(srcdir)/Doxyfile" and OUTPUT-DOC-DIR is
+# "doxygen-doc".
+# More arguments are interpreted as interleaved CONFIG-FILE and
+# OUTPUT-DOC-DIR values.
+AC_DEFUN([DX_INIT_DOXYGEN], [
+
+# Files:
+AC_SUBST([DX_PROJECT], [$1])
+AC_SUBST([DX_CONFIG], ['ifelse([$2], [], [$(srcdir)/Doxyfile], [$2])'])
+AC_SUBST([DX_DOCDIR], ['ifelse([$3], [], [doxygen-doc], [$3])'])
+m4_if(m4_eval(3 < m4_count($@)), 1, [m4_for([DX_i], 4, m4_count($@), 2,
+ [AC_SUBST([DX_CONFIG]m4_eval(DX_i[/2]),
+ 'm4_default_nblank_quoted(m4_argn(DX_i, $@),
+ [$(srcdir)/Doxyfile])')])])dnl
+m4_if(m4_eval(3 < m4_count($@)), 1, [m4_for([DX_i], 5, m4_count($@,), 2,
+ [AC_SUBST([DX_DOCDIR]m4_eval([(]DX_i[-1)/2]),
+ 'm4_default_nblank_quoted(m4_argn(DX_i, $@),
+ [doxygen-doc])')])])dnl
+m4_define([DX_loop], m4_dquote(m4_if(m4_eval(3 < m4_count($@)), 1,
+ [m4_for([DX_i], 4, m4_count($@), 2, [, m4_eval(DX_i[/2])])],
+ [])))dnl
+
+# Environment variables used inside doxygen.cfg:
+DX_ENV_APPEND(SRCDIR, $srcdir)
+DX_ENV_APPEND(PROJECT, $DX_PROJECT)
+DX_ENV_APPEND(VERSION, $PACKAGE_VERSION)
+
+# Doxygen itself:
+DX_ARG_ABLE(doc, [generate any doxygen documentation],
+ [],
+ [],
+ [DX_REQUIRE_PROG([DX_DOXYGEN], doxygen)
+ DX_REQUIRE_PROG([DX_PERL], perl)],
+ [DX_ENV_APPEND(PERL_PATH, $DX_PERL)])
+
+# Dot for graphics:
+DX_ARG_ABLE(dot, [generate graphics for doxygen documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_DOT], dot)],
+ [DX_ENV_APPEND(HAVE_DOT, YES)
+ DX_ENV_APPEND(DOT_PATH, [`DX_DIRNAME_EXPR($DX_DOT)`])],
+ [DX_ENV_APPEND(HAVE_DOT, NO)])
+
+# Man pages generation:
+DX_ARG_ABLE(man, [generate doxygen manual pages],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_MAN, YES)],
+ [DX_ENV_APPEND(GENERATE_MAN, NO)])
+
+# RTF file generation:
+DX_ARG_ABLE(rtf, [generate doxygen RTF documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_RTF, YES)],
+ [DX_ENV_APPEND(GENERATE_RTF, NO)])
+
+# XML file generation:
+DX_ARG_ABLE(xml, [generate doxygen XML documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_XML, YES)],
+ [DX_ENV_APPEND(GENERATE_XML, NO)])
+
+# (Compressed) HTML help generation:
+DX_ARG_ABLE(chm, [generate doxygen compressed HTML help documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_HHC], hhc)],
+ [DX_ENV_APPEND(HHC_PATH, $DX_HHC)
+ DX_ENV_APPEND(GENERATE_HTML, YES)
+ DX_ENV_APPEND(GENERATE_HTMLHELP, YES)],
+ [DX_ENV_APPEND(GENERATE_HTMLHELP, NO)])
+
+# Separate CHI file generation.
+DX_ARG_ABLE(chi, [generate doxygen separate compressed HTML help index file],
+ [DX_CHECK_DEPEND(chm, 1)],
+ [DX_CLEAR_DEPEND(chm, 1)],
+ [],
+ [DX_ENV_APPEND(GENERATE_CHI, YES)],
+ [DX_ENV_APPEND(GENERATE_CHI, NO)])
+
+# Plain HTML pages generation:
+DX_ARG_ABLE(html, [generate doxygen plain HTML documentation],
+ [DX_CHECK_DEPEND(doc, 1) DX_CHECK_DEPEND(chm, 0)],
+ [DX_CLEAR_DEPEND(doc, 1) DX_CLEAR_DEPEND(chm, 0)],
+ [],
+ [DX_ENV_APPEND(GENERATE_HTML, YES)],
+ [DX_TEST_FEATURE(chm) || DX_ENV_APPEND(GENERATE_HTML, NO)])
+
+# PostScript file generation:
+DX_ARG_ABLE(ps, [generate doxygen PostScript documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_LATEX], latex)
+ DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
+ DX_REQUIRE_PROG([DX_DVIPS], dvips)
+ DX_REQUIRE_PROG([DX_EGREP], egrep)])
+
+# PDF file generation:
+DX_ARG_ABLE(pdf, [generate doxygen PDF documentation],
+ [DX_CHECK_DEPEND(doc, 1)],
+ [DX_CLEAR_DEPEND(doc, 1)],
+ [DX_REQUIRE_PROG([DX_PDFLATEX], pdflatex)
+ DX_REQUIRE_PROG([DX_MAKEINDEX], makeindex)
+ DX_REQUIRE_PROG([DX_EGREP], egrep)])
+
+# LaTeX generation for PS and/or PDF:
+if DX_TEST_FEATURE(ps) || DX_TEST_FEATURE(pdf); then
+ DX_ENV_APPEND(GENERATE_LATEX, YES)
+else
+ DX_ENV_APPEND(GENERATE_LATEX, NO)
+fi
+
+# Paper size for PS and/or PDF:
+AC_ARG_VAR(DOXYGEN_PAPER_SIZE,
+ [a4wide (default), a4, letter, legal or executive])
+case "$DOXYGEN_PAPER_SIZE" in
+#(
+"")
+ AC_SUBST(DOXYGEN_PAPER_SIZE, "")
+;; #(
+a4wide|a4|letter|legal|executive)
+ DX_ENV_APPEND(PAPER_SIZE, $DOXYGEN_PAPER_SIZE)
+;; #(
+*)
+ AC_MSG_ERROR([unknown DOXYGEN_PAPER_SIZE='$DOXYGEN_PAPER_SIZE'])
+;;
+esac
+
+# Rules:
+AS_IF([[test $DX_FLAG_html -eq 1]],
+[[DX_SNIPPET_html="## ------------------------------- ##
+## Rules specific for HTML output. ##
+## ------------------------------- ##
+
+DX_CLEAN_HTML = \$(DX_DOCDIR)/html]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/html]])[
+
+"]],
+[[DX_SNIPPET_html=""]])
+AS_IF([[test $DX_FLAG_chi -eq 1]],
+[[DX_SNIPPET_chi="
+DX_CLEAN_CHI = \$(DX_DOCDIR)/\$(PACKAGE).chi]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).chi]])["]],
+[[DX_SNIPPET_chi=""]])
+AS_IF([[test $DX_FLAG_chm -eq 1]],
+[[DX_SNIPPET_chm="## ------------------------------ ##
+## Rules specific for CHM output. ##
+## ------------------------------ ##
+
+DX_CLEAN_CHM = \$(DX_DOCDIR)/chm]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/chm]])[\
+${DX_SNIPPET_chi}
+
+"]],
+[[DX_SNIPPET_chm=""]])
+AS_IF([[test $DX_FLAG_man -eq 1]],
+[[DX_SNIPPET_man="## ------------------------------ ##
+## Rules specific for MAN output. ##
+## ------------------------------ ##
+
+DX_CLEAN_MAN = \$(DX_DOCDIR)/man]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/man]])[
+
+"]],
+[[DX_SNIPPET_man=""]])
+AS_IF([[test $DX_FLAG_rtf -eq 1]],
+[[DX_SNIPPET_rtf="## ------------------------------ ##
+## Rules specific for RTF output. ##
+## ------------------------------ ##
+
+DX_CLEAN_RTF = \$(DX_DOCDIR)/rtf]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/rtf]])[
+
+"]],
+[[DX_SNIPPET_rtf=""]])
+AS_IF([[test $DX_FLAG_xml -eq 1]],
+[[DX_SNIPPET_xml="## ------------------------------ ##
+## Rules specific for XML output. ##
+## ------------------------------ ##
+
+DX_CLEAN_XML = \$(DX_DOCDIR)/xml]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/xml]])[
+
+"]],
+[[DX_SNIPPET_xml=""]])
+AS_IF([[test $DX_FLAG_ps -eq 1]],
+[[DX_SNIPPET_ps="## ----------------------------- ##
+## Rules specific for PS output. ##
+## ----------------------------- ##
+
+DX_CLEAN_PS = \$(DX_DOCDIR)/\$(PACKAGE).ps]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).ps]])[
+
+DX_PS_GOAL = doxygen-ps
+
+doxygen-ps: \$(DX_CLEAN_PS)
+
+]m4_foreach([DX_i], [DX_loop],
+[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).ps: \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag
+ \$(DX_V_LATEX)cd \$(DX_DOCDIR]DX_i[)/latex; \\
+ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \\
+ \$(DX_LATEX) refman.tex; \\
+ \$(DX_MAKEINDEX) refman.idx; \\
+ \$(DX_LATEX) refman.tex; \\
+ countdown=5; \\
+ while \$(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \\
+ refman.log > /dev/null 2>&1 \\
+ && test \$\$countdown -gt 0; do \\
+ \$(DX_LATEX) refman.tex; \\
+ countdown=\`expr \$\$countdown - 1\`; \\
+ done; \\
+ \$(DX_DVIPS) -o ../\$(PACKAGE).ps refman.dvi
+
+]])["]],
+[[DX_SNIPPET_ps=""]])
+AS_IF([[test $DX_FLAG_pdf -eq 1]],
+[[DX_SNIPPET_pdf="## ------------------------------ ##
+## Rules specific for PDF output. ##
+## ------------------------------ ##
+
+DX_CLEAN_PDF = \$(DX_DOCDIR)/\$(PACKAGE).pdf]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).pdf]])[
+
+DX_PDF_GOAL = doxygen-pdf
+
+doxygen-pdf: \$(DX_CLEAN_PDF)
+
+]m4_foreach([DX_i], [DX_loop],
+[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).pdf: \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag
+ \$(DX_V_LATEX)cd \$(DX_DOCDIR]DX_i[)/latex; \\
+ rm -f *.aux *.toc *.idx *.ind *.ilg *.log *.out; \\
+ \$(DX_PDFLATEX) refman.tex; \\
+ \$(DX_MAKEINDEX) refman.idx; \\
+ \$(DX_PDFLATEX) refman.tex; \\
+ countdown=5; \\
+ while \$(DX_EGREP) 'Rerun (LaTeX|to get cross-references right)' \\
+ refman.log > /dev/null 2>&1 \\
+ && test \$\$countdown -gt 0; do \\
+ \$(DX_PDFLATEX) refman.tex; \\
+ countdown=\`expr \$\$countdown - 1\`; \\
+ done; \\
+ mv refman.pdf ../\$(PACKAGE).pdf
+
+]])["]],
+[[DX_SNIPPET_pdf=""]])
+AS_IF([[test $DX_FLAG_ps -eq 1 -o $DX_FLAG_pdf -eq 1]],
+[[DX_SNIPPET_latex="## ------------------------------------------------- ##
+## Rules specific for LaTeX (shared for PS and PDF). ##
+## ------------------------------------------------- ##
+
+DX_V_LATEX = \$(_DX_v_LATEX_\$(V))
+_DX_v_LATEX_ = \$(_DX_v_LATEX_\$(AM_DEFAULT_VERBOSITY))
+_DX_v_LATEX_0 = @echo \" LATEX \" \$][@;
+
+DX_CLEAN_LATEX = \$(DX_DOCDIR)/latex]dnl
+m4_foreach([DX_i], [m4_shift(DX_loop)], [[\\
+ \$(DX_DOCDIR]DX_i[)/latex]])[
+
+"]],
+[[DX_SNIPPET_latex=""]])
+
+AS_IF([[test $DX_FLAG_doc -eq 1]],
+[[DX_SNIPPET_doc="## --------------------------------- ##
+## Format-independent Doxygen rules. ##
+## --------------------------------- ##
+
+${DX_SNIPPET_html}\
+${DX_SNIPPET_chm}\
+${DX_SNIPPET_man}\
+${DX_SNIPPET_rtf}\
+${DX_SNIPPET_xml}\
+${DX_SNIPPET_ps}\
+${DX_SNIPPET_pdf}\
+${DX_SNIPPET_latex}\
+DX_V_DXGEN = \$(_DX_v_DXGEN_\$(V))
+_DX_v_DXGEN_ = \$(_DX_v_DXGEN_\$(AM_DEFAULT_VERBOSITY))
+_DX_v_DXGEN_0 = @echo \" DXGEN \" \$<;
+
+.PHONY: doxygen-run doxygen-doc \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
+
+.INTERMEDIATE: doxygen-run \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
+
+doxygen-run:]m4_foreach([DX_i], [DX_loop],
+ [[ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag]])[
+
+doxygen-doc: doxygen-run \$(DX_PS_GOAL) \$(DX_PDF_GOAL)
+
+]m4_foreach([DX_i], [DX_loop],
+[[\$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag: \$(DX_CONFIG]DX_i[) \$(pkginclude_HEADERS)
+ \$(A""M_V_at)rm -rf \$(DX_DOCDIR]DX_i[)
+ \$(DX_V_DXGEN)\$(DX_ENV) DOCDIR=\$(DX_DOCDIR]DX_i[) \$(DX_DOXYGEN) \$(DX_CONFIG]DX_i[)
+ \$(A""M_V_at)echo Timestamp >\$][@
+
+]])dnl
+[DX_CLEANFILES = \\]
+m4_foreach([DX_i], [DX_loop],
+[[ \$(DX_DOCDIR]DX_i[)/doxygen_sqlite3.db \\
+ \$(DX_DOCDIR]DX_i[)/\$(PACKAGE).tag \\
+]])dnl
+[ -r \\
+ \$(DX_CLEAN_HTML) \\
+ \$(DX_CLEAN_CHM) \\
+ \$(DX_CLEAN_CHI) \\
+ \$(DX_CLEAN_MAN) \\
+ \$(DX_CLEAN_RTF) \\
+ \$(DX_CLEAN_XML) \\
+ \$(DX_CLEAN_PS) \\
+ \$(DX_CLEAN_PDF) \\
+ \$(DX_CLEAN_LATEX)"]],
+[[DX_SNIPPET_doc=""]])
+AC_SUBST([DX_RULES],
+["${DX_SNIPPET_doc}"])dnl
+AM_SUBST_NOTMAKE([DX_RULES])
+
+#For debugging:
+#echo DX_FLAG_doc=$DX_FLAG_doc
+#echo DX_FLAG_dot=$DX_FLAG_dot
+#echo DX_FLAG_man=$DX_FLAG_man
+#echo DX_FLAG_html=$DX_FLAG_html
+#echo DX_FLAG_chm=$DX_FLAG_chm
+#echo DX_FLAG_chi=$DX_FLAG_chi
+#echo DX_FLAG_rtf=$DX_FLAG_rtf
+#echo DX_FLAG_xml=$DX_FLAG_xml
+#echo DX_FLAG_pdf=$DX_FLAG_pdf
+#echo DX_FLAG_ps=$DX_FLAG_ps
+#echo DX_ENV=$DX_ENV
+])
--
2.28.0
4
10
02 Sep '20
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/combase/combase.c | 89 +++++++++++++++++++++++++++++++
dlls/combase/combase.spec | 20 +++----
dlls/combase/rpc.c | 10 ++++
dlls/ole32/compobj.c | 108 --------------------------------------
dlls/ole32/ole2.c | 11 ----
dlls/ole32/ole32.spec | 20 +++----
6 files changed, 119 insertions(+), 139 deletions(-)
diff --git a/dlls/combase/combase.c b/dlls/combase/combase.c
index d959034b57f..99352712f78 100644
--- a/dlls/combase/combase.c
+++ b/dlls/combase/combase.c
@@ -2595,6 +2595,16 @@ static void unlock_init_spies(struct tlsdata *tlsdata)
}
}
+/******************************************************************************
+ * CoInitializeWOW (combase.@)
+ */
+HRESULT WINAPI CoInitializeWOW(DWORD arg1, DWORD arg2)
+{
+ FIXME("%#x, %#x\n", arg1, arg2);
+
+ return S_OK;
+}
+
/******************************************************************************
* CoInitializeEx (combase.@)
*/
@@ -3062,6 +3072,85 @@ HRESULT WINAPI CoRegisterChannelHook(REFGUID guidExtension, IChannelHook *channe
return rpc_register_channel_hook(guidExtension, channel_hook);
}
+/***********************************************************************
+ * CoDisableCallCancellation (combase.@)
+ */
+HRESULT WINAPI CoDisableCallCancellation(void *reserved)
+{
+ FIXME("%p stub\n", reserved);
+
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * CoEnableCallCancellation (combase.@)
+ */
+HRESULT WINAPI CoEnableCallCancellation(void *reserved)
+{
+ FIXME("%p stub\n", reserved);
+
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * CoGetCallerTID (combase.@)
+ */
+HRESULT WINAPI CoGetCallerTID(DWORD *tid)
+{
+ FIXME("stub!\n");
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * CoIsHandlerConnected (combase.@)
+ */
+BOOL WINAPI CoIsHandlerConnected(IUnknown *object)
+{
+ FIXME("%p\n", object);
+
+ return TRUE;
+}
+
+/***********************************************************************
+ * CoSuspendClassObjects (combase.@)
+ */
+HRESULT WINAPI CoSuspendClassObjects(void)
+{
+ FIXME("\n");
+
+ return S_OK;
+}
+
+/***********************************************************************
+ * CoResumeClassObjects (combase.@)
+ */
+HRESULT WINAPI CoResumeClassObjects(void)
+{
+ FIXME("stub\n");
+
+ return S_OK;
+}
+
+/***********************************************************************
+ * CoRegisterSurrogate (combase.@)
+ */
+HRESULT WINAPI CoRegisterSurrogate(ISurrogate *surrogate)
+{
+ FIXME("%p stub\n", surrogate);
+
+ return E_NOTIMPL;
+}
+
+/***********************************************************************
+ * CoRegisterSurrogateEx (combase.@)
+ */
+HRESULT WINAPI CoRegisterSurrogateEx(REFGUID guid, void *reserved)
+{
+ FIXME("%s, %p stub\n", debugstr_guid(guid), reserved);
+
+ return E_NOTIMPL;
+}
+
/***********************************************************************
* DllMain (combase.@)
*/
diff --git a/dlls/combase/combase.spec b/dlls/combase/combase.spec
index 3a09ce064b0..50b58419bc5 100644
--- a/dlls/combase/combase.spec
+++ b/dlls/combase/combase.spec
@@ -87,10 +87,10 @@
@ stub CoDeactivateObject
@ stub CoDecodeProxy
@ stdcall CoDecrementMTAUsage(ptr)
-@ stdcall CoDisableCallCancellation(ptr) ole32.CoDisableCallCancellation
+@ stdcall CoDisableCallCancellation(ptr)
@ stub CoDisconnectContext
@ stdcall CoDisconnectObject(ptr long)
-@ stdcall CoEnableCallCancellation(ptr) ole32.CoEnableCallCancellation
+@ stdcall CoEnableCallCancellation(ptr)
@ stdcall CoFileTimeNow(ptr)
@ stdcall CoFreeUnusedLibraries()
@ stdcall CoFreeUnusedLibrariesEx(long long)
@@ -99,7 +99,7 @@
@ stdcall CoGetApartmentType(ptr ptr)
@ stdcall CoGetCallContext(ptr ptr)
@ stdcall CoGetCallState(long ptr)
-@ stdcall CoGetCallerTID(ptr) ole32.CoGetCallerTID
+@ stdcall CoGetCallerTID(ptr)
@ stub CoGetCancelObject
@ stdcall CoGetClassObject(ptr long ptr ptr ptr)
@ stub CoGetClassVersion
@@ -125,9 +125,9 @@
@ stdcall CoIncrementMTAUsage(ptr)
@ stdcall CoInitializeEx(ptr long)
@ stdcall CoInitializeSecurity(ptr long ptr ptr long long ptr long ptr)
-@ stdcall CoInitializeWOW(long long) ole32.CoInitializeWOW
+@ stdcall CoInitializeWOW(long long)
@ stub CoInvalidateRemoteMachineBindings
-@ stdcall CoIsHandlerConnected(ptr) ole32.CoIsHandlerConnected
+@ stdcall CoIsHandlerConnected(ptr)
@ stdcall CoLockObjectExternal(ptr long long)
@ stdcall CoMarshalHresult(ptr long)
@ stdcall CoMarshalInterThreadInterfaceInStream(ptr ptr ptr)
@@ -145,11 +145,11 @@
@ stdcall CoRegisterMallocSpy(ptr)
@ stdcall CoRegisterMessageFilter(ptr ptr)
@ stdcall CoRegisterPSClsid(ptr ptr)
-@ stdcall CoRegisterSurrogate(ptr) ole32.CoRegisterSurrogate
-@ stdcall CoRegisterSurrogateEx(ptr ptr) ole32.CoRegisterSurrogateEx
+@ stdcall CoRegisterSurrogate(ptr)
+@ stdcall CoRegisterSurrogateEx(ptr ptr)
@ stdcall CoReleaseMarshalData(ptr)
@ stdcall CoReleaseServerProcess()
-@ stdcall CoResumeClassObjects() ole32.CoResumeClassObjects
+@ stdcall CoResumeClassObjects()
@ stub CoRetireServer
@ stdcall CoRevertToSelf()
@ stdcall CoRevokeClassObject(long)
@@ -158,7 +158,7 @@
@ stub CoSetCancelObject
@ stdcall CoSetErrorInfo(long ptr) SetErrorInfo
@ stdcall CoSetProxyBlanket(ptr long long ptr long long ptr long)
-@ stdcall CoSuspendClassObjects() ole32.CoSuspendClassObjects
+@ stdcall CoSuspendClassObjects()
@ stdcall CoSwitchCallContext(ptr ptr)
@ stdcall CoTaskMemAlloc(long)
@ stdcall CoTaskMemFree(ptr)
@@ -176,7 +176,7 @@
@ stdcall CreateErrorInfo(ptr)
@ stdcall CreateStreamOnHGlobal(ptr long ptr) ole32.CreateStreamOnHGlobal
@ stub DcomChannelSetHResult
-@ stdcall DllDebugObjectRPCHook(long ptr) ole32.DllDebugObjectRPCHook
+@ stdcall DllDebugObjectRPCHook(long ptr)
@ stdcall DllGetActivationFactory(ptr ptr)
@ stdcall -private DllGetClassObject(ptr ptr ptr) ole32.DllGetClassObject
@ stub EnableHookObject
diff --git a/dlls/combase/rpc.c b/dlls/combase/rpc.c
index ebfc19329d8..513c1e6c13a 100644
--- a/dlls/combase/rpc.c
+++ b/dlls/combase/rpc.c
@@ -2244,3 +2244,13 @@ void rpc_start_remoting(struct apartment *apt)
}
start_apartment_remote_unknown(apt);
}
+
+/******************************************************************************
+ * DllDebugObjectRPCHook (combase.@)
+ */
+BOOL WINAPI DllDebugObjectRPCHook(BOOL trace, /* ORPC_INIT_ARGS * */ void *args)
+{
+ FIXME("%d, %p: stub\n", trace, args);
+
+ return TRUE;
+}
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index a9a9af53108..f4fe82de436 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -561,21 +561,6 @@ HRESULT COM_OpenKeyForCLSID(REFCLSID clsid, LPCWSTR keyname, REGSAM access, HKEY
return S_OK;
}
-/***********************************************************************
- * CoResumeClassObjects (OLE32.@)
- *
- * Resumes all class objects registered with REGCLS_SUSPENDED.
- *
- * RETURNS
- * Success: S_OK.
- * Failure: HRESULT code.
- */
-HRESULT WINAPI CoResumeClassObjects(void)
-{
- FIXME("stub\n");
- return S_OK;
-}
-
/***********************************************************************
* CoLoadLibrary (OLE32.@)
*
@@ -635,24 +620,6 @@ void WINAPI CoFreeAllLibraries(void)
/* NOP */
}
-/***********************************************************************
- * CoInitializeWOW (OLE32.@)
- *
- * WOW equivalent of CoInitialize?
- *
- * PARAMS
- * x [I] Unknown.
- * y [I] Unknown.
- *
- * RETURNS
- * Unknown.
- */
-HRESULT WINAPI CoInitializeWOW(DWORD x,DWORD y)
-{
- FIXME("(0x%08x,0x%08x),stub!\n",x,y);
- return 0;
-}
-
/***********************************************************************
* CoGetState [OLE32.@]
*
@@ -834,41 +801,6 @@ BOOL WINAPI IsEqualGUID(
return !memcmp(rguid1,rguid2,sizeof(GUID));
}
-/***********************************************************************
- * CoSuspendClassObjects [OLE32.@]
- *
- * Suspends all registered class objects to prevent further requests coming in
- * for those objects.
- *
- * RETURNS
- * Success: S_OK.
- * Failure: HRESULT code.
- */
-HRESULT WINAPI CoSuspendClassObjects(void)
-{
- FIXME("\n");
- return S_OK;
-}
-
-/***********************************************************************
- * CoIsHandlerConnected [OLE32.@]
- *
- * Determines whether a proxy is connected to a remote stub.
- *
- * PARAMS
- * pUnk [I] Pointer to object that may or may not be connected.
- *
- * RETURNS
- * TRUE if pUnk is not a proxy or if pUnk is connected to a remote stub, or
- * FALSE otherwise.
- */
-BOOL WINAPI CoIsHandlerConnected(IUnknown *pUnk)
-{
- FIXME("%p\n", pUnk);
-
- return TRUE;
-}
-
/***********************************************************************
* CoAllowSetForegroundWindow [OLE32.@]
*
@@ -1005,46 +937,6 @@ HRESULT Handler_DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
return CLASS_E_CLASSNOTAVAILABLE;
}
-/***********************************************************************
- * CoDisableCallCancellation [OLE32.@]
- */
-HRESULT WINAPI CoDisableCallCancellation(void *reserved)
-{
- FIXME("(%p): stub\n", reserved);
-
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * CoEnableCallCancellation [OLE32.@]
- */
-HRESULT WINAPI CoEnableCallCancellation(void *reserved)
-{
- FIXME("(%p): stub\n", reserved);
-
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * CoRegisterSurrogate [OLE32.@]
- */
-HRESULT WINAPI CoRegisterSurrogate(ISurrogate *surrogate)
-{
- FIXME("(%p): stub\n", surrogate);
-
- return E_NOTIMPL;
-}
-
-/***********************************************************************
- * CoRegisterSurrogateEx [OLE32.@]
- */
-HRESULT WINAPI CoRegisterSurrogateEx(REFGUID guid, void *reserved)
-{
- FIXME("(%s %p): stub\n", debugstr_guid(guid), reserved);
-
- return E_NOTIMPL;
-}
-
typedef struct {
IGlobalOptions IGlobalOptions_iface;
LONG ref;
diff --git a/dlls/ole32/ole2.c b/dlls/ole32/ole2.c
index 4f4a1378b1e..15c4f8234f3 100644
--- a/dlls/ole32/ole2.c
+++ b/dlls/ole32/ole2.c
@@ -2729,14 +2729,3 @@ void WINAPI PropSysFreeString(LPOLESTR str)
{
SysFreeString(str);
}
-
-/******************************************************************************
- * DllDebugObjectRPCHook (OLE32.@)
- * turns on and off internal debugging, pointer is only used on macintosh
- */
-
-BOOL WINAPI DllDebugObjectRPCHook(BOOL b, void *dummy)
-{
- FIXME("stub\n");
- return TRUE;
-}
diff --git a/dlls/ole32/ole32.spec b/dlls/ole32/ole32.spec
index cf48d043b75..44c03b6628c 100644
--- a/dlls/ole32/ole32.spec
+++ b/dlls/ole32/ole32.spec
@@ -15,10 +15,10 @@
@ stdcall CoCreateInstance(ptr ptr long ptr ptr) combase.CoCreateInstance
@ stdcall CoCreateInstanceEx(ptr ptr long ptr long ptr) combase.CoCreateInstanceEx
@ stdcall CoDecrementMTAUsage(ptr) combase.CoDecrementMTAUsage
-@ stdcall CoDisableCallCancellation(ptr)
+@ stdcall CoDisableCallCancellation(ptr) combase.CoDisableCallCancellation
@ stdcall CoDisconnectObject(ptr long) combase.CoDisconnectObject
@ stdcall CoDosDateTimeToFileTime(long long ptr) kernel32.DosDateTimeToFileTime
-@ stdcall CoEnableCallCancellation(ptr)
+@ stdcall CoEnableCallCancellation(ptr) combase.CoEnableCallCancellation
@ stdcall CoFileTimeNow(ptr) combase.CoFileTimeNow
@ stdcall CoFileTimeToDosDateTime(ptr ptr ptr) kernel32.FileTimeToDosDateTime
@ stdcall CoFreeAllLibraries()
@@ -29,7 +29,7 @@
@ stdcall CoGetApartmentType(ptr ptr) combase.CoGetApartmentType
@ stdcall CoGetCallContext(ptr ptr) combase.CoGetCallContext
@ stdcall CoGetCallState(long ptr) combase.CoGetCallState
-@ stdcall CoGetCallerTID(ptr)
+@ stdcall CoGetCallerTID(ptr) combase.CoGetCallerTID
@ stdcall CoGetClassObject(ptr long ptr ptr ptr) combase.CoGetClassObject
@ stdcall CoGetContextToken(ptr) combase.CoGetContextToken
@ stdcall CoGetCurrentLogicalThreadId(ptr) combase.CoGetCurrentLogicalThreadId
@@ -52,8 +52,8 @@
@ stdcall CoInitialize(ptr)
@ stdcall CoInitializeEx(ptr long) combase.CoInitializeEx
@ stdcall CoInitializeSecurity(ptr long ptr ptr long long ptr long ptr) combase.CoInitializeSecurity
-@ stdcall CoInitializeWOW(long long)
-@ stdcall CoIsHandlerConnected(ptr)
+@ stdcall CoInitializeWOW(long long) combase.CoInitializeWOW
+@ stdcall CoIsHandlerConnected(ptr) combase.CoIsHandlerConnected
@ stdcall CoIsOle1Class (ptr)
@ stdcall CoLoadLibrary(wstr long)
@ stdcall CoLockObjectExternal(ptr long long) combase.CoLockObjectExternal
@@ -70,18 +70,18 @@
@ stdcall CoRegisterMallocSpy(ptr) combase.CoRegisterMallocSpy
@ stdcall CoRegisterMessageFilter(ptr ptr) combase.CoRegisterMessageFilter
@ stdcall CoRegisterPSClsid(ptr ptr) combase.CoRegisterPSClsid
-@ stdcall CoRegisterSurrogate(ptr)
-@ stdcall CoRegisterSurrogateEx(ptr ptr)
+@ stdcall CoRegisterSurrogate(ptr) combase.CoRegisterSurrogate
+@ stdcall CoRegisterSurrogateEx(ptr ptr) combase.CoRegisterSurrogateEx
@ stdcall CoReleaseMarshalData(ptr) combase.CoReleaseMarshalData
@ stdcall CoReleaseServerProcess() combase.CoReleaseServerProcess
-@ stdcall CoResumeClassObjects()
+@ stdcall CoResumeClassObjects() combase.CoResumeClassObjects
@ stdcall CoRevertToSelf() combase.CoRevertToSelf
@ stdcall CoRevokeClassObject(long) combase.CoRevokeClassObject
@ stdcall CoRevokeInitializeSpy(int64) combase.CoRevokeInitializeSpy
@ stdcall CoRevokeMallocSpy() combase.CoRevokeMallocSpy
@ stdcall CoSetProxyBlanket(ptr long long ptr long long ptr long) combase.CoSetProxyBlanket
@ stdcall CoSetState(ptr)
-@ stdcall CoSuspendClassObjects()
+@ stdcall CoSuspendClassObjects() combase.CoSuspendClassObjects
@ stdcall CoSwitchCallContext(ptr ptr) combase.CoSwitchCallContext
@ stdcall CoTaskMemAlloc(long) combase.CoTaskMemAlloc
@ stdcall CoTaskMemFree(ptr) combase.CoTaskMemFree
@@ -107,7 +107,7 @@
@ stdcall CreatePointerMoniker(ptr ptr)
@ stdcall CreateStreamOnHGlobal(ptr long ptr)
@ stdcall DestroyRunningObjectTable()
-@ stdcall DllDebugObjectRPCHook(long ptr)
+@ stdcall DllDebugObjectRPCHook(long ptr) combase.DllDebugObjectRPCHook
@ stdcall -private DllGetClassObject (ptr ptr ptr)
@ stub DllGetClassObjectWOW
@ stdcall -private DllRegisterServer()
--
2.28.0
3
9