MsiConfigureProductExW and other stubs

Aric Stewart aric at codeweavers.com
Tue Jan 18 05:14:36 CST 2005


do a very basic first implementation of MsiConfigureProductExW for 
msiexec /@  when run as a reboot.
also add a number of new stubs for the office xp and 2k3 install and 
startup process.
-------------- next part --------------
Index: dlls/msi/msi.c
===================================================================
RCS file: /home/wine/wine/dlls/msi/msi.c,v
retrieving revision 1.48
diff -u -u -r1.48 msi.c
--- dlls/msi/msi.c	17 Jan 2005 13:39:57 -0000	1.48
+++ dlls/msi/msi.c	18 Jan 2005 11:12:39 -0000
@@ -588,7 +588,105 @@
 	return ERROR_CALL_NOT_IMPLEMENTED;
 }
 
-UINT WINAPI MsiConfigureProductA(LPCSTR szProduct, int iInstallLevel, INSTALLSTATE eInstallState)
+UINT WINAPI MsiConfigureProductExW(LPCWSTR szProduct, int iInstallLevel,
+                        INSTALLSTATE eInstallState, LPCWSTR szCommandLine)
+{
+    MSIHANDLE handle; 
+    MSIPACKAGE* package;
+    UINT rc;
+    WCHAR squished_pc[0x100];
+    HKEY hkey=0,hkey2=0,hkey3=0,hkey4=0;
+    static const WCHAR szInstaller[] = {
+         'S','o','f','t','w','a','r','e','\\',
+         'M','i','c','r','o','s','o','f','t','\\',
+         'I','n','s','t','a','l','l','e','r',0 };
+    static const WCHAR szProducts[] = {
+         'P','r','o','d','u','c','t','s',0 };
+    DWORD sz;
+    static const WCHAR szSouceList[] = {
+        'S','o','u','r','c','e','L','i','s','t',0};
+    static const WCHAR szLUS[] = {
+        'L','a','s','t','U','s','e','d','S','o','u','r','c','e',0};
+    WCHAR sourcepath[0x200];
+    static const WCHAR szInstalled[] = {
+        ' ','I','n','s','t','a','l','l','e','d','=','1',0};
+    LPWSTR commandline;
+
+    FIXME("%s %d %d %s\n",debugstr_w(szProduct), iInstallLevel, eInstallState,
+    debugstr_w(szCommandLine));
+
+    if (eInstallState != INSTALLSTATE_LOCAL)
+    {
+        FIXME("Not implemented for anything other than local installs\n");
+        return ERROR_CALL_NOT_IMPLEMENTED;
+    }
+
+    squash_guid(szProduct,squished_pc);
+
+    TRACE("squished (%s)\n", debugstr_w(squished_pc));
+
+    rc = RegOpenKeyW(HKEY_CURRENT_USER,szInstaller,&hkey);
+    if (rc != ERROR_SUCCESS)
+        goto end;
+
+    /* check the products key for the product */
+    rc = RegOpenKeyW(hkey,szProducts,&hkey2);
+    if (rc != ERROR_SUCCESS)
+        goto end;
+
+    rc = RegOpenKeyW(hkey2,squished_pc,&hkey3);
+    if (rc != ERROR_SUCCESS)
+        goto end;
+
+    rc = RegOpenKeyW(hkey3,szSouceList,&hkey4);
+    if (rc != ERROR_SUCCESS)
+        goto end;
+
+    sz = sizeof(sourcepath);
+    rc = RegQueryValueExW(hkey4, szLUS, NULL, NULL,(LPBYTE)sourcepath, &sz);
+    if (rc != ERROR_SUCCESS)
+        goto end;
+    /*
+     * ok 1, we need to find the msi file for this product.
+     *    2, find the source dir for the files
+     *    3, do the configure/install.
+          4, cleanupany runonce entry. 
+     */
+
+    rc = MsiOpenProductW(szProduct,&handle);
+    if (rc != ERROR_SUCCESS)
+        goto end;
+
+    package = msihandle2msiinfo(handle, MSIHANDLETYPE_PACKAGE);
+   
+    sz = strlenW(szInstalled);
+
+    if (szCommandLine)
+        sz += strlenW(szCommandLine);
+
+    commandline = HeapAlloc(GetProcessHeap(),0,sz * sizeof(WCHAR));
+
+    if (szCommandLine) 
+        strcpyW(commandline,szCommandLine);
+    else
+        commandline[0] = 0;
+
+    if (MsiQueryProductStateW(szProduct) == iInstallLevel)
+        strcatW(commandline,szInstalled);
+
+    rc = ACTION_DoTopLevelINSTALL(package, sourcepath, commandline);
+
+    HeapFree(GetProcessHeap(),0,commandline);
+end:
+    RegCloseKey(hkey3);
+    RegCloseKey(hkey2);
+    RegCloseKey(hkey);
+
+    return rc;
+}
+
+UINT WINAPI MsiConfigureProductA(LPCSTR szProduct, int iInstallLevel, 
+                                 INSTALLSTATE eInstallState)
 {
     LPWSTR szwProduct = NULL;
     UINT hr = ERROR_SUCCESS;
@@ -613,10 +711,13 @@
     return hr;
 }
 
