Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msvfw32/msvideo_main.c | 135 ++++++++++++++++-------------------- dlls/msvfw32/tests/msvfw.c | 11 ++- 2 files changed, 65 insertions(+), 81 deletions(-)
diff --git a/dlls/msvfw32/msvideo_main.c b/dlls/msvfw32/msvideo_main.c index 43c9afc4e5..81f4dde210 100644 --- a/dlls/msvfw32/msvideo_main.c +++ b/dlls/msvfw32/msvideo_main.c @@ -234,53 +234,6 @@ static DWORD get_size_image(LONG width, LONG height, WORD depth) return ret; }
-typedef BOOL (*enum_handler_t)(const char *name, const char *driver, unsigned int index, void *param); - -static BOOL enum_drivers(DWORD fccType, enum_handler_t handler, void* param) -{ - char fccTypeStr[4]; - char name_buf[10]; - char buf[2048]; - - DWORD i, cnt = 0, lRet; - BOOL result = FALSE; - HKEY hKey; - - fourcc_to_string(fccTypeStr, fccType); - - /* first, go through the registry entries */ - lRet = RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &hKey); - if (lRet == ERROR_SUCCESS) - { - i = 0; - for (;;) - { - DWORD name_len = 10, driver_len = 128; - lRet = RegEnumValueA(hKey, i++, name_buf, &name_len, 0, 0, (BYTE *)buf, &driver_len); - if (lRet == ERROR_NO_MORE_ITEMS) break; - if (name_len != 9 || name_buf[4] != '.') continue; - if (fccType && strncasecmp(name_buf, fccTypeStr, 4)) continue; - if ((result = handler(name_buf, buf, cnt++, param))) break; - } - RegCloseKey( hKey ); - } - if (result) return result; - - /* if that didn't work, go through the values in system.ini */ - if (GetPrivateProfileSectionA("drivers32", buf, sizeof(buf), "system.ini")) - { - char *s; - for (s = buf; *s; s += strlen(s) + 1) - { - if (s[4] != '.' || s[9] != '=') continue; - if (fccType && strncasecmp(s, fccTypeStr, 4)) continue; - if ((result = handler(s, s + 10, cnt++, param))) break; - } - } - - return result; -} - /****************************************************************** * MSVIDEO_GetHicPtr * @@ -305,27 +258,6 @@ DWORD WINAPI VideoForWindowsVersion(void) return 0x040003B6; /* 4.950 */ }
-static BOOL ICInfo_enum_handler(const char *name, const char *driver, unsigned int nr, void *param) -{ - ICINFO *lpicinfo = param; - DWORD fccType = mmioStringToFOURCCA(name, 0); - DWORD fccHandler = mmioStringToFOURCCA(name + 5, 0); - - if (lpicinfo->fccHandler != nr && compare_fourcc(lpicinfo->fccHandler, fccHandler)) - return FALSE; - - lpicinfo->fccType = fccType; - lpicinfo->fccHandler = fccHandler; - lpicinfo->dwFlags = 0; - lpicinfo->dwVersion = 0; - lpicinfo->dwVersionICM = ICVERSION; - lpicinfo->szName[0] = 0; - lpicinfo->szDescription[0] = 0; - MultiByteToWideChar(CP_ACP, 0, driver, -1, lpicinfo->szDriver, ARRAY_SIZE(lpicinfo->szDriver)); - - return TRUE; -} - /*********************************************************************** * ICInfo [MSVFW32.@] * Get information about an installable compressor. Return TRUE if there @@ -336,14 +268,69 @@ static BOOL ICInfo_enum_handler(const char *name, const char *driver, unsigned i * fccHandler [I] real fcc for handler or <n>th compressor * lpicinfo [O] information about compressor */ -BOOL VFWAPI ICInfo( DWORD fccType, DWORD fccHandler, ICINFO *lpicinfo) +BOOL VFWAPI ICInfo(DWORD type, DWORD handler, ICINFO *info) { - TRACE("(%s,%s,%p)\n", - wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), lpicinfo); + char name_buf[10], buf[2048]; + DWORD ret_type, ret_handler; + DWORD i, count = 0; + LONG res; + HKEY key; + + TRACE("type %s, handler %s, info %p.\n", + wine_dbgstr_fcc(type), wine_dbgstr_fcc(handler), info); + + memset(info, 0, sizeof(*info)); + info->dwSize = sizeof(*info); + info->dwVersionICM = ICVERSION; + + if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_QUERY_VALUE, &key)) + { + i = 0; + for (;;) + { + DWORD name_len = ARRAY_SIZE(name_buf), driver_len = ARRAY_SIZE(info->szDriver);
- lpicinfo->fccType = fccType; - lpicinfo->fccHandler = fccHandler; - return enum_drivers(fccType, ICInfo_enum_handler, lpicinfo); + res = RegEnumValueA(key, i++, name_buf, &name_len, 0, 0, (BYTE *)buf, &driver_len); + if (res == ERROR_NO_MORE_ITEMS) break; + + if (name_len != 9 || name_buf[4] != '.') continue; + ret_type = mmioStringToFOURCCA(name_buf, 0); + ret_handler = mmioStringToFOURCCA(name_buf + 5, 0); + if (type && compare_fourcc(type, ret_type)) continue; + if (compare_fourcc(handler, ret_handler) && handler != count++) continue; + + info->fccType = ret_type; + info->fccHandler = ret_handler; + MultiByteToWideChar(CP_ACP, 0, buf, -1, info->szDriver, ARRAY_SIZE(info->szDriver)); + TRACE("Returning codec %s, driver %s.\n", debugstr_a(name_buf), debugstr_a(buf)); + return TRUE; + } + RegCloseKey(key); + } + + if (GetPrivateProfileSectionA("drivers32", buf, sizeof(buf), "system.ini")) + { + char *s; + for (s = buf; *s; s += strlen(s) + 1) + { + if (s[4] != '.' || s[9] != '=') continue; + ret_type = mmioStringToFOURCCA(s, 0); + ret_handler = mmioStringToFOURCCA(s + 5, 0); + if (type && compare_fourcc(type, ret_type)) continue; + if (compare_fourcc(handler, ret_handler) && handler != count++) continue; + + info->fccType = ret_type; + info->fccHandler = ret_handler; + MultiByteToWideChar(CP_ACP, 0, s + 10, -1, info->szDriver, ARRAY_SIZE(info->szDriver)); + TRACE("Returning codec %s, driver %s.\n", debugstr_an(s, 8), debugstr_a(s + 10)); + return TRUE; + } + } + + info->fccType = type; + info->fccHandler = handler; + WARN("No driver found for codec %s.%s.\n", wine_dbgstr_fcc(type), wine_dbgstr_fcc(handler)); + return FALSE; }
static DWORD IC_HandleRef = 1; diff --git a/dlls/msvfw32/tests/msvfw.c b/dlls/msvfw32/tests/msvfw.c index ee7ed88850..6788ca0403 100644 --- a/dlls/msvfw32/tests/msvfw.c +++ b/dlls/msvfw32/tests/msvfw.c @@ -358,14 +358,12 @@ static void test_ICInfo(void) ok(!ICInfo(ICTYPE_VIDEO, mmioFOURCC('f','a','k','e'), &info), "expected failure\n"); ok(info.fccType == ICTYPE_VIDEO, "got 0x%08x\n", info.fccType); ok(info.fccHandler == mmioFOURCC('f','a','k','e'), "got 0x%08x\n", info.fccHandler); -todo_wine { ok(!info.dwFlags, "Got unexpected flags %#x.\n", info.dwFlags); ok(!info.dwVersion, "Got unexpected version %#x.\n", info.dwVersion); ok(info.dwVersionICM == ICVERSION, "Got unexpected ICM version %#x.\n", info.dwVersionICM); ok(!info.szName[0], "Got unexpected name %s.\n", wine_dbgstr_w(info.szName)); ok(!info.szDescription[0], "Got unexpected name %s.\n", wine_dbgstr_w(info.szDescription)); ok(!info.szDriver[0], "Got unexpected driver %s.\n", wine_dbgstr_w(info.szDriver)); -}
if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, "Software\Microsoft\Windows NT" "\CurrentVersion\Drivers32", 0, KEY_ALL_ACCESS, &key)) @@ -386,14 +384,13 @@ todo_wine ok(ICInfo(test_type, test_handler, &info), "Expected success.\n"); ok(info.fccType == test_type, "Got unexpected type %#x.\n", info.fccType); ok(info.fccHandler == test_handler, "Got unexpected handler %#x.\n", info.fccHandler); -todo_wine { ok(!info.dwFlags, "Got unexpected flags %#x.\n", info.dwFlags); ok(!info.dwVersion, "Got unexpected version %#x.\n", info.dwVersion); ok(info.dwVersionICM == ICVERSION, "Got unexpected ICM version %#x.\n", info.dwVersionICM); ok(!info.szName[0], "Got unexpected name %s.\n", wine_dbgstr_w(info.szName)); ok(!info.szDescription[0], "Got unexpected name %s.\n", wine_dbgstr_w(info.szDescription)); +todo_wine ok(!lstrcmpW(info.szDriver, bogusW), "Got unexpected driver %s.\n", wine_dbgstr_w(info.szDriver)); -}
/* Drivers installed after msvfw32 is loaded are not enumerated. */ ok(!ICInfo(test_type, 0, &info), "Expected failure.\n"); @@ -439,13 +436,14 @@ todo_wine { ok(ICInfo(test_type, test_handler, &enum_info), "Expected success.\n"); ok(!enum_info.fccType, "Got unexpected type %#x.\n", enum_info.fccType); ok(!enum_info.fccHandler, "Got unexpected handler %#x.\n", enum_info.fccHandler); +} ok(!enum_info.dwFlags, "Got unexpected flags %#x.\n", enum_info.dwFlags); +todo_wine ok(enum_info.dwVersion == 0xdeadbeef, "Got unexpected version %#x.\n", enum_info.dwVersion); ok(enum_info.dwVersionICM == ICVERSION, "Got unexpected ICM version %#x.\n", enum_info.dwVersionICM); ok(!enum_info.szName[0], "Got unexpected name %s.\n", wine_dbgstr_w(enum_info.szName)); ok(!enum_info.szDescription[0], "Got unexpected name %s.\n", wine_dbgstr_w(enum_info.szDescription)); ok(!enum_info.szDriver[0], "Got unexpected driver %s.\n", wine_dbgstr_w(enum_info.szDriver)); -}
/* Functions installed after msvfw32 is loaded are enumerated. */ memset(&enum_info, 0x55, sizeof(enum_info)); @@ -455,14 +453,13 @@ todo_wine { ok(!enum_info.fccType, "Got unexpected type %#x.\n", enum_info.fccType); } ok(!enum_info.fccHandler, "Got unexpected handler %#x.\n", enum_info.fccHandler); -todo_wine { ok(!enum_info.dwFlags, "Got unexpected flags %#x.\n", enum_info.dwFlags); +todo_wine ok(enum_info.dwVersion == 0xdeadbeef, "Got unexpected version %#x.\n", enum_info.dwVersion); ok(enum_info.dwVersionICM == ICVERSION, "Got unexpected ICM version %#x.\n", enum_info.dwVersionICM); ok(!enum_info.szName[0], "Got unexpected name %s.\n", wine_dbgstr_w(enum_info.szName)); ok(!enum_info.szDescription[0], "Got unexpected name %s.\n", wine_dbgstr_w(enum_info.szDescription)); ok(!enum_info.szDriver[0], "Got unexpected driver %s.\n", wine_dbgstr_w(enum_info.szDriver)); -}
ret = ICRemove(test_type, test_handler, 0); ok(ret, "Failed to remove driver.\n");