diff --git a/dlls/ole32/hglobalstream.c b/dlls/ole32/hglobalstream.c index c43d499bb4e..5742f99619a 100644 --- a/dlls/ole32/hglobalstream.c +++ b/dlls/ole32/hglobalstream.c @@ -365,11 +365,18 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek( { HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface; - ULARGE_INTEGER newPosition; + ULARGE_INTEGER newPosition = This->currentPosition; + HRESULT hr = S_OK; TRACE("(%p, %x%08x, %d, %p)\n", iface, dlibMove.u.HighPart, dlibMove.u.LowPart, dwOrigin, plibNewPosition); + if (dlibMove.u.LowPart >= 0x80000000) + { + hr = STG_E_SEEKERROR; + goto end; + } + /* * The file pointer is moved depending on the given "function" * parameter. @@ -381,13 +388,13 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek( newPosition.u.LowPart = 0; break; case STREAM_SEEK_CUR: - newPosition = This->currentPosition; break; case STREAM_SEEK_END: newPosition = This->streamSize; break; default: - return STG_E_INVALIDFUNCTION; + hr = STG_E_SEEKERROR; + goto end; } /* @@ -395,14 +402,14 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek( * If the file pointer ends-up after the end of the stream, the next Write operation will * make the file larger. This is how it is documented. */ - if (dlibMove.QuadPart < 0 && newPosition.QuadPart < -dlibMove.QuadPart) return STG_E_INVALIDFUNCTION; - - newPosition.QuadPart += dlibMove.QuadPart; + newPosition.u.HighPart = 0; + newPosition.u.LowPart += dlibMove.QuadPart; +end: if (plibNewPosition) *plibNewPosition = newPosition; This->currentPosition = newPosition; - return S_OK; + return hr; } /*** diff --git a/dlls/ole32/tests/hglobalstream.c b/dlls/ole32/tests/hglobalstream.c index d95a7c4710a..1fed237fa94 100644 --- a/dlls/ole32/tests/hglobalstream.c +++ b/dlls/ole32/tests/hglobalstream.c @@ -97,11 +97,8 @@ static void test_streamonhglobal(IStream *pStream) ll.u.HighPart = 0; ll.u.LowPart = 123; hr = IStream_Seek(pStream, ll, STREAM_SEEK_END+1, &ull); - todo_wine ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); - todo_wine ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart); - todo_wine ok(ull.u.HighPart == 0, "should not have changed HighPart, got %d\n", ull.u.HighPart); /* IStream_Seek -- valid position argument (seek to beginning) */ @@ -135,11 +132,8 @@ static void test_streamonhglobal(IStream *pStream) ll.u.HighPart = -1; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); - todo_wine ok_ole_success(hr, "IStream_Seek"); - todo_wine ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart); - todo_wine ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- ignore HighPart in the move value (seek to beginning) */ @@ -153,11 +147,8 @@ static void test_streamonhglobal(IStream *pStream) ll.u.HighPart = -1; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); - todo_wine ok_ole_success(hr, "IStream_Seek"); - todo_wine ok(ull.u.LowPart == 0, "should have set LowPart to 0 instead of %d\n", ull.u.LowPart); - todo_wine ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- invalid LowPart value (seek from current position) */ @@ -171,9 +162,7 @@ static void test_streamonhglobal(IStream *pStream) ll.u.HighPart = 0; ll.u.LowPart = 0x80000000; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); - todo_wine ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); - todo_wine ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); @@ -188,9 +177,7 @@ static void test_streamonhglobal(IStream *pStream) ll.u.HighPart = 0; ll.u.LowPart = 0x80000000; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); - todo_wine ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); - todo_wine ok(ull.u.LowPart == sizeof(data), "should have set LowPart to %d instead of %d\n", sizeof(data), ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); @@ -237,7 +224,6 @@ static void test_streamonhglobal(IStream *pStream) hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0x00000007, "should have set LowPart to 0x00000007 instead of %08x\n", ull.u.LowPart); - todo_wine ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); hr = IStream_Commit(pStream, STGC_DEFAULT);