📄 msi.c
字号:
dwVerLen = GetFileVersionInfoSizeW(szFilePath, NULL);
if( !dwVerLen )
return GetLastError();
lpVer = msi_alloc(dwVerLen);
if( !lpVer )
{
ret = ERROR_OUTOFMEMORY;
goto end;
}
if( !GetFileVersionInfoW(szFilePath, 0, dwVerLen, lpVer) )
{
ret = GetLastError();
goto end;
}
if( lpVersionBuf && pcchVersionBuf && *pcchVersionBuf )
{
if( VerQueryValueW(lpVer, szVersionResource, (LPVOID*)&ffi, &puLen) &&
(puLen > 0) )
{
wsprintfW(tmp, szVersionFormat,
HIWORD(ffi->dwFileVersionMS), LOWORD(ffi->dwFileVersionMS),
HIWORD(ffi->dwFileVersionLS), LOWORD(ffi->dwFileVersionLS));
lstrcpynW(lpVersionBuf, tmp, *pcchVersionBuf);
*pcchVersionBuf = lstrlenW(lpVersionBuf);
}
else
{
*lpVersionBuf = 0;
*pcchVersionBuf = 0;
}
}
if( lpLangBuf && pcchLangBuf && *pcchLangBuf )
{
DWORD lang = GetUserDefaultLangID();
FIXME("Retrieve language from file\n");
wsprintfW(tmp, szLangFormat, lang);
lstrcpynW(lpLangBuf, tmp, *pcchLangBuf);
*pcchLangBuf = lstrlenW(lpLangBuf);
}
end:
msi_free(lpVer);
return ret;
}
/***********************************************************************
* MsiGetFeatureUsageW [MSI.@]
*/
UINT WINAPI MsiGetFeatureUsageW( LPCWSTR szProduct, LPCWSTR szFeature,
DWORD* pdwUseCount, WORD* pwDateUsed )
{
FIXME("%s %s %p %p\n",debugstr_w(szProduct), debugstr_w(szFeature),
pdwUseCount, pwDateUsed);
return ERROR_CALL_NOT_IMPLEMENTED;
}
/***********************************************************************
* MsiGetFeatureUsageA [MSI.@]
*/
UINT WINAPI MsiGetFeatureUsageA( LPCSTR szProduct, LPCSTR szFeature,
DWORD* pdwUseCount, WORD* pwDateUsed )
{
LPWSTR prod = NULL, feat = NULL;
UINT ret = ERROR_OUTOFMEMORY;
TRACE("%s %s %p %p\n", debugstr_a(szProduct), debugstr_a(szFeature),
pdwUseCount, pwDateUsed);
prod = strdupAtoW( szProduct );
if (szProduct && !prod)
goto end;
feat = strdupAtoW( szFeature );
if (szFeature && !feat)
goto end;
ret = MsiGetFeatureUsageW( prod, feat, pdwUseCount, pwDateUsed );
end:
msi_free( prod );
msi_free( feat );
return ret;
}
/***********************************************************************
* MsiUseFeatureExW [MSI.@]
*/
INSTALLSTATE WINAPI MsiUseFeatureExW( LPCWSTR szProduct, LPCWSTR szFeature,
DWORD dwInstallMode, DWORD dwReserved )
{
INSTALLSTATE state;
TRACE("%s %s %i %i\n", debugstr_w(szProduct), debugstr_w(szFeature),
dwInstallMode, dwReserved);
state = MsiQueryFeatureStateW( szProduct, szFeature );
if (dwReserved)
return INSTALLSTATE_INVALIDARG;
if (state == INSTALLSTATE_LOCAL && dwInstallMode != INSTALLMODE_NODETECTION)
{
FIXME("mark product %s feature %s as used\n",
debugstr_w(szProduct), debugstr_w(szFeature) );
}
return state;
}
/***********************************************************************
* MsiUseFeatureExA [MSI.@]
*/
INSTALLSTATE WINAPI MsiUseFeatureExA( LPCSTR szProduct, LPCSTR szFeature,
DWORD dwInstallMode, DWORD dwReserved )
{
INSTALLSTATE ret = INSTALLSTATE_UNKNOWN;
LPWSTR prod = NULL, feat = NULL;
TRACE("%s %s %i %i\n", debugstr_a(szProduct), debugstr_a(szFeature),
dwInstallMode, dwReserved);
prod = strdupAtoW( szProduct );
if (szProduct && !prod)
goto end;
feat = strdupAtoW( szFeature );
if (szFeature && !feat)
goto end;
ret = MsiUseFeatureExW( prod, feat, dwInstallMode, dwReserved );
end:
msi_free( prod );
msi_free( feat );
return ret;
}
/***********************************************************************
* MsiUseFeatureW [MSI.@]
*/
INSTALLSTATE WINAPI MsiUseFeatureW( LPCWSTR szProduct, LPCWSTR szFeature )
{
return MsiUseFeatureExW(szProduct, szFeature, 0, 0);
}
/***********************************************************************
* MsiUseFeatureA [MSI.@]
*/
INSTALLSTATE WINAPI MsiUseFeatureA( LPCSTR szProduct, LPCSTR szFeature )
{
return MsiUseFeatureExA(szProduct, szFeature, 0, 0);
}
/***********************************************************************
* MSI_ProvideQualifiedComponentEx [internal]
*/
static UINT WINAPI MSI_ProvideQualifiedComponentEx(LPCWSTR szComponent,
LPCWSTR szQualifier, DWORD dwInstallMode, LPWSTR szProduct,
DWORD Unused1, DWORD Unused2, awstring *lpPathBuf,
DWORD* pcchPathBuf)
{
WCHAR product[MAX_FEATURE_CHARS+1], component[MAX_FEATURE_CHARS+1],
feature[MAX_FEATURE_CHARS+1];
LPWSTR info;
HKEY hkey;
DWORD sz;
UINT rc;
TRACE("%s %s %i %s %i %i %p %p\n", debugstr_w(szComponent),
debugstr_w(szQualifier), dwInstallMode, debugstr_w(szProduct),
Unused1, Unused2, lpPathBuf, pcchPathBuf);
rc = MSIREG_OpenUserComponentsKey(szComponent, &hkey, FALSE);
if (rc != ERROR_SUCCESS)
return ERROR_INDEX_ABSENT;
info = msi_reg_get_val_str( hkey, szQualifier );
RegCloseKey(hkey);
if (!info)
return ERROR_INDEX_ABSENT;
MsiDecomposeDescriptorW(info, product, feature, component, &sz);
if (!szProduct)
rc = MSI_GetComponentPath(product, component, lpPathBuf, pcchPathBuf);
else
rc = MSI_GetComponentPath(szProduct, component, lpPathBuf, pcchPathBuf);
msi_free( info );
if (rc != INSTALLSTATE_LOCAL)
return ERROR_FILE_NOT_FOUND;
return ERROR_SUCCESS;
}
/***********************************************************************
* MsiProvideQualifiedComponentExW [MSI.@]
*/
UINT WINAPI MsiProvideQualifiedComponentExW(LPCWSTR szComponent,
LPCWSTR szQualifier, DWORD dwInstallMode, LPWSTR szProduct,
DWORD Unused1, DWORD Unused2, LPWSTR lpPathBuf,
DWORD* pcchPathBuf)
{
awstring path;
path.unicode = TRUE;
path.str.w = lpPathBuf;
return MSI_ProvideQualifiedComponentEx(szComponent, szQualifier,
dwInstallMode, szProduct, Unused1, Unused2, &path, pcchPathBuf);
}
/***********************************************************************
* MsiProvideQualifiedComponentExA [MSI.@]
*/
UINT WINAPI MsiProvideQualifiedComponentExA(LPCSTR szComponent,
LPCSTR szQualifier, DWORD dwInstallMode, LPSTR szProduct,
DWORD Unused1, DWORD Unused2, LPSTR lpPathBuf,
DWORD* pcchPathBuf)
{
LPWSTR szwComponent, szwQualifier = NULL, szwProduct = NULL;
UINT r = ERROR_OUTOFMEMORY;
awstring path;
TRACE("%s %s %u %s %u %u %p %p\n", debugstr_a(szComponent),
debugstr_a(szQualifier), dwInstallMode, debugstr_a(szProduct),
Unused1, Unused2, lpPathBuf, pcchPathBuf);
szwComponent = strdupAtoW( szComponent );
if (szComponent && !szwComponent)
goto end;
szwQualifier = strdupAtoW( szQualifier );
if (szQualifier && !szwQualifier)
goto end;
szwProduct = strdupAtoW( szProduct );
if (szProduct && !szwProduct)
goto end;
path.unicode = FALSE;
path.str.a = lpPathBuf;
r = MSI_ProvideQualifiedComponentEx(szwComponent, szwQualifier,
dwInstallMode, szwProduct, Unused1,
Unused2, &path, pcchPathBuf);
end:
msi_free(szwProduct);
msi_free(szwComponent);
msi_free(szwQualifier);
return r;
}
/***********************************************************************
* MsiProvideQualifiedComponentW [MSI.@]
*/
UINT WINAPI MsiProvideQualifiedComponentW( LPCWSTR szComponent,
LPCWSTR szQualifier, DWORD dwInstallMode, LPWSTR lpPathBuf,
DWORD* pcchPathBuf)
{
return MsiProvideQualifiedComponentExW(szComponent, szQualifier,
dwInstallMode, NULL, 0, 0, lpPathBuf, pcchPathBuf);
}
/***********************************************************************
* MsiProvideQualifiedComponentA [MSI.@]
*/
UINT WINAPI MsiProvideQualifiedComponentA( LPCSTR szComponent,
LPCSTR szQualifier, DWORD dwInstallMode, LPSTR lpPathBuf,
DWORD* pcchPathBuf)
{
return MsiProvideQualifiedComponentExA(szComponent, szQualifier,
dwInstallMode, NULL, 0, 0, lpPathBuf, pcchPathBuf);
}
/***********************************************************************
* MSI_GetUserInfo [internal]
*/
static USERINFOSTATE WINAPI MSI_GetUserInfo(LPCWSTR szProduct,
awstring *lpUserNameBuf, DWORD* pcchUserNameBuf,
awstring *lpOrgNameBuf, DWORD* pcchOrgNameBuf,
awstring *lpSerialBuf, DWORD* pcchSerialBuf)
{
HKEY hkey;
LPWSTR user, org, serial;
UINT r;
USERINFOSTATE state;
TRACE("%s %p %p %p %p %p %p\n",debugstr_w(szProduct), lpUserNameBuf,
pcchUserNameBuf, lpOrgNameBuf, pcchOrgNameBuf, lpSerialBuf,
pcchSerialBuf);
if (!szProduct)
return USERINFOSTATE_INVALIDARG;
r = MSIREG_OpenUninstallKey(szProduct, &hkey, FALSE);
if (r != ERROR_SUCCESS)
return USERINFOSTATE_UNKNOWN;
user = msi_reg_get_val_str( hkey, INSTALLPROPERTY_REGOWNERW );
org = msi_reg_get_val_str( hkey, INSTALLPROPERTY_REGCOMPANYW );
serial = msi_reg_get_val_str( hkey, INSTALLPROPERTY_PRODUCTIDW );
RegCloseKey(hkey);
state = USERINFOSTATE_PRESENT;
r = msi_strcpy_to_awstring( user, lpUserNameBuf, pcchUserNameBuf );
if (r == ERROR_MORE_DATA)
state = USERINFOSTATE_MOREDATA;
r = msi_strcpy_to_awstring( org, lpOrgNameBuf, pcchOrgNameBuf );
if (r == ERROR_MORE_DATA)
state = USERINFOSTATE_MOREDATA;
r = msi_strcpy_to_awstring( serial, lpSerialBuf, pcchSerialBuf );
if (r == ERROR_MORE_DATA)
state = USERINFOSTATE_MOREDATA;
msi_free( user );
msi_free( org );
msi_free( serial );
return state;
}
/***********************************************************************
* MsiGetUserInfoW [MSI.@]
*/
USERINFOSTATE WINAPI MsiGetUserInfoW(LPCWSTR szProduct,
LPWSTR lpUserNameBuf, DWORD* pcchUserNameBuf,
LPWSTR lpOrgNameBuf, DWORD* pcchOrgNameBuf,
LPWSTR lpSerialBuf, DWORD* pcchSerialBuf)
{
awstring user, org, serial;
user.unicode = TRUE;
user.str.w = lpUserNameBuf;
org.unicode = TRUE;
org.str.w = lpOrgNameBuf;
serial.unicode = TRUE;
serial.str.w = lpSerialBuf;
return MSI_GetUserInfo( szProduct, &user, pcchUserNameBuf,
&org, pcchOrgNameBuf,
&serial, pcchSerialBuf );
}
USERINFOSTATE WINAPI MsiGetUserInfoA(LPCSTR szProduct,
LPSTR lpUserNameBuf, DWORD* pcchUserNameBuf,
LPSTR lpOrgNameBuf, DWORD* pcchOrgNameBuf,
LPSTR lpSerialBuf, DWORD* pcchSerialBuf)
{
awstring user, org, serial;
LPWSTR prod;
UINT r;
prod = strdupAtoW( szProduct );
if (szProduct && !prod)
return ERROR_OUTOFMEMORY;
user.unicode = FALSE;
user.str.a = lpUserNameBuf;
org.unicode = FALSE;
org.str.a = lpOrgNameBuf;
serial.unicode = FALSE;
serial.str.a = lpSerialBuf;
r = MSI_GetUserInfo( prod, &user, pcchUserNameBuf,
&org, pcchOrgNameBuf,
&serial, pcchSerialBuf );
msi_free( prod );
return r;
}
UINT WINAPI MsiCollectUserInfoW(LPCWSTR szProduct)
{
MSIHANDLE handle;
UINT rc;
MSIPACKAGE *package;
static const WCHAR szFirstRun[] = {'F','i','r','s','t','R','u','n',0};
TRACE("(%s)\n",debugstr_w(szProduct));
rc = MsiOpenProductW(szProduct,&handle);
if (rc != ERROR_SUCCESS)
return ERROR_INVALID_PARAMETER;
package = msihandle2msiinfo(handle, MSIHANDLETYPE_PACKAGE);
rc = ACTION_PerformUIAction(package, szFirstRun);
msiobj_release( &package->hdr );
MsiCloseHandle(handle);
return rc;
}
UINT WINAPI MsiCollectUserInfoA(LPCSTR szProduct)
{
MSIHANDLE handle;
UINT rc;
MSIPACKAGE *package;
static const WCHAR szFirstRun[] = {'F','i','r','s','t','R','u','n',0};
TRACE("(%s)\n",debugstr_a(szProduct));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -