From 6abdcbfc5ed433ab4279755315c6aaa0b01c6863 Mon Sep 17 00:00:00 2001 From: Lei Zhang Date: Fri, 25 Apr 2008 13:57:44 -0700 Subject: [PATCH] advapi32: attempt to use UuidToStringA if UuidToStringW is not available. --- dlls/advapi32/crypt.c | 63 ++++++++++++++++++++++++++++++++++++++++-------- 1 files changed, 52 insertions(+), 11 deletions(-) diff --git a/dlls/advapi32/crypt.c b/dlls/advapi32/crypt.c index 0fadc78..173fd33 100644 --- a/dlls/advapi32/crypt.c +++ b/dlls/advapi32/crypt.c @@ -275,6 +275,7 @@ static void CRYPT_CreateMachineGuid(void) 'C','r','y','p','t','o','g','r','a','p','h','y',0 }; static const WCHAR machineGuidW[] = { 'M','a','c','h','i','n','e','G','u','i','d',0 }; + static const char machineGuid[] = "MachineGuid"; LONG r; HKEY key; @@ -294,20 +295,60 @@ static void CRYPT_CreateMachineGuid(void) if (lib) { RPC_STATUS (RPC_ENTRY *pUuidCreate)(UUID *); - RPC_STATUS (RPC_ENTRY *pUuidToString)(UUID *, WCHAR **); - RPC_STATUS (RPC_ENTRY *pRpcStringFree)(WCHAR **); + RPC_STATUS (RPC_ENTRY *pUuidToStringW)(UUID *, WCHAR **); + RPC_STATUS (RPC_ENTRY *pRpcStringFreeW)(WCHAR **); UUID uuid; - WCHAR *uuidStr; + WCHAR *uuidStrW; + RPC_STATUS rs; + BOOL unicode = TRUE; pUuidCreate = GetProcAddress(lib, "UuidCreate"); - pUuidToString = GetProcAddress(lib, "UuidToStringW"); - pRpcStringFree = GetProcAddress(lib, "RpcStringFreeW"); - pUuidCreate(&uuid); - pUuidToString(&uuid, &uuidStr); - RegSetValueExW(key, machineGuidW, 0, REG_SZ, - (const BYTE *)uuidStr, - (lstrlenW(uuidStr)+1)*sizeof(WCHAR)); - pRpcStringFree(&uuidStr); + if (!pUuidCreate) + goto CreateMachineGuidCleaup; + + pUuidToStringW = GetProcAddress(lib, "UuidToStringW"); + pRpcStringFreeW = GetProcAddress(lib, "RpcStringFreeW"); + if (!pUuidToStringW || !pRpcStringFreeW) + unicode = FALSE; + + pUuidCreate(&uuid); + + if (unicode) + { + rs = pUuidToStringW(&uuid, &uuidStrW); + if (rs == RPC_S_CANNOT_SUPPORT) + unicode = FALSE; + else if (rs != S_OK) + goto CreateMachineGuidCleaup; + if (unicode) + { + RegSetValueExW(key, machineGuidW, 0, REG_SZ, + (const BYTE *)uuidStrW, + (lstrlenW(uuidStrW)+1)*sizeof(WCHAR)); + pRpcStringFreeW(&uuidStrW); + } + } + + /* In case unicode version failed */ + if (!unicode) + { + RPC_STATUS (RPC_ENTRY *pUuidToString)(UUID *, char **); + RPC_STATUS (RPC_ENTRY *pRpcStringFree)(char **); + char *uuidStr; + + pUuidToString = GetProcAddress(lib, "UuidToStringA"); + pRpcStringFree = GetProcAddress(lib, "RpcStringFreeA"); + if (!pUuidToString || !pRpcStringFree) + goto CreateMachineGuidCleaup; + rs = pUuidToString(&uuid, &uuidStr); + if (rs != S_OK) + goto CreateMachineGuidCleaup; + RegSetValueExA(key, machineGuid, 0, REG_SZ, + (const BYTE *)uuidStr, + (lstrlenA(uuidStr)+1)); + pRpcStringFree(&uuidStr); + } +CreateMachineGuidCleaup: FreeLibrary(lib); } } -- 1.5.3.6