Signed-off-by: Zebediah Figura z.figura12@gmail.com --- dlls/msvfw32/msvideo_main.c | 96 ++++++++++++++++++++----------------- dlls/msvfw32/tests/msvfw.c | 5 +- 2 files changed, 53 insertions(+), 48 deletions(-)
diff --git a/dlls/msvfw32/msvideo_main.c b/dlls/msvfw32/msvideo_main.c index 81f4dde210..6631060d5d 100644 --- a/dlls/msvfw32/msvideo_main.c +++ b/dlls/msvfw32/msvideo_main.c @@ -108,7 +108,6 @@ struct _reg_driver DWORD fccType; DWORD fccHandler; DRIVERPROC proc; - LPWSTR name; struct list entry; };
@@ -336,77 +335,92 @@ BOOL VFWAPI ICInfo(DWORD type, DWORD handler, ICINFO *info) static DWORD IC_HandleRef = 1;
/*********************************************************************** - * ICInstall [MSVFW32.@] + * ICInstall [MSVFW32.@] */ -BOOL VFWAPI ICInstall(DWORD fccType, DWORD fccHandler, LPARAM lParam, LPSTR szDesc, UINT wFlags) +BOOL VFWAPI ICInstall(DWORD type, DWORD handler, LPARAM lparam, char *desc, UINT flags) { - reg_driver* driver; - unsigned len; + reg_driver *driver;
- TRACE("(%s,%s,%p,%p,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), (void*)lParam, szDesc, wFlags); + TRACE("type %s, handler %s, lparam %#lx, desc %s, flags %#x.\n", + wine_dbgstr_fcc(type), wine_dbgstr_fcc(handler), lparam, debugstr_a(desc), flags);
- /* Check if a driver is already registered */ LIST_FOR_EACH_ENTRY(driver, ®_driver_list, reg_driver, entry) { - if (!compare_fourcc(fccType, driver->fccType) && - !compare_fourcc(fccHandler, driver->fccHandler)) + if (!compare_fourcc(type, driver->fccType) + && !compare_fourcc(handler, driver->fccHandler)) { return FALSE; } }
- /* Register the driver */ - if (!(driver = heap_alloc_zero(sizeof(*driver)))) - return FALSE; - driver->fccType = fccType; - driver->fccHandler = fccHandler; - - switch(wFlags) + switch (flags) { case ICINSTALL_FUNCTION: - driver->proc = (DRIVERPROC)lParam; - break; + if (!(driver = heap_alloc_zero(sizeof(*driver)))) + return FALSE; + driver->fccType = type; + driver->fccHandler = handler; + driver->proc = (DRIVERPROC)lparam; + list_add_tail(®_driver_list, &driver->entry); + return TRUE; case ICINSTALL_DRIVER: - len = MultiByteToWideChar(CP_ACP, 0, (char*)lParam, -1, NULL, 0); - if (!(driver->name = heap_alloc(len * sizeof(WCHAR)))) - { - heap_free(driver); + { + const char *driver = (const char *)lparam; + char value[10]; + HKEY key; + LONG res; + + if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_SET_VALUE, &key)) return FALSE; - } - MultiByteToWideChar(CP_ACP, 0, (char*)lParam, -1, driver->name, len); - break; + fourcc_to_string(value, type); + value[4] = '.'; + fourcc_to_string(value + 5, handler); + value[9] = 0; + res = RegSetValueExA(key, value, 0, REG_SZ, (const BYTE *)driver, strlen(driver) + 1); + RegCloseKey(key); + return !res; + } default: - ERR("Invalid flags!\n"); - heap_free(driver); + FIXME("Unhandled flags %#x.\n", flags); return FALSE; } - - list_add_tail(®_driver_list, &driver->entry); - - return TRUE; }
/*********************************************************************** - * ICRemove [MSVFW32.@] + * ICRemove [MSVFW32.@] */ -BOOL VFWAPI ICRemove(DWORD fccType, DWORD fccHandler, UINT wFlags) +BOOL VFWAPI ICRemove(DWORD type, DWORD handler, UINT flags) { reg_driver *driver; + char value[10]; + HKEY key; + LONG res;
- TRACE("(%s,%s,0x%08x)\n", wine_dbgstr_fcc(fccType), wine_dbgstr_fcc(fccHandler), wFlags); + TRACE("type %s, handler %s, flags %#x.\n", + wine_dbgstr_fcc(type), wine_dbgstr_fcc(handler), flags);
LIST_FOR_EACH_ENTRY(driver, ®_driver_list, reg_driver, entry) { - if (!compare_fourcc(fccType, driver->fccType) - && !compare_fourcc(fccHandler, driver->fccHandler)) + if (!compare_fourcc(type, driver->fccType) + && !compare_fourcc(handler, driver->fccHandler)) { list_remove(&driver->entry); - heap_free(driver->name); heap_free(driver); return TRUE; } }
+ if (!RegOpenKeyExA(HKEY_LOCAL_MACHINE, HKLM_DRIVERS32, 0, KEY_SET_VALUE, &key)) + { + fourcc_to_string(value, type); + value[4] = '.'; + fourcc_to_string(value + 5, handler); + value[9] = 0; + res = RegDeleteValueA(key, value); + RegCloseKey(key); + return !res; + } + return FALSE; }
@@ -452,13 +466,7 @@ HIC VFWAPI ICOpen(DWORD fccType, DWORD fccHandler, UINT wMode) if (!compare_fourcc(fccType, driver->fccType) && !compare_fourcc(fccHandler, driver->fccHandler)) { - if (driver->proc) - return ICOpenFunction(driver->fccType, driver->fccHandler, wMode, driver->proc); - else - { - if (!(hdrv = OpenDriver(driver->name, NULL, (LPARAM)&icopen))) - return NULL; - } + return ICOpenFunction(driver->fccType, driver->fccHandler, wMode, driver->proc); } }
diff --git a/dlls/msvfw32/tests/msvfw.c b/dlls/msvfw32/tests/msvfw.c index 6788ca0403..bb54d43921 100644 --- a/dlls/msvfw32/tests/msvfw.c +++ b/dlls/msvfw32/tests/msvfw.c @@ -373,14 +373,11 @@ static void test_ICInfo(void)
size = sizeof(buffer); res = RegQueryValueExA(key, "wine.test", NULL, NULL, (BYTE *)buffer, &size); -todo_wine { ok(!res, "Failed to query value, error %d.\n", res); ok(!strcmp(buffer, "bogus"), "Got unexpected value "%s".\n", buffer); -}
memset(&info, 0x55, sizeof(info)); info.dwSize = sizeof(info); -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); @@ -389,10 +386,10 @@ todo_wine 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. */ +todo_wine ok(!ICInfo(test_type, 0, &info), "Expected failure.\n");
ret = ICRemove(test_type, test_handler, 0);