Commit 2c0e46d9 authored by Aric Stewart's avatar Aric Stewart Committed by Alexandre Julliard

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.
parent b2d79634
...@@ -588,7 +588,105 @@ UINT WINAPI MsiApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szInstallPackage, INS ...@@ -588,7 +588,105 @@ UINT WINAPI MsiApplyPatchW(LPCWSTR szPatchPackage, LPCWSTR szInstallPackage, INS
return ERROR_CALL_NOT_IMPLEMENTED; 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; LPWSTR szwProduct = NULL;
UINT hr = ERROR_SUCCESS; UINT hr = ERROR_SUCCESS;
...@@ -613,10 +711,13 @@ end: ...@@ -613,10 +711,13 @@ end:
return hr; 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); 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) UINT WINAPI MsiGetProductCodeA(LPCSTR szComponent, LPSTR szBuffer)
...@@ -1783,3 +1884,40 @@ UINT WINAPI MsiGetFeatureUsageA(LPCSTR szProduct, LPCSTR szFeature, ...@@ -1783,3 +1884,40 @@ UINT WINAPI MsiGetFeatureUsageA(LPCSTR szProduct, LPCSTR szFeature,
pdwUseCount, pwDateUsed); pdwUseCount, pwDateUsed);
return ERROR_CALL_NOT_IMPLEMENTED; 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;
}
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
7 stdcall MsiCloseAllHandles() 7 stdcall MsiCloseAllHandles()
8 stdcall MsiCloseHandle(long) 8 stdcall MsiCloseHandle(long)
9 stub MsiCollectUserInfoA 9 stub MsiCollectUserInfoA
10 stub MsiCollectUserInfoW 10 stdcall MsiCollectUserInfoW(wstr)
11 stub MsiConfigureFeatureA 11 stub MsiConfigureFeatureA
12 stub MsiConfigureFeatureFromDescriptorA 12 stub MsiConfigureFeatureFromDescriptorA
13 stub MsiConfigureFeatureFromDescriptorW 13 stub MsiConfigureFeatureFromDescriptorW
...@@ -79,7 +79,7 @@ ...@@ -79,7 +79,7 @@
79 stdcall MsiGetTargetPathA(long str ptr ptr) 79 stdcall MsiGetTargetPathA(long str ptr ptr)
80 stdcall MsiGetTargetPathW(long wstr ptr ptr) 80 stdcall MsiGetTargetPathW(long wstr ptr ptr)
81 stub MsiGetUserInfoA 81 stub MsiGetUserInfoA
82 stub MsiGetUserInfoW 82 stdcall MsiGetUserInfoW(wstr ptr ptr ptr ptr ptr ptr)
83 stub MsiInstallMissingComponentA 83 stub MsiInstallMissingComponentA
84 stub MsiInstallMissingComponentW 84 stub MsiInstallMissingComponentW
85 stub MsiInstallMissingFileA 85 stub MsiInstallMissingFileA
...@@ -187,10 +187,10 @@ ...@@ -187,10 +187,10 @@
187 stub MsiQueryFeatureStateFromDescriptorA 187 stub MsiQueryFeatureStateFromDescriptorA
188 stub MsiQueryFeatureStateFromDescriptorW 188 stub MsiQueryFeatureStateFromDescriptorW
189 stub MsiConfigureProductExA 189 stub MsiConfigureProductExA
190 stub MsiConfigureProductExW 190 stdcall MsiConfigureProductExW (wstr long long wstr)
191 stub MsiInvalidateFeatureCache 191 stub MsiInvalidateFeatureCache
192 stub MsiUseFeatureExA 192 stub MsiUseFeatureExA
193 stub MsiUseFeatureExW 193 stdcall MsiUseFeatureExW(wstr wstr long long)
194 stdcall MsiGetFileVersionA(str str ptr str ptr) 194 stdcall MsiGetFileVersionA(str str ptr str ptr)
195 stdcall MsiGetFileVersionW(wstr wstr ptr wstr ptr) 195 stdcall MsiGetFileVersionW(wstr wstr ptr wstr ptr)
196 stdcall MsiLoadStringA(long long long long long) 196 stdcall MsiLoadStringA(long long long long long)
...@@ -200,7 +200,7 @@ ...@@ -200,7 +200,7 @@
200 stub MsiDecomposeDescriptorA 200 stub MsiDecomposeDescriptorA
201 stub MsiDecomposeDescriptorW 201 stub MsiDecomposeDescriptorW
202 stub MsiProvideQualifiedComponentExA 202 stub MsiProvideQualifiedComponentExA
203 stub MsiProvideQualifiedComponentExW 203 stdcall MsiProvideQualifiedComponentExW(wstr wstr long wstr long long ptr ptr)
204 stdcall MsiEnumRelatedProductsA(str long long ptr) 204 stdcall MsiEnumRelatedProductsA(str long long ptr)
205 stdcall MsiEnumRelatedProductsW(wstr long long ptr) 205 stdcall MsiEnumRelatedProductsW(wstr long long ptr)
206 stub MsiSetFeatureAttributesA 206 stub MsiSetFeatureAttributesA
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment