From 0de5671ee9add14a93b92129470b9c6a39ccaecf Mon Sep 17 00:00:00 2001 From: Aric Stewart Date: Fri, 14 Jan 2005 17:05:53 +0000 Subject: [PATCH] Actually start on an implemention for MsiGetComponentPathW that should handle all keypaths that are files. --- dlls/msi/msi.c | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 54 insertions(+), 5 deletions(-) diff --git a/dlls/msi/msi.c b/dlls/msi/msi.c index c72470ef810..b76f97ac48f 100644 --- a/dlls/msi/msi.c +++ b/dlls/msi/msi.c @@ -1259,7 +1259,7 @@ INSTALLSTATE WINAPI MsiGetComponentPathA(LPCSTR szProduct, LPCSTR szComponent, LPSTR lpPathBuf, DWORD* pcchBuf) { INSTALLSTATE rc; - UINT len; + UINT len,incoming_len; LPWSTR szwProduct= NULL; LPWSTR szwComponent= NULL; LPWSTR lpwPathBuf= NULL; @@ -1290,14 +1290,15 @@ INSTALLSTATE WINAPI MsiGetComponentPathA(LPCSTR szProduct, LPCSTR szComponent, else lpwPathBuf = NULL; + incoming_len = *pcchBuf; rc = MsiGetComponentPathW(szwProduct, szwComponent, lpwPathBuf, pcchBuf); HeapFree( GetProcessHeap(), 0, szwProduct); HeapFree( GetProcessHeap(), 0, szwComponent); if (lpwPathBuf) { - WideCharToMultiByte(CP_ACP, 0, lpwPathBuf, *pcchBuf, - lpPathBuf, GUID_SIZE, NULL, NULL); + WideCharToMultiByte(CP_ACP, 0, lpwPathBuf, incoming_len, + lpPathBuf, incoming_len, NULL, NULL); HeapFree( GetProcessHeap(), 0, lpwPathBuf); } @@ -1307,10 +1308,58 @@ INSTALLSTATE WINAPI MsiGetComponentPathA(LPCSTR szProduct, LPCSTR szComponent, INSTALLSTATE WINAPI MsiGetComponentPathW(LPCWSTR szProduct, LPCWSTR szComponent, LPWSTR lpPathBuf, DWORD* pcchBuf) { - FIXME("STUB: (%s %s %p %p)\n", debugstr_w(szProduct), + WCHAR squished_pc[0x100]; + WCHAR squished_cc[0x100]; + UINT rc; + INSTALLSTATE rrc = INSTALLSTATE_ABSENT; + HKEY hkey=0,hkey2=0,hkey3=0; + static const WCHAR szInstaller[] = { + 'S','o','f','t','w','a','r','e','\\', + 'M','i','c','r','o','s','o','f','t','\\', + 'W','i','n','d','o','w','s','\\', + 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', + 'I','n','s','t','a','l','l','e','r',0 }; + static const WCHAR szComponents[] = { + 'C','o','m','p','o','n','e','n','t','s',0 }; + + TRACE("(%s %s %p %p)\n", debugstr_w(szProduct), debugstr_w(szComponent), lpPathBuf, pcchBuf); - return INSTALLSTATE_UNKNOWN; + squash_guid(szProduct,squished_pc); + squash_guid(szComponent,squished_cc); + + rc = RegOpenKeyW(HKEY_LOCAL_MACHINE,szInstaller,&hkey); + if (rc != ERROR_SUCCESS) + goto end; + + rc = RegOpenKeyW(hkey,szComponents,&hkey2); + if (rc != ERROR_SUCCESS) + goto end; + + rc = RegOpenKeyW(hkey2,squished_cc,&hkey3); + if (rc != ERROR_SUCCESS) + goto end; + + *pcchBuf *= sizeof(WCHAR); + rc = RegQueryValueExW(hkey3,squished_pc,NULL,NULL,(LPVOID)lpPathBuf, + pcchBuf); + *pcchBuf /= sizeof(WCHAR); + + if (rc!= ERROR_SUCCESS) + goto end; + + TRACE("found path of (%s:%s)(%s)\n", debugstr_w(squished_cc), + debugstr_w(squished_pc), debugstr_w(lpPathBuf)); + + FIXME("Only working for installed files, not registry keys\n"); + if (GetFileAttributesW(lpPathBuf) != INVALID_FILE_ATTRIBUTES) + rrc = INSTALLSTATE_LOCAL; + +end: + RegCloseKey(hkey3); + RegCloseKey(hkey2); + RegCloseKey(hkey); + return rrc; } INSTALLSTATE WINAPI MsiQueryFeatureStateA(LPCSTR szProduct, LPCSTR szFeature) -- 2.11.4.GIT