From caae01f8becfd8df94edf4cdc8f51c41485f4610 Mon Sep 17 00:00:00 2001 From: Juan Lang Date: Thu, 11 Oct 2007 14:06:06 -0700 Subject: [PATCH] setupapi: Test SetupDiInstallClass. --- dlls/setupapi/tests/devinst.c | 90 ++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/dlls/setupapi/tests/devinst.c b/dlls/setupapi/tests/devinst.c index 0b58e4e4f4a..a27fa5bedd3 100644 --- a/dlls/setupapi/tests/devinst.c +++ b/dlls/setupapi/tests/devinst.c @@ -20,7 +20,7 @@ #include #include - +#include #include "windef.h" #include "winbase.h" #include "wingdi.h" @@ -39,6 +39,7 @@ static BOOL (WINAPI *pSetupDiCreateDeviceInterfaceA)(HDEVINFO, PSP_DEVINFO_D static BOOL (WINAPI *pSetupDiDestroyDeviceInfoList)(HDEVINFO); static BOOL (WINAPI *pSetupDiEnumDeviceInfo)(HDEVINFO, DWORD, PSP_DEVINFO_DATA); static BOOL (WINAPI *pSetupDiEnumDeviceInterfaces)(HDEVINFO, PSP_DEVINFO_DATA, const GUID *, DWORD, PSP_DEVICE_INTERFACE_DATA); +static BOOL (WINAPI *pSetupDiInstallClassA)(HWND, PCSTR, DWORD, HSPFILEQ); static HKEY (WINAPI *pSetupDiOpenClassRegKeyExA)(GUID*,REGSAM,DWORD,PCSTR,PVOID); static BOOL (WINAPI *pSetupDiCreateDeviceInfoA)(HDEVINFO, PCSTR, GUID *, PCSTR, HWND, DWORD, PSP_DEVINFO_DATA); static BOOL (WINAPI *pSetupDiGetDeviceInstanceIdA)(HDEVINFO, PSP_DEVINFO_DATA, PSTR, DWORD, PDWORD); @@ -58,6 +59,7 @@ static void init_function_pointers(void) pSetupDiEnumDeviceInterfaces = (void *)GetProcAddress(hSetupAPI, "SetupDiEnumDeviceInterfaces"); pSetupDiGetDeviceInstanceIdA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceInstanceIdA"); pSetupDiGetDeviceInterfaceDetailA = (void *)GetProcAddress(hSetupAPI, "SetupDiGetDeviceInterfaceDetailA"); + pSetupDiInstallClassA = (void *)GetProcAddress(hSetupAPI, "SetupDiInstallClassA"); pSetupDiOpenClassRegKeyExA = (void *)GetProcAddress(hSetupAPI, "SetupDiOpenClassRegKeyExA"); pSetupDiRegisterDeviceInfo = (void *)GetProcAddress(hSetupAPI, "SetupDiRegisterDeviceInfo"); } @@ -139,6 +141,91 @@ static void test_SetupDiOpenClassRegKeyExA(void) trace("failed to open classes key\n"); } +static void append_str(char **str, const char *data) +{ + sprintf(*str, data); + *str += strlen(*str); +} + +static void create_inf_file(LPCSTR filename) +{ + char data[1024]; + char *ptr = data; + DWORD dwNumberOfBytesWritten; + HANDLE hf = CreateFile(filename, GENERIC_WRITE, 0, NULL, + CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + + append_str(&ptr, "[Version]\n"); + append_str(&ptr, "Signature=\"$Chicago$\"\n"); + append_str(&ptr, "Class=Bogus\n"); + append_str(&ptr, "ClassGUID={6a55b5a4-3f65-11db-b704-0011955c2bdb}\n"); + append_str(&ptr, "[ClassInstall32]\n"); + append_str(&ptr, "AddReg=BogusClass.NT.AddReg\n"); + append_str(&ptr, "[BogusClass.NT.AddReg]\n"); + append_str(&ptr, "HKR,,,,\"Wine test devices\"\n"); + + WriteFile(hf, data, ptr - data, &dwNumberOfBytesWritten, NULL); + CloseHandle(hf); +} + +static void get_temp_filename(LPSTR path) +{ + static char curr[MAX_PATH] = { 0 }; + char temp[MAX_PATH]; + LPSTR ptr; + + if (!*curr) + GetCurrentDirectoryA(MAX_PATH, curr); + GetTempFileNameA(curr, "set", 0, temp); + ptr = strrchr(temp, '\\'); + + lstrcpyA(path, ptr + 1); +} + +static void testInstallClass(void) +{ + static const WCHAR classKey[] = {'S','y','s','t','e','m','\\', + 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\', + 'C','o','n','t','r','o','l','\\','C','l','a','s','s','\\', + '{','6','a','5','5','b','5','a','4','-','3','f','6','5','-', + '1','1','d','b','-','b','7','0','4','-', + '0','0','1','1','9','5','5','c','2','b','d','b','}',0}; + char tmpfile[MAX_PATH], dstfile[MAX_PATH * 2]; + BOOL ret; + + if (!pSetupDiInstallClassA) + { + skip("No SetupDiInstallClassA\n"); + return; + } + tmpfile[0] = '.'; + tmpfile[1] = '\\'; + get_temp_filename(tmpfile + 2); + create_inf_file(tmpfile + 2); + + ret = pSetupDiInstallClassA(NULL, NULL, 0, NULL); + todo_wine + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError()); + ret = pSetupDiInstallClassA(NULL, NULL, DI_NOVCP, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError()); + ret = pSetupDiInstallClassA(NULL, tmpfile + 2, DI_NOVCP, NULL); + ok(!ret && GetLastError() == ERROR_INVALID_PARAMETER, + "Expected ERROR_INVALID_PARAMETER, got %08x\n", GetLastError()); + ret = pSetupDiInstallClassA(NULL, tmpfile + 2, 0, NULL); + ok(!ret && GetLastError() == ERROR_FILE_NOT_FOUND, + "Expected ERROR_FILE_NOT_FOUND, got %08x\n", GetLastError()); + ret = pSetupDiInstallClassA(NULL, tmpfile, 0, NULL); + ok(ret, "SetupDiInstallClassA failed: %08x\n", GetLastError()); + RegDeleteKeyW(HKEY_LOCAL_MACHINE, classKey); + GetWindowsDirectoryA(dstfile, MAX_PATH); + lstrcatA(dstfile, "inf\\"); + lstrcatA(dstfile, tmpfile + 2); + DeleteFile(dstfile); + DeleteFile(tmpfile); +} + static void testCreateDeviceInfo(void) { BOOL ret; @@ -510,6 +597,7 @@ START_TEST(devinst) test_SetupDiOpenClassRegKeyExA(); else skip("SetupDiOpenClassRegKeyExA is not available\n"); + testInstallClass(); testCreateDeviceInfo(); testGetDeviceInstanceId(); testRegisterDeviceInfo();