static HRESULT WINAPI IDirectMusicLoaderGenericStream_IStream_LockRegion (LPSTREAM iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { ICOM_THIS_MULTI(IDirectMusicLoaderGenericStream, StreamVtbl, iface); TRACE("(%p, 0x%08llX, 0x%08llX, 0x%08lX): redirecting to low-level stream\n", This, libOffset.QuadPart, cb.QuadPart, dwLockType); if (!This->pStream) return E_FAIL; return IStream_LockRegion (This->pStream, libOffset, cb, dwLockType); }
static HRESULT WINAPI IWICStreamImpl_LockRegion(IWICStream *iface, ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) { IWICStreamImpl *This = impl_from_IWICStream(iface); TRACE("(%p): relay\n", This); if (!This->pStream) return WINCODEC_ERR_NOTINITIALIZED; return IStream_LockRegion(This->pStream, libOffset, cb, dwLockType); }
static void test_streamonhglobal(IStream *pStream) { const char data[] = "Test String"; ULARGE_INTEGER ull; LARGE_INTEGER ll; char buffer[128]; ULONG read; STATSTG statstg; HRESULT hr; ull.QuadPart = sizeof(data); hr = IStream_SetSize(pStream, ull); ok_ole_success(hr, "IStream_SetSize"); hr = IStream_Write(pStream, data, sizeof(data), NULL); ok_ole_success(hr, "IStream_Write"); ll.QuadPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, NULL); ok_ole_success(hr, "IStream_Seek"); /* should return S_OK, not S_FALSE */ hr = IStream_Read(pStream, buffer, sizeof(buffer), &read); ok_ole_success(hr, "IStream_Read"); ok(read == sizeof(data), "IStream_Read returned read %d\n", read); /* ignores HighPart */ ull.u.HighPart = -1; ull.u.LowPart = 0; hr = IStream_SetSize(pStream, ull); ok_ole_success(hr, "IStream_SetSize"); /* IStream_Seek -- NULL position argument */ ll.u.HighPart = 0; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, NULL); ok_ole_success(hr, "IStream_Seek"); /* IStream_Seek -- valid position argument (seek from current position) */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == sizeof(data), "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- invalid seek argument */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 123; hr = IStream_Seek(pStream, ll, STREAM_SEEK_END+1, &ull); ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); ok(ull.u.LowPart == sizeof(data), "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should not have changed HighPart, got %d\n", ull.u.HighPart); /* IStream_Seek -- valid position argument (seek to beginning) */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0, "should have set LowPart to 0 instead of %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- valid position argument (seek to end) */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_END, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0, "should have set LowPart to 0 instead of %d\n", ull.u.LowPart); 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 from current position) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = -1; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == sizeof(data), "LowPart set to %d\n", ull.u.LowPart); 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) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = -1; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0, "should have set LowPart to 0 instead of %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- invalid LowPart value (seek before start of stream) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0x80000000; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); ok(ull.u.LowPart == sizeof(data), "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- valid LowPart value (seek to start of stream) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = -(DWORD)sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0, "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- invalid LowPart value (seek to start of stream-1) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = -(DWORD)sizeof(data)-1; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); ok(ull.u.LowPart == sizeof(data), "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- valid LowPart value (seek forward to 0x80000000) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0x80000000 - sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0x80000000, "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- invalid LowPart value (seek to beginning) */ ll.u.HighPart = 0; ll.u.LowPart = sizeof(data); hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0x80000000; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok(hr == STG_E_SEEKERROR, "IStream_Seek should have returned STG_E_SEEKERROR instead of 0x%08x\n", hr); ok(ull.u.LowPart == sizeof(data), "LowPart set to %d\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- valid LowPart value (seek to beginning) */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0x7FFFFFFF; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0x7FFFFFFF, "should have set LowPart to 0x7FFFFFFF instead of %08x\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- valid LowPart value (seek from current position) */ ll.u.HighPart = 0; ll.u.LowPart = 0; hr = IStream_Seek(pStream, ll, STREAM_SEEK_SET, &ull); ok_ole_success(hr, "IStream_Seek"); ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0x7FFFFFFF; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0x7FFFFFFF, "should have set LowPart to 0x7FFFFFFF instead of %08x\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- second seek allows you to go past 0x7FFFFFFF size */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 9; hr = IStream_Seek(pStream, ll, STREAM_SEEK_CUR, &ull); ok_ole_success(hr, "IStream_Seek"); ok(ull.u.LowPart == 0x80000008, "should have set LowPart to 0x80000008 instead of %08x\n", ull.u.LowPart); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); /* IStream_Seek -- seek wraps position/size on integer overflow */ ull.u.HighPart = 0xCAFECAFE; ull.u.LowPart = 0xCAFECAFE; ll.u.HighPart = 0; ll.u.LowPart = 0x7FFFFFFF; 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); ok(ull.u.HighPart == 0, "should have set HighPart to 0 instead of %d\n", ull.u.HighPart); hr = IStream_Commit(pStream, STGC_DEFAULT); ok_ole_success(hr, "IStream_Commit"); hr = IStream_Revert(pStream); ok_ole_success(hr, "IStream_Revert"); hr = IStream_LockRegion(pStream, ull, ull, LOCK_WRITE); ok(hr == STG_E_INVALIDFUNCTION, "IStream_LockRegion should have returned STG_E_INVALIDFUNCTION instead of 0x%08x\n", hr); hr = IStream_Stat(pStream, &statstg, STATFLAG_DEFAULT); ok_ole_success(hr, "IStream_Stat"); ok(statstg.type == STGTY_STREAM, "statstg.type should have been STGTY_STREAM instead of %d\n", statstg.type); /* test OOM condition */ ull.u.HighPart = -1; ull.u.LowPart = -1; hr = IStream_SetSize(pStream, ull); ok(hr == E_OUTOFMEMORY || broken(hr == S_OK), /* win9x */ "IStream_SetSize with large size should have returned E_OUTOFMEMORY instead of 0x%08x\n", hr); }
static void test_IStream_invalid_operations(IStream * stream, DWORD mode) { HRESULT ret; IStream * clone; ULONG refcount; ULARGE_INTEGER uzero; ULARGE_INTEGER uret; LARGE_INTEGER zero; ULONG count; char data[256]; U(uzero).HighPart = 0; U(uzero).LowPart = 0; U(uret).HighPart = 0; U(uret).LowPart = 0; U(zero).HighPart = 0; U(zero).LowPart = 0; /* IStream::Read */ /* IStream_Read from the COBJMACROS is undefined by shlwapi.h, replaced by the IStream_Read helper function. */ ret = stream->lpVtbl->Read(stream, NULL, 0, &count); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = stream->lpVtbl->Read(stream, data, 5, NULL); ok(ret == S_FALSE || ret == S_OK, "expected S_FALSE or S_OK, got 0x%08x\n", ret); ret = stream->lpVtbl->Read(stream, data, 0, NULL); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = stream->lpVtbl->Read(stream, data, 3, &count); ok(ret == S_FALSE || ret == S_OK, "expected S_FALSE or S_OK, got 0x%08x\n", ret); /* IStream::Write */ /* IStream_Write from the COBJMACROS is undefined by shlwapi.h, replaced by the IStream_Write helper function. */ ret = stream->lpVtbl->Write(stream, NULL, 0, &count); if (mode == STGM_READ) { ok(ret == STG_E_ACCESSDENIED /* XP */ || broken(ret == S_OK) /* Win2000 + IE5 */, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); } else ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); strcpy(data, "Hello"); ret = stream->lpVtbl->Write(stream, data, 5, NULL); if (mode == STGM_READ) ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); else ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); strcpy(data, "Hello"); ret = stream->lpVtbl->Write(stream, data, 0, NULL); if (mode == STGM_READ) ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); else ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); strcpy(data, "Hello"); ret = stream->lpVtbl->Write(stream, data, 0, &count); if (mode == STGM_READ) ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); else ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); strcpy(data, "Hello"); ret = stream->lpVtbl->Write(stream, data, 3, &count); if (mode == STGM_READ) ok(ret == STG_E_ACCESSDENIED, "expected STG_E_ACCESSDENIED, got 0x%08x\n", ret); else ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); /* IStream::Seek */ ret = IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = IStream_Seek(stream, zero, 20, NULL); ok(ret == E_INVALIDARG, "expected E_INVALIDARG, got 0x%08x\n", ret); /* IStream::CopyTo */ ret = IStream_CopyTo(stream, NULL, uzero, &uret, &uret); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); clone = NULL; ret = IStream_CopyTo(stream, clone, uzero, &uret, &uret); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = IStream_CopyTo(stream, stream, uzero, &uret, &uret); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = IStream_CopyTo(stream, stream, uzero, &uret, NULL); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = IStream_CopyTo(stream, stream, uzero, NULL, &uret); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); /* IStream::Commit */ ret = IStream_Commit(stream, STGC_DEFAULT); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); /* IStream::Revert */ ret = IStream_Revert(stream); ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); /* IStream::LockRegion */ ret = IStream_LockRegion(stream, uzero, uzero, 0); ok(ret == E_NOTIMPL /* XP */ || ret == S_OK /* Vista */, "expected E_NOTIMPL or S_OK, got 0x%08x\n", ret); /* IStream::UnlockRegion */ if (ret == E_NOTIMPL) /* XP */ { ret = IStream_UnlockRegion(stream, uzero, uzero, 0); ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); } else /* Vista */ { ret = IStream_UnlockRegion(stream, uzero, uzero, 0); ok(ret == S_OK, "expected S_OK, got 0x%08x\n", ret); ret = IStream_UnlockRegion(stream, uzero, uzero, 0); ok(ret == STG_E_LOCKVIOLATION, "expected STG_E_LOCKVIOLATION, got 0x%08x\n", ret); } /* IStream::Stat */ ret = IStream_Stat(stream, NULL, 0); ok(ret == STG_E_INVALIDPOINTER, "expected STG_E_INVALIDPOINTER or E_NOTIMPL, got 0x%08x\n", ret); /* IStream::Clone */ /* Passing a NULL pointer for the second IStream::Clone param crashes on Win7 */ clone = NULL; ret = IStream_Clone(stream, &clone); ok(ret == E_NOTIMPL, "expected E_NOTIMPL, got 0x%08x\n", ret); ok(clone == NULL, "expected a NULL IStream object, got %p\n", stream); if (clone) { refcount = IStream_Release(clone); ok(refcount == 0, "expected 0, got %d\n", refcount); } }