Module: wine Branch: stable Commit: d63079f2c71306743a7ca924916ac37e57e274c8 URL: https://source.winehq.org/git/wine.git/?a=commit;h=d63079f2c71306743a7ca9249... Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Fri Apr 5 19:41:13 2019 -0500 devenum: Return S_FALSE from CreateClassEnumerator() if no devices exist. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46316 Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> (cherry picked from commit e0da0b777a293059c32a7c846dff16ef0738b2de) Signed-off-by: Michael Stefaniuc <mstefani(a)winehq.org> --- dlls/devenum/createdevenum.c | 18 +++++++++++++++++- dlls/devenum/tests/devenum.c | 6 ++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c index 8a3160c..65c1ccd 100644 --- a/dlls/devenum/createdevenum.c +++ b/dlls/devenum/createdevenum.c @@ -862,7 +862,23 @@ static HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator( else if (IsEqualGUID(class, &CLSID_VideoInputDeviceCategory)) register_avicap_devices(); - return create_EnumMoniker(class, out); + if (SUCCEEDED(hr = create_EnumMoniker(class, out))) + { + IMoniker *mon; + hr = IEnumMoniker_Next(*out, 1, &mon, NULL); + if (hr == S_OK) + { + IMoniker_Release(mon); + IEnumMoniker_Reset(*out); + } + else + { + IEnumMoniker_Release(*out); + *out = NULL; + } + } + + return hr; } /********************************************************************** diff --git a/dlls/devenum/tests/devenum.c b/dlls/devenum/tests/devenum.c index e31f65c..1ce0d04 100644 --- a/dlls/devenum/tests/devenum.c +++ b/dlls/devenum/tests/devenum.c @@ -68,6 +68,7 @@ static void test_devenum(IBindCtx *bind_ctx) WCHAR *displayname; VARIANT var; HRESULT hr; + int count; hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC, &IID_ICreateDevEnum, (LPVOID*)&create_devenum); @@ -104,6 +105,8 @@ static void test_devenum(IBindCtx *bind_ctx) if (hr == S_OK) { + count = 0; + while (IEnumMoniker_Next(enum_moniker, 1, &moniker, NULL) == S_OK) { hr = IMoniker_GetDisplayName(moniker, NULL, NULL, &displayname); @@ -134,8 +137,11 @@ static void test_devenum(IBindCtx *bind_ctx) CoTaskMemFree(displayname); IPropertyBag_Release(prop_bag); IMoniker_Release(moniker); + count++; } IEnumMoniker_Release(enum_moniker); + + ok(count > 0, "CreateClassEnumerator() returned S_OK but no devices were enumerated.\n"); } }