[PATCH 0/3] MR10708: mfplat: Strip leading slashes from the URL in source_resolver_CreateObjectFromURL().
From: Conor McCarthy <cmccarthy@codeweavers.com> Fixes access denied in Windows 11. --- dlls/mfplat/tests/mfplat.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index e28fece1418..6a15b646b77 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -2976,7 +2976,6 @@ static void test_MFCreateMFByteStreamOnStream(void) static void test_file_stream(void) { - static const WCHAR newfilename[] = L"new.mp4"; IMFByteStream *bytestream, *bytestream2; QWORD bytestream_length, position; IMFAttributes *attributes = NULL; @@ -3074,8 +3073,11 @@ static void test_file_stream(void) IMFByteStream_Release(bytestream); + GetTempPathW(ARRAY_SIZE(pathW), pathW); + lstrcatW(pathW, L"new.mp4"); + hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, - MF_FILEFLAGS_NONE, newfilename, &bytestream); + MF_FILEFLAGS_NONE, pathW, &bytestream); ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_EXIST, @@ -3083,31 +3085,32 @@ static void test_file_stream(void) ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_EXISTS), "Unexpected hr %#lx.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_EXIST, - MF_FILEFLAGS_NONE, newfilename, &bytestream); + MF_FILEFLAGS_NONE, pathW, &bytestream); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); - hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2); + hr = MFCreateFile(MF_ACCESSMODE_READ, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, pathW, &bytestream2); ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); - hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, newfilename, &bytestream2); + hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_NONE, pathW, &bytestream2); ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, - newfilename, &bytestream2); + pathW, &bytestream2); ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); IMFByteStream_Release(bytestream); hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, - MF_FILEFLAGS_ALLOW_WRITE_SHARING, newfilename, &bytestream); + MF_FILEFLAGS_ALLOW_WRITE_SHARING, pathW, &bytestream); ok(hr == S_OK, "Unexpected hr %#lx.\n", hr); /* Opening the file again fails even though MF_FILEFLAGS_ALLOW_WRITE_SHARING is set. */ hr = MFCreateFile(MF_ACCESSMODE_WRITE, MF_OPENMODE_FAIL_IF_NOT_EXIST, MF_FILEFLAGS_ALLOW_WRITE_SHARING, - newfilename, &bytestream2); + pathW, &bytestream2); ok(hr == HRESULT_FROM_WIN32(ERROR_SHARING_VIOLATION), "Unexpected hr %#lx.\n", hr); IMFByteStream_Release(bytestream); + DeleteFileW(pathW); /* Explicit file: scheme */ lstrcpyW(pathW, fileschemeW); @@ -3122,8 +3125,6 @@ static void test_file_stream(void) hr = MFShutdown(); ok(hr == S_OK, "Failed to shut down, hr %#lx.\n", hr); - - DeleteFileW(newfilename); } static void test_system_memory_buffer(void) -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10708
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfplat/tests/mfplat.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index 6a15b646b77..b3eafd03112 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -1276,6 +1276,8 @@ static void test_source_resolver(void) ULONG refcount; BOOL ret; + static const WCHAR *slashes[] = {L"/", L"//", L"///", L"/////"}; + if (!pMFCreateSourceResolver) { win_skip("MFCreateSourceResolver() not found\n"); @@ -1340,6 +1342,19 @@ static void test_source_resolver(void) if (SUCCEEDED(hr)) WaitForSingleObject(callback->event, INFINITE); + /* With leading forward slash. */ + for (i = 0; i < ARRAY_SIZE(slashes); ++i) + { + lstrcpyW(pathW, slashes[i]); + lstrcatW(pathW, filename); + hr = IMFSourceResolver_CreateObjectFromURL(resolver, pathW, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, + (IUnknown **)&stream); + todo_wine + ok(hr == S_OK, "Failed to resolve url, hr %#lx.\n", hr); + if (SUCCEEDED(hr)) + IMFByteStream_Release(stream); + } + /* With explicit scheme. */ lstrcpyW(pathW, fileschemeW); lstrcatW(pathW, filename); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10708
From: Conor McCarthy <cmccarthy@codeweavers.com> --- dlls/mfplat/main.c | 6 ++++++ dlls/mfplat/tests/mfplat.c | 4 +--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/dlls/mfplat/main.c b/dlls/mfplat/main.c index da9dce416ba..8e36a9f7e8a 100644 --- a/dlls/mfplat/main.c +++ b/dlls/mfplat/main.c @@ -6596,6 +6596,12 @@ static HRESULT WINAPI source_resolver_CreateObjectFromURL(IMFSourceResolver *ifa data = (RTWQASYNCRESULT *)result; data->hEvent = CreateEventW(NULL, FALSE, FALSE, NULL); + /* Native allows leading slashes in file paths. BeginCreateObject() does not accept them. + * TODO: the correct way to handle this may be to prepend "file://" to the url. + * Ultimately it should probably be converted in the handler using MFCreatePathFromURL(). */ + while (*url == L'/') + ++url; + hr = IMFSchemeHandler_BeginCreateObject(handler, url, flags, props, NULL, (IMFAsyncCallback *)&resolver->url_callback, (IUnknown *)result); if (FAILED(hr)) diff --git a/dlls/mfplat/tests/mfplat.c b/dlls/mfplat/tests/mfplat.c index b3eafd03112..b3e7dca3534 100644 --- a/dlls/mfplat/tests/mfplat.c +++ b/dlls/mfplat/tests/mfplat.c @@ -1349,10 +1349,8 @@ static void test_source_resolver(void) lstrcatW(pathW, filename); hr = IMFSourceResolver_CreateObjectFromURL(resolver, pathW, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, (IUnknown **)&stream); - todo_wine ok(hr == S_OK, "Failed to resolve url, hr %#lx.\n", hr); - if (SUCCEEDED(hr)) - IMFByteStream_Release(stream); + IMFByteStream_Release(stream); } /* With explicit scheme. */ -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10708
Could you try to test what happens with this on Windows? Specifically what the url looks like when it reaches the handler. I don't know if it's possible to override the file:// handler with MFRegisterLocalSchemeHandler(). Or maybe this is stripped earlier in case of "///schema://..." to pick up correct handler. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10708#note_137192
participants (3)
-
Conor McCarthy -
Conor McCarthy (@cmccarthy) -
Nikolay Sivov (@nsivov)