Wine-Devel
Threads by month
- ----- 2026 -----
- May
- April
- March
- February
- January
- ----- 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
- 1 participants
- 84530 discussions
[PATCH v2] msado15: Add helper function to create CommandText interface
by Alistair Leslie-Hughes Feb. 23, 2021
by Alistair Leslie-Hughes Feb. 23, 2021
Feb. 23, 2021
Signed-off-by: Alistair Leslie-Hughes <leslie_alistair(a)hotmail.com>
---
dlls/msado15/command.c | 1 +
dlls/msado15/connection.c | 83 ++++++++++++++++++++++------------
dlls/msado15/main.c | 1 +
dlls/msado15/msado15_private.h | 2 +
dlls/msado15/stream.c | 1 +
5 files changed, 58 insertions(+), 30 deletions(-)
diff --git a/dlls/msado15/command.c b/dlls/msado15/command.c
index d19108a1a25..9a56ced25ac 100644
--- a/dlls/msado15/command.c
+++ b/dlls/msado15/command.c
@@ -20,6 +20,7 @@
#include "winbase.h"
#define COBJMACROS
#include "objbase.h"
+#include "msdasc.h"
#include "msado15_backcompat.h"
#include "wine/debug.h"
diff --git a/dlls/msado15/connection.c b/dlls/msado15/connection.c
index 500be033199..d55c0d18a35 100644
--- a/dlls/msado15/connection.c
+++ b/dlls/msado15/connection.c
@@ -264,61 +264,90 @@ static HRESULT WINAPI connection_Close( _Connection *iface )
return S_OK;
}
-static HRESULT WINAPI connection_Execute( _Connection *iface, BSTR command, VARIANT *records_affected,
- LONG options, _Recordset **record_set )
+HRESULT create_command_text(IUnknown *session, BSTR command, ICommandText **cmd_text)
{
- struct connection *connection = impl_from_Connection( iface );
HRESULT hr;
IOpenRowset *openrowset;
- IDBCreateCommand *create_command = NULL;
- ICommand *cmd = NULL;
- ICommandText *comand_text = NULL;
- DBROWCOUNT affected;
- IUnknown *rowset = NULL;
- _Recordset *recordset = NULL;
- ADORecordsetConstruction *construct;
+ ICommandText *command_text;
+ ICommand *cmd;
+ IDBCreateCommand *create_command;
- FIXME( "%p, %s, %p, 0x%08x, %p Semi-stub\n", iface, debugstr_w(command), records_affected, options, record_set );
-
- if (connection->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed );
-
- hr = IUnknown_QueryInterface(connection->session, &IID_IOpenRowset, (void**)&openrowset);
+ hr = IUnknown_QueryInterface(session, &IID_IOpenRowset, (void**)&openrowset);
if (FAILED(hr))
return hr;
hr = IOpenRowset_QueryInterface(openrowset, &IID_IDBCreateCommand, (void**)&create_command);
+ IOpenRowset_Release(openrowset);
if (FAILED(hr))
- goto done;
+ return hr;
hr = IDBCreateCommand_CreateCommand(create_command, NULL, &IID_IUnknown, (IUnknown **)&cmd);
+ IDBCreateCommand_Release(create_command);
if (FAILED(hr))
- goto done;
+ return hr;
- hr = ICommand_QueryInterface(cmd, &IID_ICommandText, (void**)&comand_text);
+ hr = ICommand_QueryInterface(cmd, &IID_ICommandText, (void**)&command_text);
+ ICommand_Release(cmd);
if (FAILED(hr))
{
FIXME("Currently only ICommandText interface is support\n");
- goto done;
+ return hr;
+ }
+
+ hr = ICommandText_SetCommandText(command_text, &DBGUID_DEFAULT, command);
+ if (FAILED(hr))
+ {
+ ICommandText_Release(command_text);
+ return hr;
}
- hr = ICommandText_SetCommandText(comand_text, &DBGUID_DEFAULT, command);
+ *cmd_text = command_text;
+
+ return S_OK;
+}
+
+static HRESULT WINAPI connection_Execute( _Connection *iface, BSTR command, VARIANT *records_affected,
+ LONG options, _Recordset **record_set )
+{
+ struct connection *connection = impl_from_Connection( iface );
+ HRESULT hr;
+ ICommandText *comand_text;
+ DBROWCOUNT affected;
+ IUnknown *rowset;
+ _Recordset *recordset;
+ ADORecordsetConstruction *construct;
+
+ FIXME( "%p, %s, %p, 0x%08x, %p Semi-stub\n", iface, debugstr_w(command), records_affected, options, record_set );
+
+ if (connection->state == adStateClosed) return MAKE_ADO_HRESULT( adErrObjectClosed );
+
+ hr = create_command_text(connection->session, command, &comand_text);
if (FAILED(hr))
- goto done;
+ return hr;
hr = ICommandText_Execute(comand_text, NULL, &IID_IUnknown, NULL, &affected, &rowset);
+ ICommandText_Release(comand_text);
if (FAILED(hr))
- goto done;
+ return hr;
hr = Recordset_create( (void**)&recordset);
if (FAILED(hr))
- goto done;
+ {
+ IUnknown_Release(rowset);
+ return hr;
+ }
hr = _Recordset_QueryInterface(recordset, &IID_ADORecordsetConstruction, (void**)&construct);
if (FAILED(hr))
- goto done;
+ {
+ IUnknown_Release(rowset);
+ _Recordset_Release(recordset);
+ return hr;
+ }
ADORecordsetConstruction_put_Rowset(construct, rowset);
ADORecordsetConstruction_Release(construct);
+ IUnknown_Release(rowset);
if (records_affected)
{
@@ -329,12 +358,6 @@ static HRESULT WINAPI connection_Execute( _Connection *iface, BSTR command, VARI
_Recordset_put_CursorLocation(recordset, connection->location);
*record_set = recordset;
-done:
- if (rowset) IUnknown_Release(rowset);
- if (comand_text) ICommandText_Release(comand_text);
- if (cmd) ICommand_Release(cmd);
- if (create_command) IDBCreateCommand_Release(create_command);
- if (openrowset) IOpenRowset_Release(openrowset);
return hr;
}
diff --git a/dlls/msado15/main.c b/dlls/msado15/main.c
index 770a02fc59d..0b8de1f9117 100644
--- a/dlls/msado15/main.c
+++ b/dlls/msado15/main.c
@@ -22,6 +22,7 @@
#define COBJMACROS
#include "objbase.h"
#include "rpcproxy.h"
+#include "msdasc.h"
#include "msado15_backcompat.h"
#include "wine/debug.h"
diff --git a/dlls/msado15/msado15_private.h b/dlls/msado15/msado15_private.h
index f6c60f0304c..dd98c382e2b 100644
--- a/dlls/msado15/msado15_private.h
+++ b/dlls/msado15/msado15_private.h
@@ -26,6 +26,8 @@ HRESULT Connection_create( void ** ) DECLSPEC_HIDDEN;
HRESULT Recordset_create( void ** ) DECLSPEC_HIDDEN;
HRESULT Stream_create( void ** ) DECLSPEC_HIDDEN;
+HRESULT create_command_text(IUnknown *session, BSTR command, ICommandText **cmd_text) DECLSPEC_HIDDEN;
+
static inline void *heap_realloc_zero( void *mem, SIZE_T len )
{
if (!mem) return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, len );
diff --git a/dlls/msado15/stream.c b/dlls/msado15/stream.c
index c6add70b1bc..b40f664dcf1 100644
--- a/dlls/msado15/stream.c
+++ b/dlls/msado15/stream.c
@@ -21,6 +21,7 @@
#include "winbase.h"
#define COBJMACROS
#include "objbase.h"
+#include "msdasc.h"
#include "msado15_backcompat.h"
#include "wine/debug.h"
--
2.30.0
2
1
On Mon, 22 Feb 2021, Marvin wrote:
> Hi,
>
> While running your changed tests, I think I found new failures.
> Being a bot and all I'm not very good at pattern recognition, so I might be
> wrong, but could you please double-check?
>
> Full results can be found at:
> https://testbot.winehq.org/JobDetails.pl?Key=85981
So yes, this patch breaks creating the wineprefix in the
windows-on-windows case. Per the TestBot log:
+ time /home/winetest/tools/testbot/var/../var/wine-wow32/wine reg.exe ADD HKCU\Software\Wine\WineDbg /v ShowCrashDialog /t REG_DWORD /d 0
wine: created the configuration directory '/home/winetest/tools/testbot/var/../var/wineprefix-wow32'
0024:err:environ:run_wineboot failed to start wineboot c00000e5
[...]
Error: Mount manager not running, most likely your WINEPREFIX wasn't created correctly.
A bisect points to the a8856381ed9a commit which confirms this.
I tweaked the debiant2 configuration so patches sent to the mailing list
are not tested in the wow32/wow64 configurations until this is resolved.
--
Francois Gouget <fgouget(a)codeweavers.com>
2
1
Signed-off-by: Yeshun Ye <yeyeshun(a)uniontech.com>
---
dlls/iphlpapi/tests/iphlpapi.c | 79 ++++++++++++++++++++++++++++++++++
1 file changed, 79 insertions(+)
diff --git a/dlls/iphlpapi/tests/iphlpapi.c b/dlls/iphlpapi/tests/iphlpapi.c
index 358084fde68..44ead2580bf 100644
--- a/dlls/iphlpapi/tests/iphlpapi.c
+++ b/dlls/iphlpapi/tests/iphlpapi.c
@@ -2338,6 +2338,84 @@ static void test_NotifyUnicastIpAddressChange(void)
ok(!CloseHandle(handle), "CloseHandle() succeeded.\n");
}
+static void test_GetAdaptersInfo_AdapterName(void)
+{
+ DWORD apiReturn;
+ ULONG size = 0;
+ ULONG family = AF_UNSPEC;
+ ULONG flags = GAA_FLAG_INCLUDE_PREFIX;
+
+ apiReturn = GetAdaptersInfo(NULL, NULL);
+ if (apiReturn == ERROR_NOT_SUPPORTED) {
+ skip("GetAdaptersInfo is not supported\n");
+ return;
+ }
+ apiReturn = GetAdaptersAddresses(0, 0, NULL, NULL, NULL);
+ if (apiReturn == ERROR_NOT_SUPPORTED) {
+ skip("GetAdaptersInfo is not supported\n");
+ return;
+ }
+ apiReturn = GetAdaptersAddresses(family, flags, 0, 0, &size);
+ ok(apiReturn == ERROR_NO_DATA || apiReturn == ERROR_BUFFER_OVERFLOW,
+ "GetAdaptersAddresses returned %d, expected ERROR_NO_DATA or ERROR_BUFFER_OVERFLOW\n",
+ apiReturn);
+ if (apiReturn == ERROR_NO_DATA)
+ ; /* no adapter's, that's okay */
+ else if (apiReturn == ERROR_BUFFER_OVERFLOW)
+ {
+ PIP_ADAPTER_ADDRESSES pAdapterAddress;
+ PIP_ADAPTER_ADDRESSES pCurrentAddress;
+
+ pAdapterAddress = HeapAlloc(GetProcessHeap(), 0, size);
+ apiReturn = GetAdaptersAddresses(family, flags, 0, pAdapterAddress, &size);
+ ok(apiReturn == NO_ERROR,
+ "GetAdaptersAddresses(family, flags, 0, pAdapterAddress, &size) returned %d, expected NO_ERROR\n",
+ apiReturn);
+
+ pCurrentAddress = pAdapterAddress;
+ while (pCurrentAddress)
+ {
+ if (pCurrentAddress->IfType == IF_TYPE_ETHERNET_CSMACD &&
+ ((pCurrentAddress->Flags & IP_ADAPTER_IPV4_ENABLED) || (pCurrentAddress->Flags & IP_ADAPTER_IPV6_ENABLED)))
+ {
+ ULONG len = 0;
+ PIP_ADAPTER_INFO ptr, buf;
+ char IpAddress[16] = {0};
+ char IpMask[16] = {0};
+
+ apiReturn = GetAdaptersInfo(NULL, &len);
+ ok(apiReturn == ERROR_BUFFER_OVERFLOW,
+ "GetAdaptersInfo returned %d, expected ERROR_NO_DATA or ERROR_BUFFER_OVERFLOW\n",
+ apiReturn);
+ buf = HeapAlloc(GetProcessHeap(), 0, len);
+ apiReturn = GetAdaptersInfo(buf, &len);
+ ok(apiReturn == NO_ERROR,
+ "GetAdaptersInfo(buf, &len) returned %d, expected NO_ERROR\n",
+ apiReturn);
+ ptr = buf;
+ while (ptr) {
+ if (strcmp(pCurrentAddress->AdapterName, ptr->AdapterName) == 0)
+ {
+ ok(ptr->IpAddressList.IpAddress.String[0], "A valid IP must be present\n");
+ ok(ptr->IpAddressList.IpMask.String[0], "A valid mask must be present\n");
+ trace("Adapter '%s', IP %s, Mask %s\n", ptr->AdapterName,
+ ptr->IpAddressList.IpAddress.String, ptr->IpAddressList.IpMask.String);
+ strcpy(IpAddress, ptr->IpAddressList.IpAddress.String);
+ strcpy(IpMask, ptr->IpAddressList.IpMask.String);
+ break;
+ }
+ ptr = ptr->Next;
+ }
+ todo_wine ok(IpAddress[0], "A valid IP must be present for adapter [%s]\n", pCurrentAddress->AdapterName);
+ todo_wine ok(IpMask[0], "A valid mask must be present for adapter [%s]\n", pCurrentAddress->AdapterName);
+ HeapFree(GetProcessHeap(), 0, buf);
+ }
+ pCurrentAddress = pCurrentAddress->Next;
+ }
+ HeapFree(GetProcessHeap(), 0, pAdapterAddress);
+ }
+}
+
START_TEST(iphlpapi)
{
@@ -2370,6 +2448,7 @@ START_TEST(iphlpapi)
test_GetUdp6Table();
test_ParseNetworkString();
test_NotifyUnicastIpAddressChange();
+ test_GetAdaptersInfo_AdapterName();
freeIPHlpApi();
}
}
--
2.20.1
2
5
Re: [PATCH] kernelbase: Add rudimentary mui resource support to loader.c
by Craig Schulstad Feb. 23, 2021
by Craig Schulstad Feb. 23, 2021
Feb. 23, 2021
Thank you for informing me.
On Mon, Feb 22, 2021 at 3:44 PM Marvin <testbot(a)winehq.org> wrote:
> Thank you for your contribution to Wine!
>
> This is an automated notification to let you know that your patch has
> been reviewed and its status set to "Rejected".
>
> This means that the patch has been rejected by a reviewer. You should
> have received a mail explaining why it was rejected. You need to fix
> the issue and resend the patch, or if you are convinced that your
> patch is good as is, you should reply to the rejection message with
> your counterarguments.
>
> If you do not understand the reason for this status, disagree with our
> assessment, or are simply not sure how to proceed next, please ask for
> clarification by replying to this email.
>
1
1
Feb. 22, 2021
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
Problematic field is 'url' which is only set on string duplication. Uninitialize pointer
then appears in traces like this:
0230:trace:mfplat:winegstreamer_stream_handler_create_object (0x2b3915e0 L"\8507\1829\8120" 0x2e1ea458 1 (nil) 0x4c9dfaf0 0x4c9dfae8)
and later is passed to heap_free().
dlls/winegstreamer/media_source.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/dlls/winegstreamer/media_source.c b/dlls/winegstreamer/media_source.c
index 32b4477ad88..caf1895a68c 100644
--- a/dlls/winegstreamer/media_source.c
+++ b/dlls/winegstreamer/media_source.c
@@ -1383,7 +1383,7 @@ static HRESULT WINAPI winegstreamer_stream_handler_BeginCreateObject(IMFByteStre
if (FAILED(hr = MFCreateAsyncResult(NULL, callback, state, &caller)))
return hr;
- context = heap_alloc(sizeof(*context));
+ context = heap_alloc_zero(sizeof(*context));
if (!context)
{
IMFAsyncResult_Release(caller);
--
2.30.0
1
0
Feb. 22, 2021
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/dwrite/main.c | 84 ++++++++++++++--------------------------
dlls/dwrite/tests/font.c | 1 -
2 files changed, 28 insertions(+), 57 deletions(-)
diff --git a/dlls/dwrite/main.c b/dlls/dwrite/main.c
index 40c82b6cd05..3b0505231bf 100644
--- a/dlls/dwrite/main.c
+++ b/dlls/dwrite/main.c
@@ -1551,76 +1551,48 @@ static HRESULT WINAPI dwritefactory4_TranslateColorGlyphRun(IDWriteFactory7 *ifa
}
static HRESULT compute_glyph_origins(DWRITE_GLYPH_RUN const *run, DWRITE_MEASURING_MODE measuring_mode,
- D2D1_POINT_2F baseline_origin, DWRITE_MATRIX const *transform, D2D1_POINT_2F *origins)
+ D2D1_POINT_2F baseline_origin, DWRITE_MATRIX const *transform, D2D1_POINT_2F *origins)
{
- IDWriteFontFace1 *fontface1 = NULL;
- DWRITE_FONT_METRICS metrics;
- FLOAT rtl_factor;
- HRESULT hr;
- UINT32 i;
+ struct dwrite_fontface *font_obj;
+ unsigned int i;
+ float advance;
- rtl_factor = run->bidiLevel & 1 ? -1.0f : 1.0f;
+ font_obj = unsafe_impl_from_IDWriteFontFace(run->fontFace);
- if (run->fontFace) {
- IDWriteFontFace_GetMetrics(run->fontFace, &metrics);
- if (FAILED(hr = IDWriteFontFace_QueryInterface(run->fontFace, &IID_IDWriteFontFace1, (void **)&fontface1)))
- WARN("Failed to get IDWriteFontFace1, %#x.\n", hr);
- }
+ for (i = 0; i < run->glyphCount; ++i)
+ {
+ origins[i] = baseline_origin;
- for (i = 0; i < run->glyphCount; i++) {
- FLOAT advance;
+ if (run->bidiLevel & 1)
+ {
+ advance = fontface_get_scaled_design_advance(font_obj, measuring_mode, run->fontEmSize,
+ 1.0f, transform, run->glyphIndices[i], run->isSideways);
- /* Use nominal advances if not provided by caller. */
- if (run->glyphAdvances)
- advance = rtl_factor * run->glyphAdvances[i];
- else {
- INT32 a;
+ origins[i].x -= advance;
- advance = 0.0f;
- switch (measuring_mode)
+ if (run->glyphOffsets)
{
- case DWRITE_MEASURING_MODE_NATURAL:
- if (SUCCEEDED(IDWriteFontFace1_GetDesignGlyphAdvances(fontface1, 1, run->glyphIndices + i, &a,
- run->isSideways)))
- advance = rtl_factor * get_scaled_advance_width(a, run->fontEmSize, &metrics);
- break;
- case DWRITE_MEASURING_MODE_GDI_CLASSIC:
- case DWRITE_MEASURING_MODE_GDI_NATURAL:
- if (SUCCEEDED(IDWriteFontFace1_GetGdiCompatibleGlyphAdvances(fontface1, run->fontEmSize,
- 1.0f, transform, measuring_mode == DWRITE_MEASURING_MODE_GDI_NATURAL,
- run->isSideways, 1, run->glyphIndices + i, &a)))
- advance = rtl_factor * floorf(a * run->fontEmSize / metrics.designUnitsPerEm + 0.5f);
- break;
- default:
- ;
+ origins[i].x -= run->glyphOffsets[i].advanceOffset;
+ origins[i].y -= run->glyphOffsets[i].ascenderOffset;
}
- }
- origins[i] = baseline_origin;
+ baseline_origin.x -= run->glyphAdvances ? run->glyphAdvances[i] : advance;
+ }
+ else
+ {
+ if (run->glyphOffsets)
+ {
+ origins[i].x += run->glyphOffsets[i].advanceOffset;
+ origins[i].y -= run->glyphOffsets[i].ascenderOffset;
+ }
- /* Apply offsets. */
- if (run->glyphOffsets) {
- FLOAT advanceoffset = rtl_factor * run->glyphOffsets[i].advanceOffset;
- FLOAT ascenderoffset = -run->glyphOffsets[i].ascenderOffset;
+ baseline_origin.x += run->glyphAdvances ? run->glyphAdvances[i] :
+ fontface_get_scaled_design_advance(font_obj, measuring_mode, run->fontEmSize, 1.0f, transform,
+ run->glyphIndices[i], run->isSideways);
- if (run->isSideways) {
- origins[i].x += ascenderoffset;
- origins[i].y += advanceoffset;
- }
- else {
- origins[i].x += advanceoffset;
- origins[i].y += ascenderoffset;
- }
}
-
- if (run->isSideways)
- baseline_origin.y += advance;
- else
- baseline_origin.x += advance;
}
- if (fontface1)
- IDWriteFontFace1_Release(fontface1);
return S_OK;
}
diff --git a/dlls/dwrite/tests/font.c b/dlls/dwrite/tests/font.c
index 872405b1639..d7ced109a2f 100644
--- a/dlls/dwrite/tests/font.c
+++ b/dlls/dwrite/tests/font.c
@@ -8468,7 +8468,6 @@ static void test_ComputeGlyphOrigins(void)
ok(hr == S_OK, "%u: failed to compute glyph origins, hr %#x.\n", i, hr);
for (j = 0; j < run.glyphCount; ++j)
{
- todo_wine_if(run.bidiLevel & 1)
ok(!memcmp(&origins[j], &expected_origins[j], sizeof(origins[j])),
"%u: unexpected origin[%u] (%f, %f) - (%f, %f).\n", i, j, origins[j].x, origins[j].y,
expected_origins[j].x, expected_origins[j].y);
--
2.30.0
1
3
Feb. 22, 2021
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/ntdll/unix/signal_x86_64.c | 5 ++++-
dlls/ntdll/unix/system.c | 6 ++++++
include/winternl.h | 1 +
tools/winebuild/import.c | 13 ++++++++++++-
4 files changed, 23 insertions(+), 2 deletions(-)
2
1
Feb. 22, 2021
---
dlls/msvcirt/msvcirt.c | 157 ++++++++++++++
dlls/msvcirt/msvcirt.spec | 52 ++---
dlls/msvcirt/tests/msvcirt.c | 397 ++++++++++++++++++++++++++++++++++-
dlls/msvcrt20/msvcrt20.spec | 52 ++---
dlls/msvcrt40/msvcrt40.spec | 52 ++---
5 files changed, 625 insertions(+), 85 deletions(-)
diff --git a/dlls/msvcirt/msvcirt.c b/dlls/msvcirt/msvcirt.c
index a8f162e7f702..4d0dc1521f68 100644
--- a/dlls/msvcirt/msvcirt.c
+++ b/dlls/msvcirt/msvcirt.c
@@ -4811,6 +4811,66 @@ stdiobuf* __thiscall stdiostream_rdbuf(const iostream *this)
return (stdiobuf*) istream_get_ios(&this->base1)->sb;
}
+/* ??0fstream@@QAE(a)ABV0@@Z */
+/* ??0fstream@@QEAA(a)AEBV0@@Z */
+DEFINE_THISCALL_WRAPPER(fstream_copy_ctor, 12)
+iostream* __thiscall fstream_copy_ctor(iostream *this, const iostream *copy, BOOL virt_init)
+{
+ TRACE("(%p %p %d)\n", this, copy, virt_init);
+ iostream_internal_copy_ctor(this, copy, &MSVCP_fstream_vtable, virt_init);
+ return this;
+}
+
+/* ??0fstream@@QAE(a)HPADH@Z */
+/* ??0fstream@@QEAA(a)HPEADH@Z */
+DEFINE_THISCALL_WRAPPER(fstream_buffer_ctor, 20)
+iostream* __thiscall fstream_buffer_ctor(iostream *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) {
+ FIXME("out of memory\n");
+ return NULL;
+ }
+
+ filebuf_fd_reserve_ctor(fb, fd, buffer, length);
+
+ iostream_internal_sb_ctor(this, &fb->base, &MSVCP_fstream_vtable, virt_init);
+
+ base = istream_get_ios(&this->base1);
+ base->delbuf = 1;
+
+ return this;
+}
+
+/* ??0fstream@@QAE(a)H@Z */
+/* ??0fstream@@QEAA(a)H@Z */
+DEFINE_THISCALL_WRAPPER(fstream_fd_ctor, 12)
+iostream* __thiscall fstream_fd_ctor(iostream *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) {
+ FIXME("out of memory\n");
+ return NULL;
+ }
+
+ filebuf_fd_ctor(fb, fd);
+
+ iostream_internal_sb_ctor(this, &fb->base, &MSVCP_fstream_vtable, virt_init);
+
+ base = istream_get_ios(&this->base1);
+ base->delbuf = 1;
+
+ return this;
+}
+
/* ??0fstream@@QAE(a)PBDHH@Z */
/* ??0fstream@@QEAA(a)PEBDHH@Z */
DEFINE_THISCALL_WRAPPER(fstream_open_ctor, 20)
@@ -4838,6 +4898,103 @@ iostream* __thiscall fstream_open_ctor(iostream *this, const char *name, ios_ope
return this;
}
+/* ??0fstream@@QAE(a)XZ */
+/* ??0fstream@@QEAA(a)XZ */
+DEFINE_THISCALL_WRAPPER(fstream_ctor, 8)
+iostream* __thiscall fstream_ctor(iostream *this, BOOL virt_init)
+{
+ return fstream_fd_ctor(this, -1, virt_init);
+}
+
+/* ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ */
+/* ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ */
+DEFINE_THISCALL_WRAPPER(fstream_rdbuf, 4)
+filebuf* __thiscall fstream_rdbuf(const iostream *this)
+{
+ TRACE("(%p)\n", this);
+ return (filebuf*) istream_get_ios(&this->base1)->sb;
+}
+
+/* ?fd(a)fstream@@QBEHXZ */
+/* ?fd(a)fstream@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(fstream_fd, 4)
+filedesc __thiscall fstream_fd(iostream *this)
+{
+ TRACE("(%p)\n", this);
+ return filebuf_fd(fstream_rdbuf(this));
+}
+
+/* ?attach(a)fstream@@QAEXH(a)Z */
+/* ?attach(a)fstream@@QEAAXH(a)Z */
+DEFINE_THISCALL_WRAPPER(fstream_attach, 8)
+void __thiscall fstream_attach(iostream *this, filedesc fd)
+{
+ ios *base = istream_get_ios(&this->base1);
+ TRACE("(%p %d)\n", this, fd);
+ if (filebuf_attach(fstream_rdbuf(this), fd) == NULL)
+ ios_clear(base, base->state | IOSTATE_failbit);
+}
+
+/* ?close(a)fstream@@QAEXXZ */
+/* ?close(a)fstream@@QEAAXXZ */
+DEFINE_THISCALL_WRAPPER(fstream_close, 4)
+void __thiscall fstream_close(iostream *this)
+{
+ ios *base = istream_get_ios(&this->base1);
+ TRACE("(%p)\n", this);
+ if (filebuf_close(fstream_rdbuf(this)) == NULL)
+ ios_clear(base, base->state | IOSTATE_failbit);
+ else
+ ios_clear(base, IOSTATE_goodbit);
+}
+
+/* ?is_open(a)fstream@@QBEHXZ */
+/* ?is_open(a)fstream@@QEBAHXZ */
+DEFINE_THISCALL_WRAPPER(fstream_is_open, 4)
+int __thiscall fstream_is_open(const iostream *this)
+{
+ TRACE("(%p)\n", this);
+ return filebuf_is_open(fstream_rdbuf(this));
+}
+
+/* ?open(a)fstream@@QAEXPBDHH(a)Z */
+/* ?open(a)fstream@@QEAAXPEBDHH(a)Z */
+DEFINE_THISCALL_WRAPPER(fstream_open, 16)
+void __thiscall fstream_open(iostream *this, const char *name, ios_open_mode mode, int protection)
+{
+ ios *base = istream_get_ios(&this->base1);
+ TRACE("(%p %s %d %d)\n", this, name, mode, protection);
+ if (filebuf_open(fstream_rdbuf(this), name, mode|OPENMODE_out, protection) == NULL)
+ ios_clear(base, base->state | IOSTATE_failbit);
+}
+
+/* ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z */
+/* ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z */
+DEFINE_THISCALL_WRAPPER(fstream_setbuf, 12)
+streambuf* __thiscall fstream_setbuf(iostream *this, char *buffer, int length)
+{
+ ios *base = istream_get_ios(&this->base1);
+ filebuf* fb = fstream_rdbuf(this);
+
+ TRACE("(%p %p %d)\n", this, buffer, length);
+
+ if (filebuf_is_open(fb)) {
+ ios_clear(base, base->state | IOSTATE_failbit);
+ return NULL;
+ }
+
+ return filebuf_setbuf(fb, buffer, length);
+}
+
+/* ?setmode(a)fstream@@QAEHH(a)Z */
+/* ?setmode(a)fstream@@QEAAHH(a)Z */
+DEFINE_THISCALL_WRAPPER(fstream_setmode, 8)
+int __thiscall fstream_setmode(iostream *this, int mode)
+{
+ TRACE("(%p %d)\n", this, mode);
+ return filebuf_setmode(fstream_rdbuf(this), mode);
+}
+
/* ??0Iostream_init@@QAE(a)AAVios@@H(a)Z */
/* ??0Iostream_init@@QEAA(a)AEAVios@@H(a)Z */
DEFINE_THISCALL_WRAPPER(Iostream_init_ios_ctor, 12)
diff --git a/dlls/msvcirt/msvcirt.spec b/dlls/msvcirt/msvcirt.spec
index 804300f1a3ea..3d943e8a5c45 100644
--- a/dlls/msvcirt/msvcirt.spec
+++ b/dlls/msvcirt/msvcirt.spec
@@ -16,16 +16,16 @@
@ cdecl -arch=win64 ??0filebuf@@QEAA(a)HPEADH@Z(ptr long ptr long) filebuf_fd_reserve_ctor
@ thiscall -arch=win32 ??0filebuf@@QAE(a)XZ(ptr) filebuf_ctor
@ cdecl -arch=win64 ??0filebuf@@QEAA(a)XZ(ptr) filebuf_ctor
-@ stub -arch=win32 ??0fstream@@QAE(a)ABV0@@Z # __thiscall fstream::fstream(class fstream const &)
-@ stub -arch=win64 ??0fstream@@QEAA(a)AEBV0@@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)H@Z # __thiscall fstream::fstream(int)
-@ stub -arch=win64 ??0fstream@@QEAA(a)H@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)HPADH@Z # __thiscall fstream::fstream(int,char *,int)
-@ stub -arch=win64 ??0fstream@@QEAA(a)HPEADH@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)ABV0@@Z(ptr ptr long) fstream_copy_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)AEBV0@@Z(ptr ptr long) fstream_copy_ctor
+@ thiscall -arch=win32 ??0fstream@@QAE(a)H@Z(ptr long long) fstream_fd_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)H@Z(ptr long long) fstream_fd_ctor
+@ thiscall -arch=win32 ??0fstream@@QAE(a)HPADH@Z(ptr long ptr long long) fstream_buffer_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)HPEADH@Z(ptr long ptr long long) fstream_buffer_ctor
@ thiscall -arch=win32 ??0fstream@@QAE(a)PBDHH@Z(ptr str long long long) fstream_open_ctor
@ cdecl -arch=win64 ??0fstream@@QEAA(a)PEBDHH@Z(ptr str long long long) fstream_open_ctor
-@ stub -arch=win32 ??0fstream@@QAE(a)XZ # __thiscall fstream::fstream(void)
-@ stub -arch=win64 ??0fstream@@QEAA(a)XZ
+@ thiscall -arch=win32 ??0fstream@@QAE(a)XZ(ptr long) fstream_ctor
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)XZ(ptr long) fstream_ctor
@ 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
@@ -176,8 +176,8 @@
@ cdecl -arch=win64 ??4exception@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) MSVCP_exception_assign
@ thiscall -arch=win32 ??4filebuf@@QAEAAV0(a)ABV0@@Z(ptr ptr) filebuf_assign
@ 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
+@ thiscall -arch=win32 ??4fstream@@QAEAAV0(a)AAV0@@Z(ptr ptr) iostream_assign
+@ cdecl -arch=win64 ??4fstream@@QEAAAEAV0(a)AEAV0@@Z(ptr ptr) iostream_assign
@ 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
@@ -404,8 +404,8 @@
@ cdecl -arch=win64 ?allocate(a)streambuf@@IEAAHXZ(ptr) streambuf_allocate
@ thiscall -arch=win32 ?attach(a)filebuf@@QAEPAV1(a)H@Z(ptr long) filebuf_attach
@ 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
+@ thiscall -arch=win32 ?attach(a)fstream@@QAEXH(a)Z(ptr long) fstream_attach
+@ cdecl -arch=win64 ?attach(a)fstream@@QEAAXH(a)Z(ptr long) fstream_attach
@ 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
@ thiscall -arch=win32 ?attach(a)ofstream@@QAEXH(a)Z(ptr long) ofstream_attach
@@ -426,8 +426,8 @@
@ extern ?clog@@3Vostream_withassign@@A MSVCP_clog
@ thiscall -arch=win32 ?close(a)filebuf@@QAEPAV1(a)XZ(ptr) filebuf_close
@ 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
+@ thiscall -arch=win32 ?close(a)fstream@@QAEXXZ(ptr) fstream_close
+@ cdecl -arch=win64 ?close(a)fstream@@QEAAXXZ(ptr) fstream_close
@ thiscall -arch=win32 ?close(a)ifstream@@QAEXXZ(ptr) ifstream_close
@ cdecl -arch=win64 ?close(a)ifstream@@QEAAXXZ(ptr) ifstream_close
@ thiscall -arch=win32 ?close(a)ofstream@@QAEXXZ(ptr) ofstream_close
@@ -470,8 +470,8 @@
@ cdecl -arch=win64 ?fail(a)ios@@QEBAHXZ(ptr) ios_fail
@ thiscall -arch=win32 ?fd(a)filebuf@@QBEHXZ(ptr) filebuf_fd
@ 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
+@ thiscall -arch=win32 ?fd(a)fstream@@QBEHXZ(ptr) fstream_fd
+@ cdecl -arch=win64 ?fd(a)fstream@@QEBAHXZ(ptr) fstream_fd
@ thiscall -arch=win32 ?fd(a)ifstream@@QBEHXZ(ptr) ifstream_fd
@ cdecl -arch=win64 ?fd(a)ifstream@@QEBAHXZ(ptr) ifstream_fd
@ thiscall -arch=win32 ?fd(a)ofstream@@QBEHXZ(ptr) ofstream_fd
@@ -539,8 +539,8 @@
@ cdecl -arch=win64 ?ipfx(a)istream@@QEAAHH(a)Z(ptr long) istream_ipfx
@ thiscall -arch=win32 ?is_open(a)filebuf@@QBEHXZ(ptr) filebuf_is_open
@ 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
+@ thiscall -arch=win32 ?is_open(a)fstream@@QBEHXZ(ptr) fstream_is_open
+@ cdecl -arch=win64 ?is_open(a)fstream@@QEBAHXZ(ptr) fstream_is_open
@ thiscall -arch=win32 ?is_open(a)ifstream@@QBEHXZ(ptr) ifstream_is_open
@ cdecl -arch=win64 ?is_open(a)ifstream@@QEBAHXZ(ptr) ifstream_is_open
@ thiscall -arch=win32 ?is_open(a)ofstream@@QBEHXZ(ptr) ofstream_is_open
@@ -564,8 +564,8 @@
@ cdecl -arch=win64 ?oct@@YAAEAVios@@AEAV1@@Z(ptr) ios_oct
@ thiscall -arch=win32 ?open(a)filebuf@@QAEPAV1(a)PBDHH@Z(ptr str long long) filebuf_open
@ 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
+@ thiscall -arch=win32 ?open(a)fstream@@QAEXPBDHH(a)Z(ptr str long long) fstream_open
+@ cdecl -arch=win64 ?open(a)fstream@@QEAAXPEBDHH(a)Z(ptr str long long) fstream_open
@ 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
@ thiscall -arch=win32 ?open(a)ofstream@@QAEXPBDHH(a)Z(ptr str long long) ofstream_open
@@ -613,8 +613,8 @@
@ cdecl -arch=win64 ?putback(a)istream@@QEAAAEAV1(a)D@Z(ptr long) istream_putback
@ thiscall -arch=win32 ?pword(a)ios@@QBEAAPAXH(a)Z(ptr long) ios_pword
@ 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
+@ thiscall -arch=win32 ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ(ptr) fstream_rdbuf
+@ cdecl -arch=win64 ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ(ptr) fstream_rdbuf
@ 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
@@ -661,8 +661,8 @@
@ cdecl -arch=win64 ?setb(a)streambuf@@IEAAXPEAD0H(a)Z(ptr ptr ptr long) streambuf_setb
@ thiscall -arch=win32 ?setbuf(a)filebuf@@UAEPAVstreambuf@@PADH(a)Z(ptr ptr long) filebuf_setbuf
@ 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
+@ thiscall -arch=win32 ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) fstream_setbuf
+@ cdecl -arch=win64 ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) fstream_setbuf
@ 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
@ thiscall -arch=win32 ?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) ofstream_setbuf
@@ -683,8 +683,8 @@
@ cdecl -arch=win64 ?setlock(a)streambuf@@QEAAXXZ(ptr) streambuf_setlock
@ thiscall -arch=win32 ?setmode(a)filebuf@@QAEHH(a)Z(ptr long) filebuf_setmode
@ 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
+@ thiscall -arch=win32 ?setmode(a)fstream@@QAEHH(a)Z(ptr long) fstream_setmode
+@ cdecl -arch=win64 ?setmode(a)fstream@@QEAAHH(a)Z(ptr long) fstream_setmode
@ 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
@ thiscall -arch=win32 ?setmode(a)ofstream@@QAEHH(a)Z(ptr long) ofstream_setmode
diff --git a/dlls/msvcirt/tests/msvcirt.c b/dlls/msvcirt/tests/msvcirt.c
index 8ee880480a04..21d513c0fd90 100644
--- a/dlls/msvcirt/tests/msvcirt.c
+++ b/dlls/msvcirt/tests/msvcirt.c
@@ -455,9 +455,21 @@ static void (*__thiscall p_stdiostream_vbase_dtor)(iostream*);
static iostream* (*__thiscall p_stdiostream_assign)(iostream*, const iostream*);
/* fstream */
-static iostream* (*__thiscall p_fstream_open_ctor)(iostream*, const char*, ios_open_mode, int, BOOL);
+static iostream* (*__thiscall p_fstream_copy_ctor)(iostream*, const iostream*, BOOL);
+static iostream* (*__thiscall p_fstream_buffer_ctor)(iostream*, filedesc, char*, int, BOOL);
+static iostream* (*__thiscall p_fstream_fd_ctor)(iostream*, filedesc fd, BOOL virt_init);
+static iostream* (*__thiscall p_fstream_open_ctor)(iostream*, const char *name, ios_open_mode, int, BOOL);
+static iostream* (*__thiscall p_fstream_ctor)(iostream*, BOOL);
static void (*__thiscall p_fstream_dtor)(ios*);
static void (*__thiscall p_fstream_vbase_dtor)(iostream*);
+static void (*__thiscall p_fstream_attach)(iostream*, filedesc);
+static void (*__thiscall p_fstream_close)(iostream*);
+static filedesc (*__thiscall p_fstream_fd)(iostream*);
+static int (*__thiscall p_fstream_is_open)(const iostream*);
+static void (*__thiscall p_fstream_open)(iostream*, const char*, ios_open_mode, int);
+static filebuf* (*__thiscall p_fstream_rdbuf)(const iostream*);
+static streambuf* (*__thiscall p_fstream_setbuf)(iostream*, char*, int);
+static int (*__thiscall p_fstream_setmode)(iostream*, int);
/* Iostream_init */
static void* (*__thiscall p_Iostream_init_ios_ctor)(void*, ios*, int);
@@ -794,9 +806,21 @@ static BOOL init(void)
SET(p_stdiostream_vbase_dtor, "??_Dstdiostream@@QEAAXXZ");
SET(p_stdiostream_assign, "??4stdiostream@@QEAAAEAV0(a)AEAV0@@Z");
+ SET(p_fstream_copy_ctor, "??0fstream@@QEAA(a)AEBV0@@Z");
+ SET(p_fstream_buffer_ctor, "??0fstream@@QEAA(a)HPEADH@Z");
+ SET(p_fstream_fd_ctor, "??0fstream@@QEAA(a)H@Z");
SET(p_fstream_open_ctor, "??0fstream@@QEAA(a)PEBDHH@Z");
+ SET(p_fstream_ctor, "??0fstream@@QEAA(a)XZ");
SET(p_fstream_dtor, "??1fstream@@UEAA(a)XZ");
SET(p_fstream_vbase_dtor, "??_Dfstream@@QEAAXXZ");
+ SET(p_fstream_attach, "?attach(a)fstream@@QEAAXH(a)Z");
+ SET(p_fstream_close, "?close(a)fstream@@QEAAXXZ");
+ SET(p_fstream_fd, "?fd(a)fstream@@QEBAHXZ");
+ SET(p_fstream_is_open, "?is_open(a)fstream@@QEBAHXZ");
+ SET(p_fstream_open, "?open(a)fstream@@QEAAXPEBDHH(a)Z");
+ SET(p_fstream_rdbuf, "?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ");
+ SET(p_fstream_setbuf, "?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z");
+ SET(p_fstream_setmode, "?setmode(a)fstream@@QEAAHH(a)Z");
SET(p_Iostream_init_ios_ctor, "??0Iostream_init@@QEAA(a)AEAVios@@H(a)Z");
@@ -1045,9 +1069,21 @@ static BOOL init(void)
SET(p_stdiostream_vbase_dtor, "??_Dstdiostream@@QAEXXZ");
SET(p_stdiostream_assign, "??4stdiostream@@QAEAAV0(a)AAV0@@Z");
+ SET(p_fstream_copy_ctor, "??0fstream@@QAE(a)ABV0@@Z");
+ SET(p_fstream_fd_ctor, "??0fstream@@QAE(a)H@Z");
+ SET(p_fstream_buffer_ctor, "??0fstream@@QAE(a)HPADH@Z");
SET(p_fstream_open_ctor, "??0fstream@@QAE(a)PBDHH@Z");
+ SET(p_fstream_ctor, "??0fstream@@QAE(a)XZ");
SET(p_fstream_dtor, "??1fstream@@UAE(a)XZ");
SET(p_fstream_vbase_dtor, "??_Dfstream@@QAEXXZ");
+ SET(p_fstream_attach, "?attach(a)fstream@@QAEXH(a)Z");
+ SET(p_fstream_close, "?close(a)fstream@@QAEXXZ");
+ SET(p_fstream_fd, "?fd(a)fstream@@QBEHXZ");
+ SET(p_fstream_is_open, "?is_open(a)fstream@@QBEHXZ");
+ SET(p_fstream_open, "?open(a)fstream@@QAEXPBDHH(a)Z");
+ SET(p_fstream_rdbuf, "?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ");
+ SET(p_fstream_setbuf, "?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z");
+ SET(p_fstream_setmode, "?setmode(a)fstream@@QAEHH(a)Z");
SET(p_Iostream_init_ios_ctor, "??0Iostream_init@@QAE(a)AAVios@@H(a)Z");
@@ -4651,7 +4687,7 @@ static void test_ofstream(void)
call_func5(p_ofstream_buffer_ctor, &ofs, -1, NULL, 0, TRUE);
ok(ofs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", ofs.base_ios.sb->base);
ok(ofs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", ofs.base_ios.sb->ebuf);
- ok(ofs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", pfb->base.unbuffered);
+ ok(ofs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", ofs.base_ios.sb->unbuffered);
ok(ofs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", ofs.base_ios.sb->allocated);
psb = call_func3(p_ofstream_setbuf, &ofs, buffer, ARRAY_SIZE(buffer));
@@ -8341,21 +8377,368 @@ static void test_std_streams(void)
static void test_fstream(void)
{
- iostream fs, *pfs;
+ const char *filename = "fstream_test";
+ iostream fs, fs_copy, *pfs;
+ char buffer[64];
+ streambuf *psb;
filebuf *pfb;
ostream *pos;
istream *pis;
- int i;
char st[8];
- const char *filename = "fstream_test";
+ int i, ret, fd;
+
+ memset(&fs, 0xab, sizeof(iostream));
+
+ /* constructors/destructors */
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base1.extract_delim == 0, "expected 0 got %d\n", fs.base1.extract_delim);
+ ok(fs.base1.count == 0, "expected 0 got %d\n", fs.base1.count);
+ ok(fs.base2.unknown == 0, "expected 0 got %d\n", fs.base2.unknown);
+ ok(fs.base_ios.sb != NULL, "expected not %p got %p\n", NULL, fs.base_ios.sb);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.tie == NULL, "expected %p got %p\n", NULL, fs.base_ios.tie);
+ ok(fs.base_ios.flags == FLAGS_skipws, "expected %x got %x\n", FLAGS_skipws, fs.base_ios.flags);
+ ok(fs.base_ios.precision == 6, "expected 6 got %d\n", fs.base_ios.precision);
+ ok(fs.base_ios.fill == ' ', "expected 32 got %d\n", fs.base_ios.fill);
+ ok(fs.base_ios.width == 0, "expected 0 got %d\n", fs.base_ios.width);
+ ok(fs.base_ios.do_lock == -1, "expected -1 got %d\n", fs.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_fstream_vbase_dtor, &fs);
+
+ pfs = call_func3(p_fstream_fd_ctor, &fs, 42, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.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);
+
+ pfs = call_func3(p_fstream_copy_ctor, &fs_copy, &fs, TRUE);
+ pfb = (filebuf*) fs_copy.base_ios.sb;
+ ok(pfs == &fs_copy, "wrong return, expected %p got %p\n", &fs_copy, pfs);
+ ok(fs_copy.base_ios.sb == fs.base_ios.sb, "expected shared streambuf\n");
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fs_copy.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs_copy.base_ios.state);
+
+ call_func1(p_fstream_vbase_dtor, &fs_copy);
+ call_func1(p_fstream_dtor, &fs.base_ios);
+
+ pfs = call_func5(p_fstream_buffer_ctor, &fs, 53, buffer, ARRAY_SIZE(buffer), TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ 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_fstream_dtor, &fs.base_ios);
+
+ pfs = call_func5(p_fstream_buffer_ctor, &fs, 64, NULL, 0, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ 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_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ 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_fstream_vbase_dtor, &fs);
+ ok(_close(fd) == -1, "expected fstream to close opened file\n");
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(fs.base_ios.delbuf == 1, "expected 1 got %d\n", fs.base_ios.delbuf);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ 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_fstream_vbase_dtor, &fs);
+ ok(_close(fd) == -1, "expected fstream to close opened file\n");
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ /* setbuf */
+ call_func5(p_fstream_buffer_ctor, &fs, -1, NULL, 0, TRUE);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ call_func2(p_fstream_ctor, &fs, TRUE);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer, "wrong buffer, expected %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer + 8, ARRAY_SIZE(buffer) - 8);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 8, "wrong buffer, expected %p got %p\n", buffer + 8, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer + 8, 0);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 8, "wrong buffer, expected %p got %p\n", buffer + 8, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, buffer + 4, ARRAY_SIZE(buffer) - 4);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 4, "wrong buffer, expected %p got %p\n", buffer + 4, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 5);
+ ok(psb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, psb);
+ ok(fs.base_ios.sb->base == buffer + 4, "wrong buffer, expected %p got %p\n", buffer + 4, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == buffer + ARRAY_SIZE(buffer), "wrong ebuf, expected %p got %p\n", buffer + ARRAY_SIZE(buffer), fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ /* setbuf - seems to be a nop and always return NULL in those other cases */
+ pfs = call_func5(p_fstream_buffer_ctor, &fs, 42, NULL, 0, TRUE);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base == NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf == NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 1, "wrong unbuffered value, expected 1 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 0, "wrong allocated value, expected 0 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf != NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->base != buffer, "wrong base value, expected not %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, NULL, 0);
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->ebuf != NULL, "wrong ebuf value, expected NULL got %p\n", fs.base_ios.sb->ebuf);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+
+ fs.base_ios.state = IOSTATE_eofbit;
+ psb = call_func3(p_fstream_setbuf, &fs, buffer, ARRAY_SIZE(buffer));
+ ok(psb == NULL, "wrong return, expected NULL got %p\n", psb);
+ ok(fs.base_ios.sb->base != NULL, "wrong base value, expected NULL got %p\n", fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->base != buffer, "wrong base value, expected not %p got %p\n", buffer, fs.base_ios.sb->base);
+ ok(fs.base_ios.sb->unbuffered == 0, "wrong unbuffered value, expected 0 got %d\n", fs.base_ios.sb->unbuffered);
+ ok(fs.base_ios.sb->allocated == 1, "wrong allocated value, expected 1 got %d\n", fs.base_ios.sb->allocated);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ /* attach */
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ call_func2(p_fstream_attach, &fs, 42);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "attaching on vanilla stream set some state bits\n");
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ 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);
+ fs.base_ios.state = IOSTATE_eofbit;
+ call_func2(p_fstream_attach, &fs, 53);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "attaching on already setup stream did not set failbit\n");
+ ok(fd == 42, "wrong fd, expected 42 got %d\n", fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ /* fd */
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == -1, "wrong fd, expected -1 but got %d\n", fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_in, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == pfb->fd, "wrong fd, expected %d but got %d\n", pfb->fd, fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
+
+ pfs = call_func2(p_fstream_ctor, &fs, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == -1, "wrong fd, expected -1 but got %d\n", fd);
+ call_func1(p_fstream_vbase_dtor, &fs);
+
+ pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
+ pfb = (filebuf*) fs.base_ios.sb;
+ ok(pfs == &fs, "wrong return, expected %p got %p\n", &fs, pfs);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ok(fd == pfb->fd, "wrong fd, expected %d but got %d\n", pfb->fd, fd);
+
+ /* rdbuf */
+ pfb = (filebuf*) call_func1(p_fstream_rdbuf, &fs);
+ ok((streambuf*) pfb == fs.base_ios.sb, "wrong return, expected %p got %p\n", fs.base_ios.sb, pfb);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ /* setmode */
+ ret = (int) call_func2(p_fstream_setmode, &fs, filebuf_binary);
+ ok(ret == filebuf_text, "wrong return, expected %d got %d\n", filebuf_text, ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ret = (int) call_func2(p_fstream_setmode, &fs, filebuf_binary);
+ ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ret = (int) call_func2(p_fstream_setmode, &fs, filebuf_text);
+ ok(ret == filebuf_binary, "wrong return, expected %d got %d\n", filebuf_binary, ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+ ret = (int) call_func2(p_fstream_setmode, &fs, 0x9000);
+ ok(ret == -1, "wrong return, expected -1 got %d\n", ret);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
+
+ /* close && is_open */
+ ok((int) call_func1(p_fstream_is_open, &fs) == 1, "expected fstream to be open\n");
+ fs.base_ios.state = IOSTATE_eofbit | IOSTATE_failbit;
+ call_func1(p_fstream_close, &fs);
+ ok(fs.base_ios.state == IOSTATE_goodbit, "close did not clear state = %d\n", fs.base_ios.state);
+ fs.base_ios.state = IOSTATE_eofbit;
+ call_func1(p_fstream_close, &fs);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "close on a closed stream did not set failbit\n");
+ ok((int) call_func1(p_fstream_is_open, &fs) == 0, "expected fstream to not be open\n");
+ ok(_close(fd) == -1, "expected close to close the opened file\n");
+
+ /* open */
+ fs.base_ios.state = IOSTATE_eofbit;
+ call_func4(p_fstream_open, &fs, filename, OPENMODE_out, filebuf_openprot);
+ fd = (int) call_func1(p_fstream_fd, &fs);
+ ok(fd != -1, "wrong fd, expected not -1 got %d\n", fd);
+ ok(fs.base_ios.state == IOSTATE_eofbit, "open did not succeed\n");
+ call_func4(p_fstream_open, &fs, filename, OPENMODE_out, filebuf_openprot);
+ ok(fs.base_ios.state == (IOSTATE_eofbit | IOSTATE_failbit), "second open did not set failbit\n");
+ call_func1(p_fstream_close, &fs);
+ call_func1(p_fstream_vbase_dtor, &fs);
+ ok(_unlink(filename) == 0, "Couldn't unlink file named '%s'\n", filename);
- /* constructors */
pfs = call_func5(p_fstream_open_ctor, &fs, filename, OPENMODE_out, filebuf_openprot, TRUE);
ok(pfs == &fs, "constructor returned wrong pointer, expected %p got %p\n", &fs, pfs);
ok(fs.base_ios.state == IOSTATE_goodbit, "wrong stream state, expected %d got %d\n", IOSTATE_goodbit, fs.base_ios.state);
pfb = (filebuf*) fs.base_ios.sb;
ok((int) call_func1(p_filebuf_is_open, pfb) == TRUE, "expected filebuf to be open\n");
- ok(fs.base_ios.delbuf == 1, "internal filebuf not makred for deletion\n");
+ ok(fs.base_ios.delbuf == 1, "internal filebuf not marked for deletion\n");
/* integration with ostream */
pos = call_func2(p_ostream_print_str, (ostream*) &fs.base2, "ftest ");
diff --git a/dlls/msvcrt20/msvcrt20.spec b/dlls/msvcrt20/msvcrt20.spec
index e386ed8511d8..8c4e4a233cb4 100644
--- a/dlls/msvcrt20/msvcrt20.spec
+++ b/dlls/msvcrt20/msvcrt20.spec
@@ -10,16 +10,16 @@
@ cdecl -arch=win64 ??0filebuf@@QEAA(a)HPEADH@Z(ptr long ptr long) msvcirt.??0filebuf@@QEAA(a)HPEADH@Z
@ thiscall -arch=win32 ??0filebuf@@QAE(a)XZ(ptr) msvcirt.??0filebuf@@QAE(a)XZ
@ cdecl -arch=win64 ??0filebuf@@QEAA(a)XZ(ptr) msvcirt.??0filebuf@@QEAA(a)XZ
-@ stub -arch=win32 ??0fstream@@QAE(a)ABV0@@Z
-@ stub -arch=win64 ??0fstream@@QEAA(a)AEBV0@@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)H@Z
-@ stub -arch=win64 ??0fstream@@QEAA(a)H@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)HPADH@Z
-@ stub -arch=win64 ??0fstream@@QEAA(a)HPEADH@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)ABV0@@Z(ptr ptr long) msvcirt.??0fstream@@QAE(a)ABV0@@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)AEBV0@@Z(ptr ptr long) msvcirt.??0fstream@@QEAA(a)AEBV0@@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)H@Z(ptr long long) msvcirt.??0fstream@@QAE(a)H@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)H@Z(ptr long long) msvcirt.??0fstream@@QEAA(a)H@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)HPADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QAE(a)HPADH@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)HPEADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QEAA(a)HPEADH@Z
@ thiscall -arch=win32 ??0fstream@@QAE(a)PBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QAE(a)PBDHH@Z
@ cdecl -arch=win64 ??0fstream@@QEAA(a)PEBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QEAA(a)PEBDHH@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)XZ
-@ stub -arch=win64 ??0fstream@@QEAA(a)XZ
+@ thiscall -arch=win32 ??0fstream@@QAE(a)XZ(ptr long) msvcirt.??0fstream@@QAE(a)XZ
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)XZ(ptr long) msvcirt.??0fstream@@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
@@ -162,8 +162,8 @@
@ cdecl -arch=win64 ??4Iostream_init@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcirt.??4Iostream_init@@QEAAAEAV0(a)AEBV0@@Z
@ thiscall -arch=win32 ??4filebuf@@QAEAAV0(a)ABV0@@Z(ptr ptr) msvcirt.??4filebuf@@QAEAAV0(a)ABV0@@Z
@ 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
+@ thiscall -arch=win32 ??4fstream@@QAEAAV0(a)AAV0@@Z(ptr ptr) msvcirt.??4fstream@@QAEAAV0(a)AAV0@@Z
+@ cdecl -arch=win64 ??4fstream@@QEAAAEAV0(a)AEAV0@@Z(ptr ptr) msvcirt.??4fstream@@QEAAAEAV0(a)AEAV0@@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
@@ -392,8 +392,8 @@
@ cdecl -arch=win64 ?allocate(a)streambuf@@IEAAHXZ(ptr) msvcirt.?allocate(a)streambuf@@IEAAHXZ
@ thiscall -arch=win32 ?attach(a)filebuf@@QAEPAV1(a)H@Z(ptr long) msvcirt.?attach(a)filebuf@@QAEPAV1(a)H@Z
@ 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
+@ thiscall -arch=win32 ?attach(a)fstream@@QAEXH(a)Z(ptr long) msvcirt.?attach(a)fstream@@QAEXH(a)Z
+@ cdecl -arch=win64 ?attach(a)fstream@@QEAAXH(a)Z(ptr long) msvcirt.?attach(a)fstream@@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
@ thiscall -arch=win32 ?attach(a)ofstream@@QAEXH(a)Z(ptr long) msvcirt.?attach(a)ofstream@@QAEXH(a)Z
@@ -414,8 +414,8 @@
@ extern ?clog@@3Vostream_withassign@@A msvcirt.?clog@@3Vostream_withassign@@A
@ thiscall -arch=win32 ?close(a)filebuf@@QAEPAV1(a)XZ(ptr) msvcirt.?close(a)filebuf@@QAEPAV1(a)XZ
@ 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
+@ thiscall -arch=win32 ?close(a)fstream@@QAEXXZ(ptr) msvcirt.?close(a)fstream@@QAEXXZ
+@ cdecl -arch=win64 ?close(a)fstream@@QEAAXXZ(ptr) msvcirt.?close(a)fstream@@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
@ thiscall -arch=win32 ?close(a)ofstream@@QAEXXZ(ptr) msvcirt.?close(a)ofstream@@QAEXXZ
@@ -458,8 +458,8 @@
@ cdecl -arch=win64 ?fail(a)ios@@QEBAHXZ(ptr) msvcirt.?fail(a)ios@@QEBAHXZ
@ thiscall -arch=win32 ?fd(a)filebuf@@QBEHXZ(ptr) msvcirt.?fd(a)filebuf@@QBEHXZ
@ 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
+@ thiscall -arch=win32 ?fd(a)fstream@@QBEHXZ(ptr) msvcirt.?fd(a)fstream@@QBEHXZ
+@ cdecl -arch=win64 ?fd(a)fstream@@QEBAHXZ(ptr) msvcirt.?fd(a)fstream@@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
@ thiscall -arch=win32 ?fd(a)ofstream@@QBEHXZ(ptr) msvcirt.?fd(a)ofstream@@QBEHXZ
@@ -525,8 +525,8 @@
@ cdecl -arch=win64 ?ipfx(a)istream@@QEAAHH(a)Z(ptr long) msvcirt.?ipfx(a)istream@@QEAAHH(a)Z
@ thiscall -arch=win32 ?is_open(a)filebuf@@QBEHXZ(ptr) msvcirt.?is_open(a)filebuf@@QBEHXZ
@ 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
+@ thiscall -arch=win32 ?is_open(a)fstream@@QBEHXZ(ptr) msvcirt.?is_open(a)fstream@@QBEHXZ
+@ cdecl -arch=win64 ?is_open(a)fstream@@QEBAHXZ(ptr) msvcirt.?is_open(a)fstream@@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
@ thiscall -arch=win32 ?is_open(a)ofstream@@QBEHXZ(ptr) msvcirt.?is_open(a)ofstream@@QBEHXZ
@@ -550,8 +550,8 @@
@ cdecl -arch=win64 ?oct@@YAAEAVios@@AEAV1@@Z(ptr) msvcirt.?oct@@YAAEAVios@@AEAV1@@Z
@ thiscall -arch=win32 ?open(a)filebuf@@QAEPAV1(a)PBDHH@Z(ptr str long long) msvcirt.?open(a)filebuf@@QAEPAV1(a)PBDHH@Z
@ 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
+@ thiscall -arch=win32 ?open(a)fstream@@QAEXPBDHH(a)Z(ptr str long long) msvcirt.?open(a)fstream@@QAEXPBDHH(a)Z
+@ cdecl -arch=win64 ?open(a)fstream@@QEAAXPEBDHH(a)Z(ptr str long long) msvcirt.?open(a)fstream@@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
@ thiscall -arch=win32 ?open(a)ofstream@@QAEXPBDHH(a)Z(ptr str long long) msvcirt.?open(a)ofstream@@QAEXPBDHH(a)Z
@@ -599,8 +599,8 @@
@ cdecl -arch=win64 ?putback(a)istream@@QEAAAEAV1(a)D@Z(ptr long) msvcirt.?putback(a)istream@@QEAAAEAV1(a)D@Z
@ thiscall -arch=win32 ?pword(a)ios@@QBEAAPAXH(a)Z(ptr long) msvcirt.?pword(a)ios@@QBEAAPAXH(a)Z
@ 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
+@ thiscall -arch=win32 ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ
+@ cdecl -arch=win64 ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)fstream@@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
@@ -649,8 +649,8 @@
@ cdecl -arch=win64 ?setb(a)streambuf@@IEAAXPEAD0H(a)Z(ptr ptr ptr long) msvcirt.?setb(a)streambuf@@IEAAXPEAD0H(a)Z
@ thiscall -arch=win32 ?setbuf(a)filebuf@@UAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)filebuf@@UAEPAVstreambuf@@PADH(a)Z
@ 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
+@ thiscall -arch=win32 ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z
+@ cdecl -arch=win64 ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)fstream@@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
@ thiscall -arch=win32 ?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z
@@ -671,8 +671,8 @@
@ cdecl -arch=win64 ?setlock(a)streambuf@@QEAAXXZ(ptr) msvcirt.?setlock(a)streambuf@@QEAAXXZ
@ thiscall -arch=win32 ?setmode(a)filebuf@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)filebuf@@QAEHH(a)Z
@ 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
+@ thiscall -arch=win32 ?setmode(a)fstream@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)fstream@@QAEHH(a)Z
+@ cdecl -arch=win64 ?setmode(a)fstream@@QEAAHH(a)Z(ptr long) msvcirt.?setmode(a)fstream@@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
@ thiscall -arch=win32 ?setmode(a)ofstream@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)ofstream@@QAEHH(a)Z
diff --git a/dlls/msvcrt40/msvcrt40.spec b/dlls/msvcrt40/msvcrt40.spec
index 1024644b29cd..943dcc537018 100644
--- a/dlls/msvcrt40/msvcrt40.spec
+++ b/dlls/msvcrt40/msvcrt40.spec
@@ -28,16 +28,16 @@
@ cdecl -arch=win64 ??0filebuf@@QEAA(a)HPEADH@Z(ptr long ptr long) msvcirt.??0filebuf@@QEAA(a)HPEADH@Z
@ thiscall -arch=win32 ??0filebuf@@QAE(a)XZ(ptr) msvcirt.??0filebuf@@QAE(a)XZ
@ cdecl -arch=win64 ??0filebuf@@QEAA(a)XZ(ptr) msvcirt.??0filebuf@@QEAA(a)XZ
-@ stub -arch=win32 ??0fstream@@QAE(a)ABV0@@Z
-@ stub -arch=win64 ??0fstream@@QEAA(a)AEBV0@@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)H@Z
-@ stub -arch=win64 ??0fstream@@QEAA(a)H@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)HPADH@Z
-@ stub -arch=win64 ??0fstream@@QEAA(a)HPEADH@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)ABV0@@Z(ptr ptr long) msvcirt.??0fstream@@QAE(a)ABV0@@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)AEBV0@@Z(ptr ptr long) msvcirt.??0fstream@@QEAA(a)AEBV0@@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)H@Z(ptr long long) msvcirt.??0fstream@@QAE(a)H@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)H@Z(ptr long long) msvcirt.??0fstream@@QEAA(a)H@Z
+@ thiscall -arch=win32 ??0fstream@@QAE(a)HPADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QAE(a)HPADH@Z
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)HPEADH@Z(ptr long ptr long long) msvcirt.??0fstream@@QEAA(a)HPEADH@Z
@ thiscall -arch=win32 ??0fstream@@QAE(a)PBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QAE(a)PBDHH@Z
@ cdecl -arch=win64 ??0fstream@@QEAA(a)PEBDHH@Z(ptr str long long long) msvcirt.??0fstream@@QEAA(a)PEBDHH@Z
-@ stub -arch=win32 ??0fstream@@QAE(a)XZ
-@ stub -arch=win64 ??0fstream@@QEAA(a)XZ
+@ thiscall -arch=win32 ??0fstream@@QAE(a)XZ(ptr long) msvcirt.??0fstream@@QAE(a)XZ
+@ cdecl -arch=win64 ??0fstream@@QEAA(a)XZ(ptr long) msvcirt.??0fstream@@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
@@ -204,8 +204,8 @@
@ cdecl -arch=win64 ??4exception@@QEAAAEAV0(a)AEBV0@@Z(ptr ptr) msvcrt.??4exception@@QEAAAEAV0(a)AEBV0@@Z
@ thiscall -arch=win32 ??4filebuf@@QAEAAV0(a)ABV0@@Z(ptr ptr) msvcirt.??4filebuf@@QAEAAV0(a)ABV0@@Z
@ 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
+@ thiscall -arch=win32 ??4fstream@@QAEAAV0(a)AAV0@@Z(ptr ptr) msvcirt.??4fstream@@QAEAAV0(a)AAV0@@Z
+@ cdecl -arch=win64 ??4fstream@@QEAAAEAV0(a)AEAV0@@Z(ptr ptr) msvcirt.??4fstream@@QEAAAEAV0(a)AEAV0@@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
@@ -455,8 +455,8 @@
@ cdecl -arch=win64 ?allocate(a)streambuf@@IEAAHXZ(ptr) msvcirt.?allocate(a)streambuf@@IEAAHXZ
@ thiscall -arch=win32 ?attach(a)filebuf@@QAEPAV1(a)H@Z(ptr long) msvcirt.?attach(a)filebuf@@QAEPAV1(a)H@Z
@ 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
+@ thiscall -arch=win32 ?attach(a)fstream@@QAEXH(a)Z(ptr long) msvcirt.?attach(a)fstream@@QAEXH(a)Z
+@ cdecl -arch=win64 ?attach(a)fstream@@QEAAXH(a)Z(ptr long) msvcirt.?attach(a)fstream@@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
@ thiscall -arch=win32 ?attach(a)ofstream@@QAEXH(a)Z(ptr long) msvcirt.?attach(a)ofstream@@QAEXH(a)Z
@@ -479,8 +479,8 @@
@ extern ?clog@@3Vostream_withassign@@A msvcirt.?clog@@3Vostream_withassign@@A
@ thiscall -arch=win32 ?close(a)filebuf@@QAEPAV1(a)XZ(ptr) msvcirt.?close(a)filebuf@@QAEPAV1(a)XZ
@ 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
+@ thiscall -arch=win32 ?close(a)fstream@@QAEXXZ(ptr) msvcirt.?close(a)fstream@@QAEXXZ
+@ cdecl -arch=win64 ?close(a)fstream@@QEAAXXZ(ptr) msvcirt.?close(a)fstream@@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
@ thiscall -arch=win32 ?close(a)ofstream@@QAEXXZ(ptr) msvcirt.?close(a)ofstream@@QAEXXZ
@@ -523,8 +523,8 @@
@ cdecl -arch=win64 ?fail(a)ios@@QEBAHXZ(ptr) msvcirt.?fail(a)ios@@QEBAHXZ
@ thiscall -arch=win32 ?fd(a)filebuf@@QBEHXZ(ptr) msvcirt.?fd(a)filebuf@@QBEHXZ
@ 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
+@ thiscall -arch=win32 ?fd(a)fstream@@QBEHXZ(ptr) msvcirt.?fd(a)fstream@@QBEHXZ
+@ cdecl -arch=win64 ?fd(a)fstream@@QEBAHXZ(ptr) msvcirt.?fd(a)fstream@@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
@ thiscall -arch=win32 ?fd(a)ofstream@@QBEHXZ(ptr) msvcirt.?fd(a)ofstream@@QBEHXZ
@@ -592,8 +592,8 @@
@ cdecl -arch=win64 ?ipfx(a)istream@@QEAAHH(a)Z(ptr long) msvcirt.?ipfx(a)istream@@QEAAHH(a)Z
@ thiscall -arch=win32 ?is_open(a)filebuf@@QBEHXZ(ptr) msvcirt.?is_open(a)filebuf@@QBEHXZ
@ 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
+@ thiscall -arch=win32 ?is_open(a)fstream@@QBEHXZ(ptr) msvcirt.?is_open(a)fstream@@QBEHXZ
+@ cdecl -arch=win64 ?is_open(a)fstream@@QEBAHXZ(ptr) msvcirt.?is_open(a)fstream@@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
@ thiscall -arch=win32 ?is_open(a)ofstream@@QBEHXZ(ptr) msvcirt.?is_open(a)ofstream@@QBEHXZ
@@ -619,8 +619,8 @@
@ cdecl -arch=win64 ?oct@@YAAEAVios@@AEAV1@@Z(ptr) msvcirt.?oct@@YAAEAVios@@AEAV1@@Z
@ thiscall -arch=win32 ?open(a)filebuf@@QAEPAV1(a)PBDHH@Z(ptr str long long) msvcirt.?open(a)filebuf@@QAEPAV1(a)PBDHH@Z
@ 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
+@ thiscall -arch=win32 ?open(a)fstream@@QAEXPBDHH(a)Z(ptr str long long) msvcirt.?open(a)fstream@@QAEXPBDHH(a)Z
+@ cdecl -arch=win64 ?open(a)fstream@@QEAAXPEBDHH(a)Z(ptr str long long) msvcirt.?open(a)fstream@@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
@ thiscall -arch=win32 ?open(a)ofstream@@QAEXPBDHH(a)Z(ptr str long long) msvcirt.?open(a)ofstream@@QAEXPBDHH(a)Z
@@ -670,8 +670,8 @@
@ cdecl -arch=win64 ?pword(a)ios@@QEBAAEAPEAXH(a)Z(ptr long) msvcirt.?pword(a)ios@@QEBAAEAPEAXH(a)Z
@ thiscall -arch=i386 ?raw_name(a)type_info@@QBEPBDXZ(ptr) msvcrt.?raw_name(a)type_info@@QBEPBDXZ
@ 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
+@ thiscall -arch=win32 ?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)fstream@@QBEPAVfilebuf@@XZ
+@ cdecl -arch=win64 ?rdbuf(a)fstream@@QEBAPEAVfilebuf@@XZ(ptr) msvcirt.?rdbuf(a)fstream@@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
@@ -721,8 +721,8 @@
@ cdecl -arch=win64 ?setb(a)streambuf@@IEAAXPEAD0H(a)Z(ptr ptr ptr long) msvcirt.?setb(a)streambuf@@IEAAXPEAD0H(a)Z
@ thiscall -arch=win32 ?setbuf(a)filebuf@@UAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)filebuf@@UAEPAVstreambuf@@PADH(a)Z
@ 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
+@ thiscall -arch=win32 ?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)fstream@@QAEPAVstreambuf@@PADH(a)Z
+@ cdecl -arch=win64 ?setbuf(a)fstream@@QEAAPEAVstreambuf@@PEADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)fstream@@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
@ thiscall -arch=win32 ?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z(ptr ptr long) msvcirt.?setbuf(a)ofstream@@QAEPAVstreambuf@@PADH(a)Z
@@ -743,8 +743,8 @@
@ cdecl -arch=win64 ?setlock(a)streambuf@@QEAAXXZ(ptr) msvcirt.?setlock(a)streambuf@@QEAAXXZ
@ thiscall -arch=win32 ?setmode(a)filebuf@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)filebuf@@QAEHH(a)Z
@ 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
+@ thiscall -arch=win32 ?setmode(a)fstream@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)fstream@@QAEHH(a)Z
+@ cdecl -arch=win64 ?setmode(a)fstream@@QEAAHH(a)Z(ptr long) msvcirt.?setmode(a)fstream@@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
@ thiscall -arch=win32 ?setmode(a)ofstream@@QAEHH(a)Z(ptr long) msvcirt.?setmode(a)ofstream@@QAEHH(a)Z
--
2.30.1
2
2
Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com>
---
dlls/mf/tests/mf.c | 26 ++++++++++++++++++++++++--
1 file changed, 24 insertions(+), 2 deletions(-)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 65f2b40faa9..e3a752553bb 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -47,6 +47,8 @@ DEFINE_GUID(MFVideoFormat_ABGR32, 0x00000020, 0x0000, 0x0010, 0x80, 0x00, 0x00,
#include "wine/test.h"
+static HRESULT (WINAPI *pMFCreateSampleCopierMFT)(IMFTransform **copier);
+
#define EXPECT_REF(obj,ref) _expect_ref((IUnknown*)obj, ref, __LINE__)
static void _expect_ref(IUnknown* obj, ULONG expected_refcount, int line)
{
@@ -4669,7 +4671,13 @@ static void test_sample_copier(void)
UINT32 value;
HRESULT hr;
- hr = MFCreateSampleCopierMFT(&copier);
+ if (!pMFCreateSampleCopierMFT)
+ {
+ win_skip("MFCreateSampleCopierMFT() is not available.\n");
+ return;
+ }
+
+ hr = pMFCreateSampleCopierMFT(&copier);
ok(hr == S_OK, "Failed to create sample copier, hr %#x.\n", hr);
hr = IMFTransform_GetAttributes(copier, &attributes);
@@ -5005,7 +5013,10 @@ static void test_sample_copier_output_processing(void)
HRESULT hr;
BYTE *ptr;
- hr = MFCreateSampleCopierMFT(&copier);
+ if (!pMFCreateSampleCopierMFT)
+ return;
+
+ hr = pMFCreateSampleCopierMFT(&copier);
ok(hr == S_OK, "Failed to create sample copier, hr %#x.\n", hr);
/* Configure for 16 x 16 of D3DFMT_X8R8G8B8. */
@@ -5152,8 +5163,19 @@ static void test_MFGetTopoNodeCurrentType(void)
IMFMediaType_Release(media_type2);
}
+static void init_functions(void)
+{
+ HMODULE mod = GetModuleHandleA("mf.dll");
+
+#define X(f) p##f = (void*)GetProcAddress(mod, #f)
+ X(MFCreateSampleCopierMFT);
+#undef X
+}
+
START_TEST(mf)
{
+ init_functions();
+
test_topology();
test_topology_tee_node();
test_topology_loader();
--
2.30.0
2
1
[PATCH 4/5] ntdll: Use syscall dispatcher for restoring context in x86_64 NtSetContextThread implementation.
by Jacek Caban Feb. 22, 2021
by Jacek Caban Feb. 22, 2021
Feb. 22, 2021
Signed-off-by: Jacek Caban <jacek(a)codeweavers.com>
---
dlls/ntdll/unix/server.c | 5 ++++-
dlls/ntdll/unix/signal_arm.c | 10 ++++++++++
dlls/ntdll/unix/signal_arm64.c | 10 ++++++++++
dlls/ntdll/unix/signal_i386.c | 11 +++++++++++
dlls/ntdll/unix/signal_x86_64.c | 29 ++++++++++++++++++++++-------
dlls/ntdll/unix/unix_private.h | 1 +
tools/winebuild/import.c | 13 ++++++++++++-
7 files changed, 70 insertions(+), 9 deletions(-)
1
0