static UINT ACTION_AppSearchIni(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig) { static const WCHAR query[] = { 's','e','l','e','c','t',' ','*',' ', 'f','r','o','m',' ', 'I','n','i','L','o','c','a','t','o','r',' ', 'w','h','e','r','e',' ', 'S','i','g','n','a','t','u','r','e','_',' ','=',' ','\'','%','s','\'',0}; MSIRECORD *row; LPWSTR fileName, section, key; int field, type; WCHAR buf[MAX_PATH]; TRACE("%s\n", debugstr_w(sig->Name)); *appValue = NULL; row = MSI_QueryGetRecord( package->db, query, sig->Name ); if (!row) { TRACE("failed to query IniLocator for %s\n", debugstr_w(sig->Name)); return ERROR_SUCCESS; } fileName = msi_dup_record_field(row, 2); section = msi_dup_record_field(row, 3); key = msi_dup_record_field(row, 4); field = MSI_RecordGetInteger(row, 5); type = MSI_RecordGetInteger(row, 6); if (field == MSI_NULL_INTEGER) field = 0; if (type == MSI_NULL_INTEGER) type = 0; GetPrivateProfileStringW(section, key, NULL, buf, MAX_PATH, fileName); if (buf[0]) { switch (type & 0x0f) { case msidbLocatorTypeDirectory: ACTION_SearchDirectory(package, sig, buf, 0, appValue); break; case msidbLocatorTypeFileName: *appValue = app_search_file(buf, sig); break; case msidbLocatorTypeRawValue: *appValue = get_ini_field(buf, field); break; } } msi_free(fileName); msi_free(section); msi_free(key); msiobj_release(&row->hdr); return ERROR_SUCCESS; }
static UINT iterate_appsearch(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPWSTR propName, sigName, value = NULL; MSISIGNATURE sig; UINT r; /* get property and signature */ propName = msi_dup_record_field(row,1); sigName = msi_dup_record_field(row,2); TRACE("%s %s\n", debugstr_w(propName), debugstr_w(sigName)); r = ACTION_AppSearchSigName(package, sigName, &sig, &value); if (value) { MSI_SetPropertyW(package, propName, value); msi_free(value); } ACTION_FreeSignature(&sig); msi_free(propName); msi_free(sigName); return r; }
/* Fills in sig with the values from the Signature table, where name is the * signature to find. Upon return, sig->File will be NULL if the record is not * found, and not NULL if it is found. * Warning: clears all fields in sig! * Returns ERROR_SUCCESS upon success (where not finding the record counts as * success), something else on error. */ static UINT ACTION_AppSearchGetSignature(MSIPACKAGE *package, MSISIGNATURE *sig, LPCWSTR name) { static const WCHAR query[] = { 's','e','l','e','c','t',' ','*',' ', 'f','r','o','m',' ', 'S','i','g','n','a','t','u','r','e',' ', 'w','h','e','r','e',' ','S','i','g','n','a','t','u','r','e',' ','=',' ', '\'','%','s','\'',0}; LPWSTR minVersion, maxVersion; MSIRECORD *row; DWORD time; TRACE("package %p, sig %p\n", package, sig); memset(sig, 0, sizeof(*sig)); sig->Name = name; row = MSI_QueryGetRecord( package->db, query, name ); if (!row) { TRACE("failed to query signature for %s\n", debugstr_w(name)); return ERROR_SUCCESS; } /* get properties */ sig->File = msi_dup_record_field(row,2); minVersion = msi_dup_record_field(row,3); if (minVersion) { msi_parse_version_string( minVersion, &sig->MinVersionMS, &sig->MinVersionLS ); msi_free( minVersion ); } maxVersion = msi_dup_record_field(row,4); if (maxVersion) { msi_parse_version_string( maxVersion, &sig->MaxVersionMS, &sig->MaxVersionLS ); msi_free( maxVersion ); } sig->MinSize = MSI_RecordGetInteger(row,5); if (sig->MinSize == MSI_NULL_INTEGER) sig->MinSize = 0; sig->MaxSize = MSI_RecordGetInteger(row,6); if (sig->MaxSize == MSI_NULL_INTEGER) sig->MaxSize = 0; sig->Languages = msi_dup_record_field(row,9); time = MSI_RecordGetInteger(row,7); if (time != MSI_NULL_INTEGER) DosDateTimeToFileTime(HIWORD(time), LOWORD(time), &sig->MinTime); time = MSI_RecordGetInteger(row,8); if (time != MSI_NULL_INTEGER) DosDateTimeToFileTime(HIWORD(time), LOWORD(time), &sig->MaxTime); TRACE("Found file name %s for Signature_ %s;\n", debugstr_w(sig->File), debugstr_w(name)); TRACE("MinVersion is %d.%d.%d.%d\n", HIWORD(sig->MinVersionMS), LOWORD(sig->MinVersionMS), HIWORD(sig->MinVersionLS), LOWORD(sig->MinVersionLS)); TRACE("MaxVersion is %d.%d.%d.%d\n", HIWORD(sig->MaxVersionMS), LOWORD(sig->MaxVersionMS), HIWORD(sig->MaxVersionLS), LOWORD(sig->MaxVersionLS)); TRACE("MinSize is %d, MaxSize is %d;\n", sig->MinSize, sig->MaxSize); TRACE("Languages is %s\n", debugstr_w(sig->Languages)); msiobj_release( &row->hdr ); return ERROR_SUCCESS; }
static UINT ACTION_AppSearchReg(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig) { static const WCHAR query[] = { 's','e','l','e','c','t',' ','*',' ', 'f','r','o','m',' ', 'R','e','g','L','o','c','a','t','o','r',' ', 'w','h','e','r','e',' ', 'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0}; LPWSTR keyPath = NULL, valueName = NULL; LPWSTR deformatted = NULL; LPWSTR ptr = NULL, end; int root, type; HKEY rootKey, key = NULL; DWORD sz = 0, regType; LPBYTE value = NULL; MSIRECORD *row; UINT rc; TRACE("%s\n", debugstr_w(sig->Name)); *appValue = NULL; row = MSI_QueryGetRecord( package->db, query, sig->Name ); if (!row) { TRACE("failed to query RegLocator for %s\n", debugstr_w(sig->Name)); return ERROR_SUCCESS; } root = MSI_RecordGetInteger(row,2); keyPath = msi_dup_record_field(row,3); valueName = msi_dup_record_field(row,4); type = MSI_RecordGetInteger(row,5); deformat_string(package, keyPath, &deformatted); switch (root) { case msidbRegistryRootClassesRoot: rootKey = HKEY_CLASSES_ROOT; break; case msidbRegistryRootCurrentUser: rootKey = HKEY_CURRENT_USER; break; case msidbRegistryRootLocalMachine: rootKey = HKEY_LOCAL_MACHINE; break; case msidbRegistryRootUsers: rootKey = HKEY_USERS; break; default: WARN("Unknown root key %d\n", root); goto end; } rc = RegOpenKeyW(rootKey, deformatted, &key); if (rc) { TRACE("RegOpenKeyW returned %d\n", rc); goto end; } rc = RegQueryValueExW(key, valueName, NULL, NULL, NULL, &sz); if (rc) { TRACE("RegQueryValueExW returned %d\n", rc); goto end; } /* FIXME: sanity-check sz before allocating (is there an upper-limit * on the value of a property?) */ value = msi_alloc( sz ); rc = RegQueryValueExW(key, valueName, NULL, ®Type, value, &sz); if (rc) { TRACE("RegQueryValueExW returned %d\n", rc); goto end; } /* bail out if the registry key is empty */ if (sz == 0) goto end; if ((regType == REG_SZ || regType == REG_EXPAND_SZ) && (ptr = strchrW((LPWSTR)value, '"')) && (end = strchrW(++ptr, '"'))) *end = '\0'; else ptr = (LPWSTR)value; switch (type & 0x0f) { case msidbLocatorTypeDirectory: rc = ACTION_SearchDirectory(package, sig, ptr, 0, appValue); break; case msidbLocatorTypeFileName: *appValue = app_search_file(ptr, sig); break; case msidbLocatorTypeRawValue: ACTION_ConvertRegValue(regType, value, sz, appValue); break; default: FIXME("unimplemented for type %d (key path %s, value %s)\n", type, debugstr_w(keyPath), debugstr_w(valueName)); } end: msi_free( value ); RegCloseKey( key ); msi_free( keyPath ); msi_free( valueName ); msi_free( deformatted ); msiobj_release(&row->hdr); return ERROR_SUCCESS; }
static UINT ITERATE_UnregisterFonts( MSIRECORD *row, LPVOID param ) { MSIPACKAGE *package = param; LPWSTR name; LPCWSTR filename; MSIFILE *file; MSICOMPONENT *comp; HKEY hkey1, hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); file = msi_get_loaded_file( package, filename ); if (!file) { WARN("unable to find file %s\n", debugstr_w(filename)); return ERROR_SUCCESS; } comp = msi_get_loaded_component( package, file->Component->Component ); if (!comp) { WARN("unable to find component %s\n", debugstr_w(file->Component->Component)); return ERROR_SUCCESS; } comp->Action = msi_get_component_action( package, comp ); if (comp->Action != INSTALLSTATE_ABSENT) { TRACE("component not scheduled for removal %s\n", debugstr_w(comp->Component)); return ERROR_SUCCESS; } RegCreateKeyW( HKEY_LOCAL_MACHINE, regfont1, &hkey1 ); RegCreateKeyW( HKEY_LOCAL_MACHINE, regfont2, &hkey2 ); if (MSI_RecordIsNull( row, 2 )) name = font_name_from_file( file->TargetPath ); else name = msi_dup_record_field( row, 2 ); if (name) { RegDeleteValueW( hkey1, name ); RegDeleteValueW( hkey2, name ); } msi_free( name ); RegCloseKey( hkey1 ); RegCloseKey( hkey2 ); /* the UI chunk */ uirow = MSI_CreateRecord( 1 ); uipath = strdupW( file->TargetPath ); p = strrchrW( uipath,'\\' ); if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); msi_ui_actiondata( package, szUnregisterFonts, uirow ); msiobj_release( &uirow->hdr ); msi_free( uipath ); /* FIXME: call msi_ui_progress? */ return ERROR_SUCCESS; }
static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig) { static const WCHAR query[] = { 's','e','l','e','c','t',' ','*',' ', 'f','r','o','m',' ', 'D','r','L','o','c','a','t','o','r',' ', 'w','h','e','r','e',' ', 'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0}; LPWSTR parentName = NULL, path = NULL, parent = NULL; WCHAR expanded[MAX_PATH]; MSIRECORD *row; int depth; UINT rc; TRACE("%s\n", debugstr_w(sig->Name)); msi_free(sig->File); sig->File = NULL; *appValue = NULL; row = MSI_QueryGetRecord( package->db, query, sig->Name ); if (!row) { TRACE("failed to query DrLocator for %s\n", debugstr_w(sig->Name)); return ERROR_SUCCESS; } /* check whether parent is set */ parentName = msi_dup_record_field(row,2); if (parentName) { MSISIGNATURE parentSig; rc = ACTION_AppSearchSigName(package, parentName, &parentSig, &parent); ACTION_FreeSignature(&parentSig); msi_free(parentName); } /* now look for path */ path = msi_dup_record_field(row,3); if (MSI_RecordIsNull(row,4)) depth = 0; else depth = MSI_RecordGetInteger(row,4); ACTION_ExpandAnyPath(package, path, expanded, MAX_PATH); msi_free(path); if (parent) { path = msi_alloc((strlenW(parent) + strlenW(expanded) + 1) * sizeof(WCHAR)); if (!path) { rc = ERROR_OUTOFMEMORY; goto end; } strcpyW(path, parent); strcatW(path, expanded); } else path = expanded; rc = ACTION_SearchDirectory(package, sig, path, depth, appValue); end: if (path != expanded) msi_free(path); msi_free(parent); msiobj_release(&row->hdr); TRACE("returning %d\n", rc); return rc; }
static UINT ITERATE_RegisterFonts(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPWSTR name; LPCWSTR filename; MSIFILE *file; HKEY hkey1, hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); file = get_loaded_file( package, filename ); if (!file) { ERR("Unable to load file\n"); return ERROR_SUCCESS; } if (!file->Component->Enabled) { TRACE("component is disabled\n"); return ERROR_SUCCESS; } if (file->Component->ActionRequest != INSTALLSTATE_LOCAL) { TRACE("Component not scheduled for installation\n"); return ERROR_SUCCESS; } RegCreateKeyW(HKEY_LOCAL_MACHINE,regfont1,&hkey1); RegCreateKeyW(HKEY_LOCAL_MACHINE,regfont2,&hkey2); if (MSI_RecordIsNull(row,2)) name = font_name_from_file( file->TargetPath ); else name = msi_dup_record_field(row,2); if (name) { msi_reg_set_val_str( hkey1, name, file->TargetPath); msi_reg_set_val_str( hkey2, name, file->TargetPath); } msi_free(name); RegCloseKey(hkey1); RegCloseKey(hkey2); /* the UI chunk */ uirow = MSI_CreateRecord( 1 ); uipath = strdupW( file->TargetPath ); p = strrchrW(uipath,'\\'); if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); ui_actiondata( package, szRegisterFonts, uirow); msiobj_release( &uirow->hdr ); msi_free( uipath ); /* FIXME: call ui_progress? */ return ERROR_SUCCESS; }
static UINT ACTION_AppSearchDr(MSIPACKAGE *package, LPWSTR *appValue, MSISIGNATURE *sig) { static const WCHAR query[] = { 's','e','l','e','c','t',' ','*',' ', 'f','r','o','m',' ', 'D','r','L','o','c','a','t','o','r',' ', 'w','h','e','r','e',' ', 'S','i','g','n','a','t','u','r','e','_',' ','=',' ', '\'','%','s','\'',0}; LPWSTR parentName = NULL, parent = NULL; WCHAR path[MAX_PATH]; WCHAR expanded[MAX_PATH]; MSIRECORD *row; int depth; DWORD sz, attr; UINT rc; TRACE("%s\n", debugstr_w(sig->Name)); *appValue = NULL; row = MSI_QueryGetRecord( package->db, query, sig->Name ); if (!row) { TRACE("failed to query DrLocator for %s\n", debugstr_w(sig->Name)); return ERROR_SUCCESS; } /* check whether parent is set */ parentName = msi_dup_record_field(row,2); if (parentName) { MSISIGNATURE parentSig; rc = ACTION_AppSearchSigName(package, parentName, &parentSig, &parent); ACTION_FreeSignature(&parentSig); msi_free(parentName); } sz = MAX_PATH; MSI_RecordGetStringW(row, 3, path, &sz); if (MSI_RecordIsNull(row,4)) depth = 0; else depth = MSI_RecordGetInteger(row,4); if (sz) ACTION_ExpandAnyPath(package, path, expanded, MAX_PATH); else strcpyW(expanded, path); if (parent) { attr = GetFileAttributesW(parent); if (attr != INVALID_FILE_ATTRIBUTES && !(attr & FILE_ATTRIBUTE_DIRECTORY)) { PathRemoveFileSpecW(parent); PathAddBackslashW(parent); } strcpyW(path, parent); strcatW(path, expanded); } else if (sz) strcpyW(path, expanded); PathAddBackslashW(path); rc = ACTION_SearchDirectory(package, sig, path, depth, appValue); msi_free(parent); msiobj_release(&row->hdr); TRACE("returning %d\n", rc); return rc; }
static UINT ITERATE_RegisterFonts(MSIRECORD *row, LPVOID param) { MSIPACKAGE *package = param; LPWSTR name; LPCWSTR filename; MSIFILE *file; static const WCHAR regfont1[] = {'S','o','f','t','w','a','r','e','\\', 'M','i','c','r','o','s','o','f','t','\\', 'W','i','n','d','o','w','s',' ','N','T','\\', 'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\', 'F','o','n','t','s',0}; static const WCHAR regfont2[] = {'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','\\', 'F','o','n','t','s',0}; HKEY hkey1; HKEY hkey2; MSIRECORD *uirow; LPWSTR uipath, p; filename = MSI_RecordGetString( row, 1 ); file = get_loaded_file( package, filename ); if (!file) { ERR("Unable to load file\n"); return ERROR_SUCCESS; } /* check to make sure that component is installed */ if (!ACTION_VerifyComponentForAction( file->Component, INSTALLSTATE_LOCAL)) { TRACE("Skipping: Component not scheduled for install\n"); return ERROR_SUCCESS; } RegCreateKeyW(HKEY_LOCAL_MACHINE,regfont1,&hkey1); RegCreateKeyW(HKEY_LOCAL_MACHINE,regfont2,&hkey2); if (MSI_RecordIsNull(row,2)) name = load_ttfname_from( file->TargetPath ); else name = msi_dup_record_field(row,2); if (name) { msi_reg_set_val_str( hkey1, name, file->TargetPath); msi_reg_set_val_str( hkey2, name, file->TargetPath); } msi_free(name); RegCloseKey(hkey1); RegCloseKey(hkey2); /* the UI chunk */ uirow = MSI_CreateRecord( 1 ); uipath = strdupW( file->TargetPath ); p = strrchrW(uipath,'\\'); if (p) p++; else p = uipath; MSI_RecordSetStringW( uirow, 1, p ); ui_actiondata( package, szRegisterFonts, uirow); msiobj_release( &uirow->hdr ); msi_free( uipath ); /* FIXME: call ui_progress? */ return ERROR_SUCCESS; }