public static PayloadInfoRow Create(SourceLineNumberCollection sourceLineNumbers, Output output, string id, string name, string sourceFile, bool contentFile, bool suppressSignatureValidation, string downloadUrl, string container, PackagingType packaging) { Table table = output.Tables["PayloadInfo"]; PayloadInfoRow row = (PayloadInfoRow)table.CreateRow(sourceLineNumbers); row.Id = id; row.Name = name; row.SourceFile = sourceFile; row.ContentFile = contentFile; row.SuppressSignatureValidation = suppressSignatureValidation; row.DownloadUrl = downloadUrl; row.Container = container; row.Packaging = packaging; PayloadInfoRow.ResolvePayloadInfo(row); return(row); }
/// <summary> /// Creates a new row in the table. /// </summary> /// <param name="sourceLineNumbers">Original source lines for this row.</param> /// <param name="add">Specifies whether to only create the row or add it to the table automatically.</param> /// <returns>Row created in table.</returns> public Row CreateRow(SourceLineNumberCollection sourceLineNumbers, bool add) { Row row; switch (this.Name) { case "BBControl": row = new BBControlRow(sourceLineNumbers, this); break; case "ChainMsiPackage": row = new ChainMsiPackageRow(sourceLineNumbers, this); break; case "Component": row = new ComponentRow(sourceLineNumbers, this); break; case "Control": row = new ControlRow(sourceLineNumbers, this); break; case "File": row = new FileRow(sourceLineNumbers, this); break; case "Media": row = new MediaRow(sourceLineNumbers, this); break; case "PayloadInfo": row = new PayloadInfoRow(sourceLineNumbers, this); break; case "Upgrade": row = new UpgradeRow(sourceLineNumbers, this); break; case "Variable": row = new VariableRow(sourceLineNumbers, this); break; case "WixAction": row = new WixActionRow(sourceLineNumbers, this); break; case "WixApprovedExeForElevation": row = new WixApprovedExeForElevationRow(sourceLineNumbers, this); break; case "WixBundle": row = new WixBundleRow(sourceLineNumbers, this); break; case "WixBundlePatchTargetCode": row = new WixBundlePatchTargetCodeRow(sourceLineNumbers, this); break; case "WixBundleUpdate": row = new WixBundleUpdateRow(sourceLineNumbers, this); break; case "WixCatalog": row = new WixCatalogRow(sourceLineNumbers, this); break; case "WixCommandLine": row = new WixCommandLineRow(sourceLineNumbers, this); break; case "WixComplexReference": row = new WixComplexReferenceRow(sourceLineNumbers, this); break; case "WixFile": row = new WixFileRow(sourceLineNumbers, this); break; case "WixMedia": row = new WixMediaRow(sourceLineNumbers, this); break; case "WixMediaTemplate": row = new WixMediaTemplateRow(sourceLineNumbers, this); break; case "WixMerge": row = new WixMergeRow(sourceLineNumbers, this); break; case "WixProperty": row = new WixPropertyRow(sourceLineNumbers, this); break; case "WixSimpleReference": row = new WixSimpleReferenceRow(sourceLineNumbers, this); break; case "WixUpdateRegistration": row = new WixUpdateRegistrationRow(sourceLineNumbers, this); break; case "WixVariable": row = new WixVariableRow(sourceLineNumbers, this); break; default: row = new Row(sourceLineNumbers, this); break; } if (add) { this.rows.Add(row); } return(row); }
/// <summary> /// Creates a new row in the table. /// </summary> /// <param name="sourceLineNumbers">Original source lines for this row.</param> /// <param name="add">Specifies whether to only create the row or add it to the table automatically.</param> /// <returns>Row created in table.</returns> public Row CreateRow(SourceLineNumberCollection sourceLineNumbers, bool add) { Row row; switch (this.Name) { case "BBControl": row = new BBControlRow(sourceLineNumbers, this); break; case "ChainMsiPackage": row = new ChainMsiPackageRow(sourceLineNumbers, this); break; case "Component": row = new ComponentRow(sourceLineNumbers, this); break; case "Control": row = new ControlRow(sourceLineNumbers, this); break; case "File": row = new FileRow(sourceLineNumbers, this); break; case "Media": row = new MediaRow(sourceLineNumbers, this); break; case "PayloadInfo": row = new PayloadInfoRow(sourceLineNumbers, this); break; case "Upgrade": row = new UpgradeRow(sourceLineNumbers, this); break; case "Variable": row = new VariableRow(sourceLineNumbers, this); break; case "WixAction": row = new WixActionRow(sourceLineNumbers, this); break; case "WixApprovedExeForElevation": row = new WixApprovedExeForElevationRow(sourceLineNumbers, this); break; case "WixBundle": row = new WixBundleRow(sourceLineNumbers, this); break; case "WixBundlePatchTargetCode": row = new WixBundlePatchTargetCodeRow(sourceLineNumbers, this); break; case "WixBundleUpdate": row = new WixBundleUpdateRow(sourceLineNumbers, this); break; case "WixCatalog": row = new WixCatalogRow(sourceLineNumbers, this); break; case "WixCommandLine": row = new WixCommandLineRow(sourceLineNumbers, this); break; case "WixComplexReference": row = new WixComplexReferenceRow(sourceLineNumbers, this); break; case "WixFile": row = new WixFileRow(sourceLineNumbers, this); break; case "WixMedia": row = new WixMediaRow(sourceLineNumbers, this); break; case "WixMediaTemplate": row = new WixMediaTemplateRow(sourceLineNumbers, this); break; case "WixMerge": row = new WixMergeRow(sourceLineNumbers, this); break; case "WixProperty": row = new WixPropertyRow(sourceLineNumbers, this); break; case "WixSimpleReference": row = new WixSimpleReferenceRow(sourceLineNumbers, this); break; case "WixUpdateRegistration": row = new WixUpdateRegistrationRow(sourceLineNumbers, this); break; case "WixVariable": row = new WixVariableRow(sourceLineNumbers, this); break; default: row = new Row(sourceLineNumbers, this); break; } if (add) { this.rows.Add(row); } return row; }
/// <summary> /// Creates a new row in the table. /// </summary> /// <param name="sourceLineNumbers">Original source lines for this row.</param> /// <returns>Row created in table.</returns> public Row CreateRow(SourceLineNumberCollection sourceLineNumbers) { Row row; switch (this.Name) { case "BBControl": row = new BBControlRow(sourceLineNumbers, this); break; case "ChainMsiPackage": row = new ChainMsiPackageRow(sourceLineNumbers, this); break; case "Component": row = new ComponentRow(sourceLineNumbers, this); break; case "Control": row = new ControlRow(sourceLineNumbers, this); break; case "File": row = new FileRow(sourceLineNumbers, this); break; case "Media": row = new MediaRow(sourceLineNumbers, this); break; case "PayloadInfo": row = new PayloadInfoRow(sourceLineNumbers, this); break; case "Upgrade": row = new UpgradeRow(sourceLineNumbers, this); break; case "WixAction": row = new WixActionRow(sourceLineNumbers, this); break; case "WixComplexReference": row = new WixComplexReferenceRow(sourceLineNumbers, this); break; case "WixFile": row = new WixFileRow(sourceLineNumbers, this); break; case "WixMedia": row = new WixMediaRow(sourceLineNumbers, this); break; case "WixMediaTemplate": row = new WixMediaTemplateRow(sourceLineNumbers, this); break; case "WixMerge": row = new WixMergeRow(sourceLineNumbers, this); break; case "WixProperty": row = new WixPropertyRow(sourceLineNumbers, this); break; case "WixSimpleReference": row = new WixSimpleReferenceRow(sourceLineNumbers, this); break; case "WixVariable": row = new WixVariableRow(sourceLineNumbers, this); break; default: row = new Row(sourceLineNumbers, this); break; } this.rows.Add(row); return(row); }
private void WriteBurnManifestPayloadAttributes(XmlTextWriter writer, PayloadInfoRow payload, bool embeddedOnly, BinderFileManager fileManager, Dictionary<string, PayloadInfoRow> allPayloads) { Debug.Assert(!embeddedOnly || PackagingType.Embedded == payload.Packaging); writer.WriteAttributeString("Id", payload.Id); writer.WriteAttributeString("FilePath", payload.Name); writer.WriteAttributeString("FileSize", payload.FileSize.ToString(CultureInfo.InvariantCulture)); writer.WriteAttributeString("Hash", payload.Hash); if (payload.LayoutOnly) { writer.WriteAttributeString("LayoutOnly", "yes"); } if (!String.IsNullOrEmpty(payload.PublicKey)) { writer.WriteAttributeString("CertificateRootPublicKeyIdentifier", payload.PublicKey); } if (!String.IsNullOrEmpty(payload.Thumbprint)) { writer.WriteAttributeString("CertificateRootThumbprint", payload.Thumbprint); } switch (payload.Packaging) { case PackagingType.Embedded: // this means it's in a container. if (!String.IsNullOrEmpty(payload.DownloadUrl)) { this.core.OnMessage(WixWarnings.DownloadUrlNotSupportedForEmbeddedPayloads(payload.SourceLineNumbers, payload.Id)); } writer.WriteAttributeString("Packaging", "embedded"); writer.WriteAttributeString("SourcePath", payload.EmbeddedId); if (Compiler.BurnUXContainerId != payload.Container) { writer.WriteAttributeString("Container", payload.Container); } break; case PackagingType.External: string packageId = payload.ParentPackagePayload; string parentUrl = payload.ParentPackagePayload == null ? null : allPayloads[payload.ParentPackagePayload].DownloadUrl; string resolvedUrl = fileManager.ResolveUrl(payload.DownloadUrl, parentUrl, packageId, payload.Id, payload.Name); if (!String.IsNullOrEmpty(resolvedUrl)) { writer.WriteAttributeString("DownloadUrl", resolvedUrl); } else if (!String.IsNullOrEmpty(payload.DownloadUrl)) { writer.WriteAttributeString("DownloadUrl", payload.DownloadUrl); } writer.WriteAttributeString("Packaging", "external"); writer.WriteAttributeString("SourcePath", payload.Name); break; } if (!String.IsNullOrEmpty(payload.CatalogId)) { writer.WriteAttributeString("Catalog", payload.CatalogId); } }
private void VerifyPayloadWithCatalog(PayloadInfoRow payloadInfo, Dictionary<string, CatalogInfo> catalogs) { bool validated = false; foreach (CatalogInfo catalog in catalogs.Values) { if (!validated) { // Get the file hash uint cryptHashSize = 20; byte[] cryptHashBytes = new byte[cryptHashSize]; int error; IntPtr fileHandle = IntPtr.Zero; using (FileStream payloadStream = File.OpenRead(payloadInfo.FullFileName)) { // Get the file handle fileHandle = payloadStream.SafeFileHandle.DangerousGetHandle(); // 20 bytes is usually the hash size. Future hashes may be bigger if (!VerifyInterop.CryptCATAdminCalcHashFromFileHandle( fileHandle, ref cryptHashSize, cryptHashBytes, 0)) { error = Marshal.GetLastWin32Error(); if (VerifyInterop.ErrorInsufficientBuffer == error) { error = 0; cryptHashBytes = new byte[cryptHashSize]; if (!VerifyInterop.CryptCATAdminCalcHashFromFileHandle( fileHandle, ref cryptHashSize, cryptHashBytes, 0)) { error = Marshal.GetLastWin32Error(); } } if (0 != error) { this.core.OnMessage(WixErrors.CatalogFileHashFailed(payloadInfo.FullFileName, error)); } } } VerifyInterop.WinTrustCatalogInfo catalogData = new VerifyInterop.WinTrustCatalogInfo(); VerifyInterop.WinTrustData trustData = new VerifyInterop.WinTrustData(); try { // Create WINTRUST_CATALOG_INFO structure catalogData.cbStruct = (uint)Marshal.SizeOf(catalogData); catalogData.cbCalculatedFileHash = cryptHashSize; catalogData.pbCalculatedFileHash = Marshal.AllocCoTaskMem((int)cryptHashSize); Marshal.Copy(cryptHashBytes, 0, catalogData.pbCalculatedFileHash, (int)cryptHashSize); StringBuilder hashString = new StringBuilder(); foreach (byte hashByte in cryptHashBytes) { hashString.Append(hashByte.ToString("X2")); } catalogData.pcwszMemberTag = hashString.ToString(); // The file names need to be lower case for older OSes catalogData.pcwszMemberFilePath = payloadInfo.FullFileName.ToLowerInvariant(); catalogData.pcwszCatalogFilePath = catalog.FileInfo.FullName.ToLowerInvariant(); // Create WINTRUST_DATA structure trustData.cbStruct = (uint)Marshal.SizeOf(trustData); trustData.dwUIChoice = VerifyInterop.WTD_UI_NONE; trustData.fdwRevocationChecks = VerifyInterop.WTD_REVOKE_NONE; trustData.dwUnionChoice = VerifyInterop.WTD_CHOICE_CATALOG; trustData.dwStateAction = VerifyInterop.WTD_STATEACTION_VERIFY; trustData.dwProvFlags = VerifyInterop.WTD_REVOCATION_CHECK_NONE; // Create the structure pointers for unmanaged trustData.pCatalog = Marshal.AllocCoTaskMem(Marshal.SizeOf(catalogData)); Marshal.StructureToPtr(catalogData, trustData.pCatalog, false); // Call WinTrustVerify to validate the file with the catalog IntPtr noWindow = new IntPtr(-1); Guid verifyGuid = new Guid(VerifyInterop.GenericVerify2); long verifyResult = VerifyInterop.WinVerifyTrust(noWindow, ref verifyGuid, ref trustData); if (0 == verifyResult) { validated = true; payloadInfo.CatalogId = catalog.Id; } } finally { // Free the structure memory if (IntPtr.Zero != trustData.pCatalog) { Marshal.FreeCoTaskMem(trustData.pCatalog); } if (IntPtr.Zero != catalogData.pbCalculatedFileHash) { Marshal.FreeCoTaskMem(catalogData.pbCalculatedFileHash); } } } } // Error message if the file was not validated by one of the catalogs if (!validated) { this.core.OnMessage(WixErrors.CatalogVerificationFailed(payloadInfo.FullFileName)); } }
/// <summary> /// Creates a new row in the table. /// </summary> /// <param name="sourceLineNumbers">Original source lines for this row.</param> /// <returns>Row created in table.</returns> public Row CreateRow(SourceLineNumberCollection sourceLineNumbers) { Row row; switch (this.Name) { case "BBControl": row = new BBControlRow(sourceLineNumbers, this); break; case "ChainMsiPackage": row = new ChainMsiPackageRow(sourceLineNumbers, this); break; case "Component": row = new ComponentRow(sourceLineNumbers, this); break; case "Control": row = new ControlRow(sourceLineNumbers, this); break; case "File": row = new FileRow(sourceLineNumbers, this); break; case "Media": row = new MediaRow(sourceLineNumbers, this); break; case "PayloadInfo": row = new PayloadInfoRow(sourceLineNumbers, this); break; case "Upgrade": row = new UpgradeRow(sourceLineNumbers, this); break; case "WixAction": row = new WixActionRow(sourceLineNumbers, this); break; case "WixComplexReference": row = new WixComplexReferenceRow(sourceLineNumbers, this); break; case "WixFile": row = new WixFileRow(sourceLineNumbers, this); break; case "WixMedia": row = new WixMediaRow(sourceLineNumbers, this); break; case "WixMediaTemplate": row = new WixMediaTemplateRow(sourceLineNumbers, this); break; case "WixMerge": row = new WixMergeRow(sourceLineNumbers, this); break; case "WixProperty": row = new WixPropertyRow(sourceLineNumbers, this); break; case "WixSimpleReference": row = new WixSimpleReferenceRow(sourceLineNumbers, this); break; case "WixVariable": row = new WixVariableRow(sourceLineNumbers, this); break; default: row = new Row(sourceLineNumbers, this); break; } this.rows.Add(row); return row; }