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.
This commit is contained in:
parent
b2d79634ba
commit
2c0e46d9df
144
dlls/msi/msi.c
144
dlls/msi/msi.c
|
@ -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:
|
||||||
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,
|
||||||
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 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 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 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 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
|
||||||
|
|
Loading…
Reference in New Issue