From: Alex Henrie alexhenrie24@gmail.com
--- dlls/setupapi/misc.c | 9 +++++++++ dlls/setupapi/setupapi.spec | 3 +++ dlls/setupapi/tests/misc.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 45 insertions(+)
diff --git a/dlls/setupapi/misc.c b/dlls/setupapi/misc.c index f9d34b5353d..82f2bc2ff0c 100644 --- a/dlls/setupapi/misc.c +++ b/dlls/setupapi/misc.c @@ -135,6 +135,9 @@ LPWSTR WINAPI DuplicateString(LPCWSTR lpSrc) { LPWSTR lpDst;
+ if (!lpSrc) + return NULL; + lpDst = MyMalloc((lstrlenW(lpSrc) + 1) * sizeof(WCHAR)); if (lpDst == NULL) return NULL; @@ -236,6 +239,9 @@ LPWSTR WINAPI MultiByteToUnicode(LPCSTR lpMultiByteStr, UINT uCodePage) LPWSTR lpUnicodeStr; int nLength;
+ if (!lpMultiByteStr) + return NULL; + nLength = MultiByteToWideChar(uCodePage, 0, lpMultiByteStr, -1, NULL, 0); if (nLength == 0) @@ -277,6 +283,9 @@ LPSTR WINAPI UnicodeToMultiByte(LPCWSTR lpUnicodeStr, UINT uCodePage) LPSTR lpMultiByteStr; int nLength;
+ if (!lpUnicodeStr) + return NULL; + nLength = WideCharToMultiByte(uCodePage, 0, lpUnicodeStr, -1, NULL, 0, NULL, NULL); if (nLength == 0) diff --git a/dlls/setupapi/setupapi.spec b/dlls/setupapi/setupapi.spec index 7578fb25c9c..7cb25945ccf 100644 --- a/dlls/setupapi/setupapi.spec +++ b/dlls/setupapi/setupapi.spec @@ -572,6 +572,7 @@ @ stub pSetupAppendStringToMultiSz @ stub pSetupDestroyRunOnceNodeList @ stub pSetupDirectoryIdToPath +@ stdcall pSetupDuplicateString(ptr) DuplicateString @ stdcall pSetupFree(ptr) MyFree @ stdcall pSetupGetField(ptr long) @ stdcall pSetupGetGlobalFlags() @@ -584,6 +585,7 @@ @ stdcall pSetupIsUserAdmin() IsUserAdmin @ stub pSetupMakeSurePathExists @ stdcall pSetupMalloc(long) MyMalloc +@ stdcall pSetupMultiByteToUnicode(str long) MultiByteToUnicode @ stdcall pSetupRealloc(ptr long) MyRealloc @ stdcall pSetupSetGlobalFlags(long) @ stdcall pSetupSetQueueFlags(ptr long) @@ -600,5 +602,6 @@ @ stdcall pSetupStringTableLookUpString(ptr wstr long) StringTableLookUpString @ stdcall pSetupStringTableLookUpStringEx(ptr wstr long ptr ptr) StringTableLookUpStringEx @ stdcall pSetupStringTableSetExtraData(ptr long ptr long) StringTableSetExtraData +@ stdcall pSetupUnicodeToMultiByte(wstr long) UnicodeToMultiByte @ stub pSetupVerifyCatalogFile @ stub pSetupVerifyQueuedCatalogs diff --git a/dlls/setupapi/tests/misc.c b/dlls/setupapi/tests/misc.c index b9eb3e6c75f..70c4b212fd4 100644 --- a/dlls/setupapi/tests/misc.c +++ b/dlls/setupapi/tests/misc.c @@ -47,9 +47,12 @@ static CHAR CURR_DIR[MAX_PATH]; * - copy styles */
+static WCHAR* (WINAPI *pDuplicateString)(const WCHAR*); static void (WINAPI *pMyFree)(void*); +static WCHAR* (WINAPI *pMultiByteToUnicode)(const char*, UINT); static BOOL (WINAPI *pSetupGetFileCompressionInfoExA)(PCSTR, PSTR, DWORD, PDWORD, PDWORD, PDWORD, PUINT); static BOOL (WINAPI *pSetupQueryInfOriginalFileInformationA)(PSP_INF_INFORMATION, UINT, PSP_ALTPLATFORM_INFO, PSP_ORIGINAL_FILE_INFO_A); +static char* (WINAPI *pUnicodeToMultiByte)(const WCHAR*, UINT);
static void create_file(const char *name, const char *data) { @@ -904,6 +907,32 @@ static void test_device_interfaces(void) SetupDiDestroyDeviceInfoList(devinfo); }
+static void test_string_functions(void) +{ + static const char srcA[] = "Hello world!"; + static const WCHAR srcW[] = L"Hello world!"; + char *dstA; + WCHAR *dstW; + + ok(pDuplicateString(NULL) == NULL, "Expected NULL\n"); + ok(!!(dstW = pDuplicateString(srcW)), "Expected non-NULL\n"); + ok(dstW != srcW, "Expected dstA != srcA\n"); + ok(wcscmp(srcW, dstW) == 0, "Expected 0\n"); + pMyFree(dstW); + + ok(pMultiByteToUnicode(NULL, CP_ACP) == NULL, "Expected NULL\n"); + ok(!!(dstW = pMultiByteToUnicode(srcA, CP_ACP)), "Expected non-NULL\n"); + ok(wcscmp(srcW, dstW) == 0, "Expected 0\n"); + pMyFree(dstW); + + ok(pUnicodeToMultiByte(NULL, CP_ACP) == NULL, "Expected NULL\n"); + ok(!!(dstA = pUnicodeToMultiByte(srcW, CP_ACP)), "Expected non-NULL\n"); + ok(strcmp(srcA, dstA) == 0, "Expected 0\n"); + pMyFree(dstA); + + pMyFree(NULL); /* should not crash */ +} + START_TEST(misc) { HMODULE hsetupapi = GetModuleHandleA("setupapi.dll"); @@ -911,6 +940,9 @@ START_TEST(misc) pMyFree = (void*)GetProcAddress(hsetupapi, "MyFree"); pSetupGetFileCompressionInfoExA = (void*)GetProcAddress(hsetupapi, "SetupGetFileCompressionInfoExA"); pSetupQueryInfOriginalFileInformationA = (void*)GetProcAddress(hsetupapi, "SetupQueryInfOriginalFileInformationA"); + pDuplicateString = (void*)GetProcAddress(hsetupapi, "pSetupDuplicateString"); + pMultiByteToUnicode = (void*)GetProcAddress(hsetupapi, "pSetupMultiByteToUnicode"); + pUnicodeToMultiByte = (void*)GetProcAddress(hsetupapi, "pSetupUnicodeToMultiByte");
GetCurrentDirectoryA(MAX_PATH, CURR_DIR);
@@ -928,4 +960,5 @@ START_TEST(misc) test_SetupLogError(); test_CM_Get_Version(); test_device_interfaces(); + test_string_functions(); }