/// <inheritdoc /> public void WriteFingerprintInputs(IFingerprinter writer) { writer.AddNested(ObservedPathSet.Labels.UnsafeOptions, UnsafeOptions.ComputeFingerprint); var thisRef = this; writer.AddNested(ObservedPathSet.Labels.Paths, w => { foreach (var p in thisRef.PathEntries) { w.Add(ObservedPathEntryConstants.Path, p.Path); if (p.Flags != ObservedPathEntryFlags.None) { w.Add(ObservedPathEntryConstants.Flags, p.Flags.ToString()); } if (p.EnumeratePatternRegex != null) { w.Add(ObservedPathEntryConstants.EnumeratePatternRegex, p.EnumeratePatternRegex); } } }); writer.AddCollection <StringId, ReadOnlyArray <StringId> >( ObservedPathSet.Labels.ObservedAccessedFileNames, ObservedAccessedFileNames, (w, v) => w.Add(v)); // Observed inputs are included directly into the strong fingerprint hash computation, // so they do not need to be serialized here }
private static void BuildStringHelper(JsonNode root, IFingerprinter wr) { if (root.Children.Count == 1 && root.Values.Count == 0) { wr.AddNested(root.Name, nestedWr => { BuildStringHelper(root.Children.First.Value, nestedWr); }); } else if (root.Children.Count == 0 && root.Values.Count == 1) { wr.Add(root.Name, root.Values[0]); } else { // Adding a collection is typically used to add a homogeneous collection of objects. // In this case, the values of the node and the children of the node both need to be added within the same nested collection. // To get around this without adding two collections associated with the same node, use just the current root node as the collection and // manually add the node's values and node's children. wr.AddCollection <JsonNode, IEnumerable <JsonNode> >(root.Name, new JsonNode[] { root }, (collectionWriter, n) => { foreach (var value in n.Values) { collectionWriter.Add(value); } for (var it = n.Children.First; it != null; it = it.Next) { BuildStringHelper(it.Value, collectionWriter); } }); } }
/// <summary> /// Compute fingerprint associated with this unsafe options. /// </summary> public void ComputeFingerprint(IFingerprinter fingerprinter) { fingerprinter.Add(nameof(UnsafeConfiguration.SandboxKind), UnsafeConfiguration.SandboxKind.ToString()); fingerprinter.Add(nameof(UnsafeConfiguration.ExistingDirectoryProbesAsEnumerations), getBoolString(UnsafeConfiguration.ExistingDirectoryProbesAsEnumerations)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreGetFinalPathNameByHandle), getBoolString(UnsafeConfiguration.IgnoreGetFinalPathNameByHandle)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreNonCreateFileReparsePoints), getBoolString(UnsafeConfiguration.IgnoreNonCreateFileReparsePoints)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreReparsePoints), getBoolString(UnsafeConfiguration.IgnoreReparsePoints)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreFullReparsePointResolving), getBoolString(UnsafeConfiguration.IgnoreFullReparsePointResolving)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreSetFileInformationByHandle), getBoolString(UnsafeConfiguration.IgnoreSetFileInformationByHandle)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreZwOtherFileInformation), getBoolString(UnsafeConfiguration.IgnoreZwOtherFileInformation)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreZwRenameFileInformation), getBoolString(UnsafeConfiguration.IgnoreZwRenameFileInformation)); fingerprinter.Add(nameof(UnsafeConfiguration.MonitorFileAccesses), getBoolString(UnsafeConfiguration.MonitorFileAccesses)); fingerprinter.Add(nameof(UnsafeConfiguration.MonitorNtCreateFile), getBoolString(UnsafeConfiguration.MonitorNtCreateFile)); fingerprinter.Add(nameof(UnsafeConfiguration.MonitorZwCreateOpenQueryFile), getBoolString(UnsafeConfiguration.MonitorZwCreateOpenQueryFile)); fingerprinter.Add(nameof(UnsafeConfiguration.PreserveOutputs), UnsafeConfiguration.PreserveOutputs.ToString()); fingerprinter.Add(nameof(UnsafeConfiguration.UnexpectedFileAccessesAreErrors), getBoolString(UnsafeConfiguration.UnexpectedFileAccessesAreErrors)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnorePreloadedDlls), getBoolString(UnsafeConfiguration.IgnorePreloadedDlls)); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreDynamicWritesOnAbsentProbes), UnsafeConfiguration.IgnoreDynamicWritesOnAbsentProbes.ToString()); fingerprinter.Add(nameof(UnsafeConfiguration.DoubleWritePolicy), UnsafeConfiguration.DoubleWritePolicy.HasValue ? UnsafeConfiguration.DoubleWritePolicy.Value.ToString() : string.Empty); fingerprinter.Add(nameof(UnsafeConfiguration.IgnoreUndeclaredAccessesUnderSharedOpaques), getBoolString(UnsafeConfiguration.IgnoreUndeclaredAccessesUnderSharedOpaques)); if (m_preservedOutputInfo.HasValue) { fingerprinter.AddNested(nameof(PreserveOutputsInfo), fp => m_preservedOutputInfo.Value.ComputeFingerprint(fp)); }
/// <inheritdoc /> public void WriteFingerprintInputs(IFingerprinter writer) { using (var stream = new MemoryStream()) { using (var buildXLWriter = new BuildXLWriter( debug: false, stream: stream, leaveOpen: false, logStats: false)) { UnsafeOptions.Serialize(buildXLWriter); writer.Add("SerializedUnsafeOptions", System.BitConverter.ToString(stream.ToArray())); } } var thisRef = this; writer.AddNested(ObservedPathEntryConstants.PathSet, w => { foreach (var p in thisRef.PathEntries) { w.Add(ObservedPathEntryConstants.Path, p.Path); if (p.Flags != ObservedPathEntryFlags.None) { w.Add(ObservedPathEntryConstants.Flags, p.Flags.ToString()); } if (p.EnumeratePatternRegex != null) { w.Add(ObservedPathEntryConstants.EnumeratePatternRegex, p.EnumeratePatternRegex); } } }); writer.AddCollection <StringId, ReadOnlyArray <StringId> >( "ObservedAccessedFileNames", ObservedAccessedFileNames, (w, v) => w.Add(v)); // Observed inputs are included directly into the strong fingerprint hash computation, // so they do not need to be serialized here }