<html><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">Signed-off-by: Jactry Zeng <<a href="mailto:jzeng@codeweavers.com" class="">jzeng@codeweavers.com</a>><div class=""><br class=""><div class="">
<div style="color: rgb(0, 0, 0); font-family: Helvetica; font-size: 16px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;">-- <br class="">Regards,<br class="">Jactry Zeng</div>

</div>
<div><br class=""><blockquote type="cite" class=""><div class="">�� 2019��2��5�գ�����11:39��Jactry Zeng <<a href="mailto:jzeng@codeweavers.com" class="">jzeng@codeweavers.com</a>> д����</div><br class="Apple-interchange-newline"><div class=""><div class="">Superseded patch 157554.<br class=""><br class="">---<br class=""> dlls/shcore/main.c         |  15 +++++-<br class=""> dlls/shcore/tests/shcore.c | 119 +++++++++++++++++++++++++++++++++++++++++++++<br class=""> 2 files changed, 132 insertions(+), 2 deletions(-)<br class=""><br class="">diff --git a/dlls/shcore/main.c b/dlls/shcore/main.c<br class="">index 973b7c7a03..fdf878ed2a 100644<br class="">--- a/dlls/shcore/main.c<br class="">+++ b/dlls/shcore/main.c<br class="">@@ -913,15 +913,26 @@ static HRESULT WINAPI filestream_Seek(IStream *iface, LARGE_INTEGER move, DWORD<br class=""> static HRESULT WINAPI filestream_SetSize(IStream *iface, ULARGE_INTEGER size)<br class=""> {<br class="">     struct shstream *stream = impl_from_IStream(iface);<br class="">+    LARGE_INTEGER origin, move;<br class=""><br class="">     TRACE("(%p, %s)\n", stream, wine_dbgstr_longlong(size.QuadPart));<br class=""><br class="">-    if (!SetFilePointer(stream->u.file.handle, size.QuadPart, NULL, FILE_BEGIN))<br class="">+    move.QuadPart = 0;<br class="">+    if (!SetFilePointerEx(stream->u.file.handle, move, &origin, FILE_CURRENT))<br class="">         return E_FAIL;<br class=""><br class="">-    if (!SetEndOfFile(stream->u.file.handle))<br class="">+    move.QuadPart = size.QuadPart;<br class="">+    if (!SetFilePointerEx(stream->u.file.handle, move, NULL, FILE_BEGIN))<br class="">         return E_FAIL;<br class=""><br class="">+    if (stream->u.file.mode != STGM_READ)<br class="">+    {<br class="">+        if (!SetEndOfFile(stream->u.file.handle))<br class="">+            return E_FAIL;<br class="">+        if (!SetFilePointerEx(stream->u.file.handle, origin, NULL, FILE_BEGIN))<br class="">+            return E_FAIL;<br class="">+    }<br class="">+<br class="">     return S_OK;<br class=""> }<br class=""><br class="">diff --git a/dlls/shcore/tests/shcore.c b/dlls/shcore/tests/shcore.c<br class="">index 0738659f7c..2a8ebcc468 100644<br class="">--- a/dlls/shcore/tests/shcore.c<br class="">+++ b/dlls/shcore/tests/shcore.c<br class="">@@ -41,6 +41,8 @@ static LSTATUS (WINAPI *pSHRegGetValueA)(HKEY, const char *, const char *, SRRF,<br class=""> static DWORD (WINAPI *pSHQueryValueExA)(HKEY, const char *, DWORD *, DWORD *, void *buff, DWORD *buff_len);<br class=""> static DWORD (WINAPI *pSHRegGetPathA)(HKEY, const char *, const char *, char *, DWORD);<br class=""> static DWORD (WINAPI *pSHCopyKeyA)(HKEY, const char *, HKEY, DWORD);<br class="">+static HRESULT (WINAPI *pSHCreateStreamOnFileA)(const char *path, DWORD mode, IStream **stream);<br class="">+static HRESULT (WINAPI *pIStream_Size)(IStream *stream, ULARGE_INTEGER *size);<br class=""><br class=""> /* Keys used for testing */<br class=""> #define REG_TEST_KEY        "Software\\Wine\\Test"<br class="">@@ -73,6 +75,8 @@ static void init(HMODULE hshcore)<br class="">     X(SHQueryValueExA);<br class="">     X(SHRegGetPathA);<br class="">     X(SHCopyKeyA);<br class="">+    X(SHCreateStreamOnFileA);<br class="">+    X(IStream_Size);<br class=""> #undef X<br class=""> }<br class=""><br class="">@@ -671,6 +675,120 @@ static void test_SHCopyKey(void)<br class="">     delete_key( hkey, "Software\\Wine", "Test" );<br class=""> }<br class=""><br class="">+#define CHECK_FILE_SIZE(filename,exp_size) _check_file_size(filename, exp_size, __LINE__)<br class="">+static void _check_file_size(const CHAR *filename, LONG exp_size, int line)<br class="">+{<br class="">+    HANDLE handle;<br class="">+    DWORD file_size = 0xdeadbeef;<br class="">+    handle = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, 0);<br class="">+    file_size = GetFileSize(handle, NULL);<br class="">+    ok_(__FILE__,line)(file_size == exp_size, "got wrong file size: %d.\n", file_size);<br class="">+    CloseHandle(handle);<br class="">+}<br class="">+<br class="">+#define CHECK_STREAM_SIZE(obj,exp_size) _check_stream_size(obj, exp_size, __LINE__)<br class="">+static void _check_stream_size(IStream *obj, LONG exp_size, int line)<br class="">+{<br class="">+    ULARGE_INTEGER stream_size;<br class="">+    STATSTG stat;<br class="">+    HRESULT hr;<br class="">+    stream_size.QuadPart = 0xdeadbeef;<br class="">+    hr = pIStream_Size(obj, &stream_size);<br class="">+    ok_(__FILE__,line)(hr == S_OK, "IStream_Size failed: 0x%08x.\n", hr);<br class="">+    ok_(__FILE__,line)(stream_size.QuadPart == exp_size, "Size(): got wrong size of stream: %s.\n",<br class="">+                       wine_dbgstr_longlong(stream_size.QuadPart));<br class="">+    hr = IStream_Stat(obj, &stat, STATFLAG_NONAME);<br class="">+    ok_(__FILE__,line)(hr == S_OK, "IStream_Stat failed: 0x%08x.\n", hr);<br class="">+    ok_(__FILE__,line)(stat.cbSize.QuadPart == exp_size, "Stat(): got wrong size of stream: %s.\n",<br class="">+                       wine_dbgstr_longlong(stat.cbSize.QuadPart));<br class="">+}<br class="">+<br class="">+#define CHECK_STREAM_POS(obj,exp_pos) _check_stream_pos(obj, exp_pos, __LINE__)<br class="">+static void _check_stream_pos(IStream *obj, LONG exp_pos, int line)<br class="">+{<br class="">+    LARGE_INTEGER move;<br class="">+    ULARGE_INTEGER pos;<br class="">+    HRESULT hr;<br class="">+    move.QuadPart = 0;<br class="">+    pos.QuadPart = 0xdeadbeef;<br class="">+    hr = IStream_Seek(obj, move, STREAM_SEEK_CUR, &pos);<br class="">+    ok_(__FILE__,line)(hr == S_OK, "IStream_Seek failed: 0x%08x.\n", hr);<br class="">+    ok_(__FILE__,line)(pos.QuadPart == exp_pos, "got wrong position: %s.\n",<br class="">+                       wine_dbgstr_longlong(pos.QuadPart));<br class="">+}<br class="">+<br class="">+static void test_stream_size(void)<br class="">+{<br class="">+    static const byte test_data[] = {0x1,0x2,0x3,0x4,0x5,0x6};<br class="">+    static const CHAR filename[] = "test_file";<br class="">+    IStream *stream, *stream2;<br class="">+    HANDLE handle;<br class="">+    DWORD written = 0;<br class="">+    ULARGE_INTEGER stream_size;<br class="">+    HRESULT hr;<br class="">+<br class="">+    handle = CreateFileA(filename, GENERIC_READ|GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, 0);<br class="">+    ok(handle != INVALID_HANDLE_VALUE, "File creation failed: 0x%08x.\n", GetLastError());<br class="">+    WriteFile(handle, test_data, sizeof(test_data), &written, NULL);<br class="">+    ok(written == sizeof(test_data), "Failed to write data into file.\n");<br class="">+    CloseHandle(handle);<br class="">+<br class="">+    /* in read-only mode, SetSize() will success but it has no effect on Size() and the file */<br class="">+    hr = pSHCreateStreamOnFileA(filename, STGM_FAILIFTHERE|STGM_READ, &stream);<br class="">+    ok(hr == S_OK, "SHCreateStreamOnFileA failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, sizeof(test_data));<br class="">+    stream_size.QuadPart = 0;<br class="">+    hr = IStream_SetSize(stream, stream_size);<br class="">+    ok(hr == S_OK, "IStream_SetSize failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, sizeof(test_data));<br class="">+    CHECK_STREAM_POS(stream, 0);<br class="">+    stream_size.QuadPart = 100;<br class="">+    hr = IStream_SetSize(stream, stream_size);<br class="">+    ok(hr == S_OK, "IStream_SetSize failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, sizeof(test_data));<br class="">+    CHECK_STREAM_POS(stream, 100);<br class="">+    IStream_Release(stream);<br class="">+    CHECK_FILE_SIZE(filename, sizeof(test_data));<br class="">+<br class="">+    hr = pSHCreateStreamOnFileA(filename, STGM_FAILIFTHERE|STGM_WRITE, &stream);<br class="">+    ok(hr == S_OK, "SHCreateStreamOnFileA failed: 0x%08x.\n", hr);<br class="">+    hr = pSHCreateStreamOnFileA(filename, STGM_FAILIFTHERE|STGM_READ, &stream2);<br class="">+    ok(hr == S_OK, "SHCreateStreamOnFileA failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, sizeof(test_data));<br class="">+    CHECK_STREAM_SIZE(stream2, sizeof(test_data));<br class="">+    CHECK_STREAM_POS(stream, 0);<br class="">+    CHECK_STREAM_POS(stream2, 0);<br class="">+<br class="">+    stream_size.QuadPart = 0;<br class="">+    hr = IStream_SetSize(stream, stream_size);<br class="">+    ok(hr == S_OK, "IStream_SetSize failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, 0);<br class="">+    CHECK_STREAM_SIZE(stream2, 0);<br class="">+    CHECK_STREAM_POS(stream, 0);<br class="">+    CHECK_STREAM_POS(stream2, 0);<br class="">+<br class="">+    stream_size.QuadPart = 100;<br class="">+    hr = IStream_SetSize(stream, stream_size);<br class="">+    ok(hr == S_OK, "IStream_SetSize failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, 100);<br class="">+    CHECK_STREAM_SIZE(stream2, 100);<br class="">+    CHECK_STREAM_POS(stream, 0);<br class="">+    CHECK_STREAM_POS(stream2, 0);<br class="">+<br class="">+    stream_size.QuadPart = 90;<br class="">+    hr = IStream_SetSize(stream2, stream_size);<br class="">+    ok(hr == S_OK, "IStream_SetSize failed: 0x%08x.\n", hr);<br class="">+    CHECK_STREAM_SIZE(stream, 100);<br class="">+    CHECK_STREAM_SIZE(stream2, 100);<br class="">+    CHECK_STREAM_POS(stream, 0);<br class="">+    CHECK_STREAM_POS(stream2, 90);<br class="">+    IStream_Release(stream);<br class="">+    IStream_Release(stream2);<br class="">+    CHECK_FILE_SIZE(filename, 100);<br class="">+<br class="">+    DeleteFileA(filename);<br class="">+}<br class="">+<br class=""> START_TEST(shcore)<br class=""> {<br class="">     HMODULE hshcore = LoadLibraryA("shcore.dll");<br class="">@@ -695,4 +813,5 @@ START_TEST(shcore)<br class="">     test_SHQueryValueEx();<br class="">     test_SHRegGetPath();<br class="">     test_SHCopyKey();<br class="">+    test_stream_size();<br class=""> }<br class="">-- <br class="">2.15.2 (Apple Git-101.1)<br class=""><br class=""></div></div></blockquote></div><br class=""></div></body></html>