-UINT WINAPI MsiConfigureProductW(LPCWSTR szProduct, int iInstallLevel, INSTALLSTATE eInstallState)
+UINT WINAPI MsiConfigureProductW(LPCWSTR szProduct, int iInstallLevel, 
+                                 INSTALLSTATE eInstallState)
 {
     FIXME("%s %d %d\n",debugstr_w(szProduct), iInstallLevel, eInstallState);
-    return ERROR_CALL_NOT_IMPLEMENTED;
+
+    return MsiConfigureProductExW(szProduct, iInstallLevel, eInstallState,
+                                  NULL);
 }
 
 UINT WINAPI MsiGetProductCodeA(LPCSTR szComponent, LPSTR szBuffer)
@@ -1782,4 +1883,41 @@
     FIXME("%s %s %p %p\n", debugstr_a(szProduct), debugstr_a(szFeature),
           pdwUseCount, pwDateUsed);
     return ERROR_CALL_NOT_IMPLEMENTED;
+}
+
+UINT WINAPI MsiUseFeatureExW(LPCWSTR szProduct, LPCWSTR szFeature, 
+                             DWORD dwInstallMode, DWORD dwReserved)
+{
+    FIXME("%s %s %li %li\n", debugstr_w(szProduct), debugstr_w(szFeature),
+          dwInstallMode, dwReserved);
+   
+    return INSTALLSTATE_LOCAL; 
+}
+
+UINT WINAPI MsiProvideQualifiedComponentExW(LPCWSTR szComponent, 
+                    LPCWSTR szQualifier, DWORD dwInstallMode, LPWSTR szProduct,
+                    DWORD Unused1, DWORD Unused2 , LPWSTR lpPathBuf, 
+                    DWORD* pcchPathBuf)
+{
+    FIXME("%s %s %li %s %li %li %p %p\n", debugstr_w(szComponent),
+debugstr_w(szQualifier), dwInstallMode, debugstr_w(szProduct), Unused1, Unused2,
+lpPathBuf, pcchPathBuf);
+
+    return  ERROR_INDEX_ABSENT;
+}
+
+UINT WINAPI MsiGetUserInfoW(LPCWSTR szProduct, LPWSTR lpUserNameBuf, 
+                DWORD* pcchUserNameBuf, LPWSTR lpOrgNameBuf, 
+                DWORD* pcchOrgNameBuf, LPWSTR lpSerialBuf, DWORD* pcchSerialBuf)
+{
+    FIXME("%s, %p %p %p %p %p %p\n",debugstr_w(szProduct), lpUserNameBuf,
+pcchUserNameBuf, lpOrgNameBuf, pcchOrgNameBuf, lpSerialBuf, pcchSerialBuf);
+  
+    return USERINFOSTATE_UNKNOWN; 
+}
+
+UINT WINAPI MsiCollectUserInfoW(LPWSTR szProduct)
+{
+    FIXME("%s\n",debugstr_w(szProduct));
+    return ERROR_FUNCTION_FAILED;
 }
Index: dlls/msi/msi.spec
===================================================================
RCS file: /home/wine/wine/dlls/msi/msi.spec,v
retrieving revision 1.26
diff -u -u -r1.26 msi.spec
--- dlls/msi/msi.spec	3 Jan 2005 16:54:43 -0000	1.26
+++ dlls/msi/msi.spec	18 Jan 2005 11:12:40 -0000
@@ -7,7 +7,7 @@
 7 stdcall MsiCloseAllHandles()
 8 stdcall MsiCloseHandle(long)
 9 stub MsiCollectUserInfoA
-10 stub MsiCollectUserInfoW
+10 stdcall MsiCollectUserInfoW(wstr)
 11 stub MsiConfigureFeatureA
 12 stub MsiConfigureFeatureFromDescriptorA
 13 stub MsiConfigureFeatureFromDescriptorW
@@ -79,7 +79,7 @@
 79 stdcall MsiGetTargetPathA(long str ptr ptr)
 80 stdcall MsiGetTargetPathW(long wstr ptr ptr)
 81 stub MsiGetUserInfoA
-82 stub MsiGetUserInfoW
+82 stdcall MsiGetUserInfoW(wstr ptr ptr ptr ptr ptr ptr)
 83 stub MsiInstallMissingComponentA
 84 stub MsiInstallMissingComponentW
 85 stub MsiInstallMissingFileA
@@ -187,10 +187,10 @@
 187 stub MsiQueryFeatureStateFromDescriptorA
 188 stub MsiQueryFeatureStateFromDescriptorW
 189 stub MsiConfigureProductExA
-190 stub MsiConfigureProductExW
+190 stdcall MsiConfigureProductExW (wstr long long wstr)
 191 stub MsiInvalidateFeatureCache
 192 stub MsiUseFeatureExA
-193 stub MsiUseFeatureExW
+193 stdcall MsiUseFeatureExW(wstr wstr long long)
 194 stdcall MsiGetFileVersionA(str str ptr str ptr)
 195 stdcall MsiGetFileVersionW(wstr wstr ptr wstr ptr)
 196 stdcall MsiLoadStringA(long long long long long)
@@ -200,7 +200,7 @@
 200 stub MsiDecomposeDescriptorA
 201 stub MsiDecomposeDescriptorW
 202 stub MsiProvideQualifiedComponentExA
-203 stub MsiProvideQualifiedComponentExW
+203 stdcall MsiProvideQualifiedComponentExW(wstr wstr long wstr long long ptr ptr)
 204 stdcall MsiEnumRelatedProductsA(str long long ptr)
 205 stdcall MsiEnumRelatedProductsW(wstr long long ptr)
 206 stub MsiSetFeatureAttributesA


More information about the wine-patches mailing list