From 77b12768c9fc20d172467bfcd0d6e5fbb919d068 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Fri, 9 Jul 2004 19:43:29 +0000 Subject: [PATCH] Authors: Aric Stewart , Mike McCormack Write the encoded GUIDs for product registration in the Installer registry. --- dlls/msi/action.c | 33 ++++++++++++++++++++--- dlls/msi/msi.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ dlls/msi/msipriv.h | 2 ++ 3 files changed, 109 insertions(+), 3 deletions(-) diff --git a/dlls/msi/action.c b/dlls/msi/action.c index ae9d40f4f4c..1806b1b57b5 100644 --- a/dlls/msi/action.c +++ b/dlls/msi/action.c @@ -3134,7 +3134,7 @@ static void resolve_keypath(MSIHANDLE hPackage, MSIPACKAGE* package, INT * actually done in the PublishComponents and PublishFeatures * step, and not here. It appears like the keypath and all that is * resolved in this step, however actually written in the Publish steps. - * But we will leave it here for now + * But we will leave it here for now because it is unclear */ static UINT ACTION_ProcessComponents(MSIHANDLE hPackage) { @@ -3183,9 +3183,36 @@ static UINT ACTION_ProcessComponents(MSIHANDLE hPackage) if (rc != ERROR_SUCCESS) goto end; - /* I have no idea what goes in here */ + /* here the guids are base 85 encoded */ for (i = 0; i < package->loaded_features; i++) - RegSetValueExW(hkey3,package->features[i].Feature,0,REG_SZ,NULL,0); + { + LPWSTR data = NULL; + GUID clsid; + int j; + INT size; + + size = package->features[i].ComponentCount*21*sizeof(WCHAR); + data = HeapAlloc(GetProcessHeap(), 0, size); + + data[0] = 0; + for (j = 0; j < package->features[i].ComponentCount; j++) + { + WCHAR buf[21]; + TRACE("From %s\n",debugstr_w(package->components + [package->features[i].Components[j]].ComponentId)); + CLSIDFromString(package->components + [package->features[i].Components[j]].ComponentId, + &clsid); + encode_base85_guid(&clsid,buf); + TRACE("to %s\n",debugstr_w(buf)); + strcatW(data,buf); + } + + size = strlenW(data)*sizeof(WCHAR); + RegSetValueExW(hkey3,package->features[i].Feature,0,REG_SZ, + (LPSTR)data,size); + HeapFree(GetProcessHeap(),0,data); + } RegCloseKey(hkey3); RegCloseKey(hkey2); diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index f60deb299fb..8254450c37a 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -145,6 +145,83 @@ BOOL squash_guid(LPCWSTR in, LPWSTR out) return TRUE; } +/* tables for encoding and decoding base85 */ +static const unsigned char table_dec85[0x80] = { +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, +0xff,0x00,0xff,0xff,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0xff, +0x0c,0x0d,0x0e,0x0f,0x10,0x11,0x12,0x13,0x14,0x15,0xff,0xff,0xff,0x16,0xff,0x17, +0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, +0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,0x30,0x31,0x32,0x33,0xff,0x34,0x35,0x36, +0x37,0x38,0x39,0x3a,0x3b,0x3c,0x3d,0x3e,0x3f,0x40,0x41,0x42,0x43,0x44,0x45,0x46, +0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,0xff,0x53,0x54,0xff, +}; + +static const char table_enc85[] = +"!$%&'()*+,-.0123456789=?@ABCDEFGHIJKLMNO" +"PQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwx" +"yz{}~"; + +/* + * Converts a base85 encoded guid into a GUID pointer + * Base85 encoded GUIDs should be 20 characters long. + * + * returns TRUE if successful, FALSE if not + */ +BOOL decode_base85_guid( LPCWSTR str, GUID *guid ) +{ + DWORD i, val = 0, base = 1, *p; + + p = (DWORD*) guid; + for( i=0; i<20; i++ ) + { + if( (i%5) == 0 ) + { + val = 0; + base = 1; + } + val += table_dec85[str[i]] * base; + if( str[i] >= 0x80 ) + return FALSE; + if( table_dec85[str[i]] == 0xff ) + return FALSE; + if( (i%5) == 4 ) + p[i/5] = val; + base *= 85; + } + return TRUE; +} + +/* + * Encodes a base85 guid given a GUID pointer + * Caller should provide a 21 character buffer for the encoded string. + * + * returns TRUE if successful, FALSE if not + */ +BOOL encode_base85_guid( GUID *guid, LPWSTR str ) +{ + unsigned int x, *p, i; + + p = (unsigned int*) guid; + for( i=0; i<4; i++ ) + { + x = p[i]; + *str++ = table_enc85[x%85]; + x = x/85; + *str++ = table_enc85[x%85]; + x = x/85; + *str++ = table_enc85[x%85]; + x = x/85; + *str++ = table_enc85[x%85]; + x = x/85; + *str++ = table_enc85[x%85]; + } + *str = 0; + + return TRUE; +} + + VOID MSI_CloseDatabase( VOID *arg ) { MSIDATABASE *db = (MSIDATABASE *) arg; diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h index 47a99392c13..1646fdf312f 100644 --- a/dlls/msi/msipriv.h +++ b/dlls/msi/msipriv.h @@ -245,6 +245,8 @@ extern void enum_stream_names( IStorage *stg ); BOOL unsquash_guid(LPCWSTR in, LPWSTR out); BOOL squash_guid(LPCWSTR in, LPWSTR out); +BOOL encode_base85_guid(GUID *,LPWSTR); +BOOL decode_base85_guid(LPCWSTR,GUID*); /* UI globals */ extern INSTALLUILEVEL gUILevel; -- 2.11.4.GIT