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


Reply via email to