Just an implementation detail I noticed:
On 08/23/2011 11:45 AM, Hans Leidekker wrote:
+
+static UINT get_registered_local_package( const WCHAR *product, const WCHAR
*package, WCHAR *localfile )
+{
+ MSIINSTALLCONTEXT context;
+ HKEY product_key, props_key;
+ WCHAR *registered_package = NULL, unsquashed[GUID_SIZE];
+ UINT r = ERROR_FUNCTION_FAILED;
+
+ r = msi_locate_product( product,&context );
+ if (r != ERROR_SUCCESS)
+ return r;
+
+ r = MSIREG_OpenProductKey( product, NULL, context,&product_key, FALSE );
+ if (r != ERROR_SUCCESS)
+ return r;
+
+ r = MSIREG_OpenInstallProps( product, context, NULL,&props_key, FALSE );
+ if (r != ERROR_SUCCESS)
+ {
+ RegCloseKey( product_key );
+ return r;
+ }
+ registered_package = msi_reg_get_val_str( product_key,
INSTALLPROPERTY_PACKAGECODEW );
+ if (!registered_package)
+ goto done;
+
+ unsquash_guid( registered_package, unsquashed );
+ if (!strcmpiW( package, unsquashed ))
+ {
+ WCHAR *filename = msi_reg_get_val_str( props_key,
INSTALLPROPERTY_LOCALPACKAGEW );
+ strcpyW( localfile, filename );
+ msi_free( filename );
+ r = ERROR_SUCCESS;
+ }
+done:
+ msi_free( registered_package );
+ RegCloseKey( props_key );
+ RegCloseKey( product_key );
+ return r;
+}
+
I'm confused about the last part of the function.
I think if the comparison between 'package' and 'unsquashed' fails, you
want to return an error,
but the return value 'r' will be ERROR_SUCCESS at that point, and isn't
updated.
HTH,
Joris