From: Nikolay Sivov <nsivov(a)codeweavers.com> Signed-off-by: Nikolay Sivov <nsivov(a)codeweavers.com> --- dlls/windowscodecs/metadatahandler.c | 17 +++++++++++++---- dlls/windowscodecs/tests/metadata.c | 2 -- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/dlls/windowscodecs/metadatahandler.c b/dlls/windowscodecs/metadatahandler.c index eb69903d589..3218f763ca9 100644 --- a/dlls/windowscodecs/metadatahandler.c +++ b/dlls/windowscodecs/metadatahandler.c @@ -43,6 +43,7 @@ typedef struct MetadataHandler { DWORD item_count; DWORD persist_options; IStream *stream; + ULARGE_INTEGER origin; CRITICAL_SECTION lock; } MetadataHandler; @@ -510,15 +511,20 @@ static HRESULT WINAPI MetadataHandler_LoadEx(IWICPersistStream *iface, HRESULT hr = S_OK; MetadataItem *new_items=NULL; DWORD item_count=0; + LARGE_INTEGER move; TRACE("(%p,%p,%s,%lx)\n", iface, stream, debugstr_guid(pguidPreferredVendor), dwPersistOptions); EnterCriticalSection(&This->lock); + This->origin.QuadPart = 0; if (stream) { - hr = This->vtable->fnLoad(stream, pguidPreferredVendor, dwPersistOptions, - &new_items, &item_count); + move.QuadPart = 0; + hr = IStream_Seek(stream, move, STREAM_SEEK_CUR, &This->origin); + if (SUCCEEDED(hr)) + hr = This->vtable->fnLoad(stream, pguidPreferredVendor, dwPersistOptions, + &new_items, &item_count); } if (This->stream) @@ -597,8 +603,11 @@ static HRESULT WINAPI metadatahandler_stream_provider_GetStream(IWICStreamProvid if (handler->stream) { - *stream = handler->stream; - IStream_AddRef(*stream); + if (SUCCEEDED(hr = IStream_Seek(handler->stream, *(LARGE_INTEGER *)&handler->origin, STREAM_SEEK_SET, NULL))) + { + *stream = handler->stream; + IStream_AddRef(*stream); + } } else { diff --git a/dlls/windowscodecs/tests/metadata.c b/dlls/windowscodecs/tests/metadata.c index 7b5b78094ad..edec2eb85c8 100644 --- a/dlls/windowscodecs/tests/metadata.c +++ b/dlls/windowscodecs/tests/metadata.c @@ -5132,7 +5132,6 @@ static void test_metadata_App1(void) move.QuadPart = 0; hr = IStream_Seek(ifd_stream, move, STREAM_SEEK_CUR, &pos); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(pos.QuadPart == 8, "Unexpected position %s.\n", wine_dbgstr_longlong(pos.QuadPart)); hr = CoCreateInstance(&CLSID_WICIfdMetadataReader, NULL, CLSCTX_INPROC_SERVER, @@ -5159,7 +5158,6 @@ static void test_metadata_App1(void) /* GetStream() is what triggers position reset. */ hr = IStream_Seek(ifd_stream, move, STREAM_SEEK_CUR, &pos); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - todo_wine ok(pos.QuadPart == 8, "Unexpected position %s.\n", wine_dbgstr_longlong(pos.QuadPart)); hr = IWICComponentFactory_CreateMetadataWriterFromReader(factory, reader2, NULL, &writer); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/7407