📄 msi.c
字号:
rc = MsiOpenProductA(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;
}
/***********************************************************************
* MsiConfigureFeatureA [MSI.@]
*/
UINT WINAPI MsiConfigureFeatureA(LPCSTR szProduct, LPCSTR szFeature, INSTALLSTATE eInstallState)
{
LPWSTR prod, feat = NULL;
UINT r = ERROR_OUTOFMEMORY;
TRACE("%s %s %i\n", debugstr_a(szProduct), debugstr_a(szFeature), eInstallState);
prod = strdupAtoW( szProduct );
if (szProduct && !prod)
goto end;
feat = strdupAtoW( szFeature );
if (szFeature && !feat)
goto end;
r = MsiConfigureFeatureW(prod, feat, eInstallState);
end:
msi_free(feat);
msi_free(prod);
return r;
}
/***********************************************************************
* MsiConfigureFeatureW [MSI.@]
*/
UINT WINAPI MsiConfigureFeatureW(LPCWSTR szProduct, LPCWSTR szFeature, INSTALLSTATE eInstallState)
{
static const WCHAR szCostInit[] = { 'C','o','s','t','I','n','i','t','i','a','l','i','z','e',0 };
MSIPACKAGE *package = NULL;
UINT r;
WCHAR sourcepath[MAX_PATH], filename[MAX_PATH];
DWORD sz;
TRACE("%s %s %i\n", debugstr_w(szProduct), debugstr_w(szFeature), eInstallState);
if (!szProduct || !szFeature)
return ERROR_INVALID_PARAMETER;
switch (eInstallState)
{
case INSTALLSTATE_DEFAULT:
/* FIXME: how do we figure out the default location? */
eInstallState = INSTALLSTATE_LOCAL;
break;
case INSTALLSTATE_LOCAL:
case INSTALLSTATE_SOURCE:
case INSTALLSTATE_ABSENT:
case INSTALLSTATE_ADVERTISED:
break;
default:
return ERROR_INVALID_PARAMETER;
}
r = MSI_OpenProductW( szProduct, &package );
if (r != ERROR_SUCCESS)
return r;
sz = sizeof(sourcepath);
MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz);
sz = sizeof(filename);
MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
lstrcatW( sourcepath, filename );
MsiSetInternalUI( INSTALLUILEVEL_BASIC, NULL );
r = ACTION_PerformUIAction( package, szCostInit );
if (r != ERROR_SUCCESS)
goto end;
r = MSI_SetFeatureStateW( package, szFeature, eInstallState);
if (r != ERROR_SUCCESS)
goto end;
r = MSI_InstallPackage( package, sourcepath, NULL );
end:
msiobj_release( &package->hdr );
return r;
}
/***********************************************************************
* MsiCreateAndVerifyInstallerDirectory [MSI.@]
*
* Notes: undocumented
*/
UINT WINAPI MsiCreateAndVerifyInstallerDirectory(DWORD dwReserved)
{
WCHAR path[MAX_PATH];
TRACE("%d\n", dwReserved);
if (dwReserved)
{
FIXME("dwReserved=%d\n", dwReserved);
return ERROR_INVALID_PARAMETER;
}
if (!GetWindowsDirectoryW(path, MAX_PATH))
return ERROR_FUNCTION_FAILED;
lstrcatW(path, installerW);
if (!CreateDirectoryW(path, NULL))
return ERROR_FUNCTION_FAILED;
return ERROR_SUCCESS;
}
/***********************************************************************
* MsiGetShortcutTargetA [MSI.@]
*/
UINT WINAPI MsiGetShortcutTargetA( LPCSTR szShortcutTarget,
LPSTR szProductCode, LPSTR szFeatureId,
LPSTR szComponentCode )
{
LPWSTR target;
const int len = MAX_FEATURE_CHARS+1;
WCHAR product[MAX_FEATURE_CHARS+1], feature[MAX_FEATURE_CHARS+1], component[MAX_FEATURE_CHARS+1];
UINT r;
target = strdupAtoW( szShortcutTarget );
if (szShortcutTarget && !target )
return ERROR_OUTOFMEMORY;
product[0] = 0;
feature[0] = 0;
component[0] = 0;
r = MsiGetShortcutTargetW( target, product, feature, component );
msi_free( target );
if (r == ERROR_SUCCESS)
{
WideCharToMultiByte( CP_ACP, 0, product, -1, szProductCode, len, NULL, NULL );
WideCharToMultiByte( CP_ACP, 0, feature, -1, szFeatureId, len, NULL, NULL );
WideCharToMultiByte( CP_ACP, 0, component, -1, szComponentCode, len, NULL, NULL );
}
return r;
}
/***********************************************************************
* MsiGetShortcutTargetW [MSI.@]
*/
UINT WINAPI MsiGetShortcutTargetW( LPCWSTR szShortcutTarget,
LPWSTR szProductCode, LPWSTR szFeatureId,
LPWSTR szComponentCode )
{
IShellLinkDataList *dl = NULL;
IPersistFile *pf = NULL;
LPEXP_DARWIN_LINK darwin = NULL;
HRESULT r, init;
TRACE("%s %p %p %p\n", debugstr_w(szShortcutTarget),
szProductCode, szFeatureId, szComponentCode );
init = CoInitialize(NULL);
r = CoCreateInstance( &CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,
&IID_IPersistFile, (LPVOID*) &pf );
if( SUCCEEDED( r ) )
{
r = IPersistFile_Load( pf, szShortcutTarget,
STGM_READ | STGM_SHARE_DENY_WRITE );
if( SUCCEEDED( r ) )
{
r = IPersistFile_QueryInterface( pf, &IID_IShellLinkDataList,
(LPVOID*) &dl );
if( SUCCEEDED( r ) )
{
IShellLinkDataList_CopyDataBlock( dl, EXP_DARWIN_ID_SIG,
(LPVOID) &darwin );
IShellLinkDataList_Release( dl );
}
}
IPersistFile_Release( pf );
}
if (SUCCEEDED(init))
CoUninitialize();
TRACE("darwin = %p\n", darwin);
if (darwin)
{
DWORD sz;
UINT ret;
ret = MsiDecomposeDescriptorW( darwin->szwDarwinID,
szProductCode, szFeatureId, szComponentCode, &sz );
LocalFree( darwin );
return ret;
}
return ERROR_FUNCTION_FAILED;
}
UINT WINAPI MsiReinstallFeatureW( LPCWSTR szProduct, LPCWSTR szFeature,
DWORD dwReinstallMode )
{
MSIPACKAGE* package = NULL;
UINT r;
WCHAR sourcepath[MAX_PATH];
WCHAR filename[MAX_PATH];
static const WCHAR szLogVerbose[] = {
' ','L','O','G','V','E','R','B','O','S','E',0 };
static const WCHAR szInstalled[] = { 'I','n','s','t','a','l','l','e','d',0};
static const WCHAR szReinstall[] = {'R','E','I','N','S','T','A','L','L',0};
static const WCHAR szReinstallMode[] = {'R','E','I','N','S','T','A','L','L','M','O','D','E',0};
static const WCHAR szOne[] = {'1',0};
WCHAR reinstallmode[11];
LPWSTR ptr;
DWORD sz;
FIXME("%s %s %i\n", debugstr_w(szProduct), debugstr_w(szFeature),
dwReinstallMode);
ptr = reinstallmode;
if (dwReinstallMode & REINSTALLMODE_FILEMISSING)
*ptr++ = 'p';
if (dwReinstallMode & REINSTALLMODE_FILEOLDERVERSION)
*ptr++ = 'o';
if (dwReinstallMode & REINSTALLMODE_FILEEQUALVERSION)
*ptr++ = 'w';
if (dwReinstallMode & REINSTALLMODE_FILEEXACT)
*ptr++ = 'd';
if (dwReinstallMode & REINSTALLMODE_FILEVERIFY)
*ptr++ = 'c';
if (dwReinstallMode & REINSTALLMODE_FILEREPLACE)
*ptr++ = 'a';
if (dwReinstallMode & REINSTALLMODE_USERDATA)
*ptr++ = 'u';
if (dwReinstallMode & REINSTALLMODE_MACHINEDATA)
*ptr++ = 'm';
if (dwReinstallMode & REINSTALLMODE_SHORTCUT)
*ptr++ = 's';
if (dwReinstallMode & REINSTALLMODE_PACKAGE)
*ptr++ = 'v';
*ptr = 0;
sz = sizeof(sourcepath);
MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_LASTUSEDSOURCEW, sourcepath, &sz);
sz = sizeof(filename);
MsiSourceListGetInfoW(szProduct, NULL, MSIINSTALLCONTEXT_USERMANAGED,
MSICODE_PRODUCT, INSTALLPROPERTY_PACKAGENAMEW, filename, &sz);
lstrcatW( sourcepath, filename );
if (dwReinstallMode & REINSTALLMODE_PACKAGE)
r = MSI_OpenPackageW( sourcepath, &package );
else
r = MSI_OpenProductW( szProduct, &package );
if (r != ERROR_SUCCESS)
return r;
MSI_SetPropertyW( package, szReinstallMode, reinstallmode );
MSI_SetPropertyW( package, szInstalled, szOne );
MSI_SetPropertyW( package, szLogVerbose, szOne );
MSI_SetPropertyW( package, szReinstall, szFeature );
r = MSI_InstallPackage( package, sourcepath, NULL );
msiobj_release( &package->hdr );
return r;
}
UINT WINAPI MsiReinstallFeatureA( LPCSTR szProduct, LPCSTR szFeature,
DWORD dwReinstallMode )
{
LPWSTR wszProduct;
LPWSTR wszFeature;
UINT rc;
TRACE("%s %s %i\n", debugstr_a(szProduct), debugstr_a(szFeature),
dwReinstallMode);
wszProduct = strdupAtoW(szProduct);
wszFeature = strdupAtoW(szFeature);
rc = MsiReinstallFeatureW(wszProduct, wszFeature, dwReinstallMode);
msi_free(wszProduct);
msi_free(wszFeature);
return rc;
}
typedef struct
{
unsigned int i[2];
unsigned int buf[4];
unsigned char in[64];
unsigned char digest[16];
} MD5_CTX;
extern VOID WINAPI MD5Init( MD5_CTX *);
extern VOID WINAPI MD5Update( MD5_CTX *, const unsigned char *, unsigned int );
extern VOID WINAPI MD5Final( MD5_CTX *);
/***********************************************************************
* MsiGetFileHashW [MSI.@]
*/
UINT WINAPI MsiGetFileHashW( LPCWSTR szFilePath, DWORD dwOptions,
PMSIFILEHASHINFO pHash )
{
HANDLE handle, mapping;
void *p;
DWORD length;
UINT r = ERROR_FUNCTION_FAILED;
TRACE("%s %08x %p\n", debugstr_w(szFilePath), dwOptions, pHash );
if (dwOptions)
return ERROR_INVALID_PARAMETER;
if (!pHash)
return ERROR_INVALID_PARAMETER;
if (pHash->dwFileHashInfoSize < sizeof *pHash)
return ERROR_INVALID_PARAMETER;
handle = CreateFileW( szFilePath, GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, 0, NULL );
if (handle == INVALID_HANDLE_VALUE)
return ERROR_FILE_NOT_FOUND;
length = GetFileSize( handle, NULL );
mapping = CreateFileMappingW( handle, NULL, PAGE_READONLY, 0, 0, NULL );
if (mapping)
{
p = MapViewOfFile( mapping, FILE_MAP_READ, 0, 0, length );
if (p)
{
MD5_CTX ctx;
MD5Init( &ctx );
MD5Update( &ctx, p, length );
MD5Final( &ctx );
UnmapViewOfFile( p );
memcpy( pHash->dwData, &ctx.digest, sizeof pHash->dwData );
r = ERROR_SUCCESS;
}
CloseHandle( mapping );
}
CloseHandle( handle );
return r;
}
/***********************************************************************
* MsiGetFileHashA [MSI.@]
*/
UINT WINAPI MsiGetFileHashA( LPCSTR szFilePath, DWORD dwOptions,
PMSIFILEHASHINFO pHash )
{
LPWSTR file;
UINT r;
TRACE("%s %08x %p\n", debugstr_a(szFilePath), dwOptions, pHash );
file = strdupAtoW( szFilePath );
if (szFilePath && !file)
return ERROR_OUTOFMEMORY;
r = MsiGetFileHashW( file, dwOptions, pHash );
msi_free( file );
return r;
}
/***********************************************************************
* MsiAdvertiseScriptW [MSI.@]
*/
UINT WINAPI MsiAdvertiseScriptW( LPCWSTR szScriptFile, DWORD dwFlags,
PHKEY phRegData, BOOL fRemoveItems )
{
FIXME("%s %08x %p %d\n",
debugstr_w( szScriptFile ), dwFlags, phRegData, fRemoveItems );
return ERROR_CALL_NOT_IMPLEMENTED;
}
/***********************************************************************
* MsiAdvertiseScriptA [MSI.@]
*/
UINT WINAPI MsiAdvertiseScriptA( LPCSTR szScriptFile, DWORD dwFlags,
PHKEY phRegData, BOOL fRemoveItems )
{
FIXME("%s %08x %p %d\n",
debugstr_a( szScriptFile ), dwFlags, phRegData, fRemoveItems );
return ERROR_CALL_NOT_IMPLEMENTED;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -