ole32: Fix the HGLOBAL stream Seek implementation.
This commit is contained in:
parent
4cd390ca4e
commit
f08206b31f
|
@ -365,11 +365,18 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
|
||||||
{
|
{
|
||||||
HGLOBALStreamImpl* const This=(HGLOBALStreamImpl*)iface;
|
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,
|
TRACE("(%p, %x%08x, %d, %p)\n", iface, dlibMove.u.HighPart,
|
||||||
dlibMove.u.LowPart, dwOrigin, plibNewPosition);
|
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"
|
* The file pointer is moved depending on the given "function"
|
||||||
* parameter.
|
* parameter.
|
||||||
|
@ -381,13 +388,13 @@ static HRESULT WINAPI HGLOBALStreamImpl_Seek(
|
||||||
newPosition.u.LowPart = 0;
|
newPosition.u.LowPart = 0;
|
||||||
break;
|
break;
|
||||||
case STREAM_SEEK_CUR:
|
case STREAM_SEEK_CUR:
|
||||||
newPosition = This->currentPosition;
|
|
||||||
break;
|
break;
|
||||||
case STREAM_SEEK_END:
|
case STREAM_SEEK_END:
|
||||||
newPosition = This->streamSize;
|
newPosition = This->streamSize;
|
||||||
break;
|
break;
|
||||||
default:
|
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
|
* 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.
|
* make the file larger. This is how it is documented.
|
||||||
*/
|
*/
|
||||||
if (dlibMove.QuadPart < 0 && newPosition.QuadPart < -dlibMove.QuadPart) return STG_E_INVALIDFUNCTION;
|
newPosition.u.HighPart = 0;
|
||||||
|
newPosition.u.LowPart += dlibMove.QuadPart;
|
||||||
newPosition.QuadPart += dlibMove.QuadPart;
|
|
||||||
|
|
||||||
|
end:
|
||||||
if (plibNewPosition) *plibNewPosition = newPosition;
|
if (plibNewPosition) *plibNewPosition = newPosition;
|
||||||
This->currentPosition = newPosition;
|
This->currentPosition = newPosition;
|
||||||
|
|
||||||
return S_OK;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***
|
/***
|
||||||
|
|
|
@ -97,11 +97,8 @@ static void test_streamonhglobal(IStream *pStream)
|
||||||
ll.u.HighPart = 0;
|
ll.u.HighPart = 0;
|
||||||
ll.u.LowPart = 123;
|
ll.u.LowPart = 123;
|
||||||
hr = IStream_Seek(pStream, ll, STREAM_SEEK_END+1, &ull);
|
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);
|
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.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);
|
ok(ull.u.HighPart == 0, "should not have changed HighPart, got %d\n", ull.u.HighPart);
|
||||||
|
|
||||||
/* IStream_Seek -- valid position argument (seek to beginning) */
|
/* IStream_Seek -- valid position argument (seek to beginning) */
|
||||||
|
@ -135,11 +132,8 @@ static void test_streamonhglobal(IStream *pStream)
|
||||||
ll.u.HighPart = -1;
|
ll.u.HighPart = -1;
|
||||||
ll.u.LowPart = 0;
|
ll.u.LowPart = 0;
|
||||||
hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
|
hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
|
||||||
todo_wine
|
|
||||||
ok_ole_success(hr, "IStream_Seek");
|
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);
|
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);
|
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) */
|
/* 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.HighPart = -1;
|
||||||
ll.u.LowPart = 0;
|
ll.u.LowPart = 0;
|
||||||
hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull);
|
hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull);
|
||||||
todo_wine
|
|
||||||
ok_ole_success(hr, "IStream_Seek");
|
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);
|
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);
|
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) */
|
/* 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.HighPart = 0;
|
||||||
ll.u.LowPart = 0x80000000;
|
ll.u.LowPart = 0x80000000;
|
||||||
hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
|
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);
|
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.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);
|
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.HighPart = 0;
|
||||||
ll.u.LowPart = 0x80000000;
|
ll.u.LowPart = 0x80000000;
|
||||||
hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull);
|
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);
|
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.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);
|
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);
|
hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull);
|
||||||
ok_ole_success(hr, "IStream_Seek");
|
ok_ole_success(hr, "IStream_Seek");
|
||||||
ok(ull.u.LowPart == 0x00000007, "should have set LowPart to 0x00000007 instead of %08x\n", ull.u.LowPart);
|
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);
|
ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart);
|
||||||
|
|
||||||
hr = IStream_Commit(pStream, STGC_DEFAULT);
|
hr = IStream_Commit(pStream, STGC_DEFAULT);
|
||||||
|
|
Loading…
Reference in New Issue