public StoreApplicationReference(Guid RefScheme, string Id, string NcData)
 {
     this.Size             = (uint)Marshal.SizeOf(typeof(System.Deployment.Internal.Isolation.StoreApplicationReference));
     this.Flags            = RefFlags.Nothing;
     this.GuidScheme       = RefScheme;
     this.Identifier       = Id;
     this.NonCanonicalData = NcData;
 }
 public StoreApplicationReference(Guid RefScheme, string Id, string NcData)
 {
     this.Size = (uint) Marshal.SizeOf(typeof(StoreApplicationReference));
     this.Flags = RefFlags.Nothing;
     this.GuidScheme = RefScheme;
     this.Identifier = Id;
     this.NonCanonicalData = NcData;
 }
Example #3
0
        public void ReferenceResourceFiles(IEnumerable <string> resourceWimFiles, RefFlags refFlags, OpenFlags openFlags)
        {
            List <string> resources = new List <string>();

            foreach (string f in resourceWimFiles)
            {
                if (f == null)
                {
                    throw new ArgumentNullException(nameof(resourceWimFiles));
                }

                string dirPath  = Path.GetDirectoryName(f);
                string wildcard = Path.GetFileName(f);
                if (dirPath == null)
                {
                    dirPath = @"\";
                }
                if (dirPath.Length == 0)
                {
                    dirPath = ".";
                }
                if ((refFlags & RefFlags.GLOB_ENABLE) != 0 && wildcard.IndexOfAny(new[] { '*', '?' }) != -1)
                {
                    string removeAsterisk = StringHelper.ReplaceEx(f, "*", string.Empty, StringComparison.Ordinal);
                    var    files          = Directory.EnumerateFiles(dirPath, wildcard, SearchOption.AllDirectories);
                    resources.AddRange(files.Where(x => !x.Equals(removeAsterisk, StringComparison.OrdinalIgnoreCase)));
                }
                else
                {
                    resources.Add(f);
                }
            }

            if (resources.Count == 0 &&
                (refFlags & RefFlags.GLOB_ENABLE) != 0 && (refFlags & RefFlags.GLOB_ERR_ON_NOMATCH) != 0)
            {
                throw new WimLibException(ErrorCode.GLOB_HAD_NO_MATCHES);
            }

            ErrorCode ret = NativeMethods.ReferenceResourceFiles(_ptr, resources.ToArray(), (uint)resources.Count, RefFlags.DEFAULT, openFlags);

            WimLibException.CheckWimLibError(ret);
        }
        public void ReferenceTemplateImage_Template(string[] splitWimNames, RefFlags refFlags = RefFlags.DEFAULT, bool failure = false)
        {
            string[] splitWims = splitWimNames.Select(x => Path.Combine(TestSetup.SampleDir, x)).ToArray();
            string   destDir   = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            try
            {
                Directory.CreateDirectory(destDir);

                bool[] _checked = new bool[5];
                for (int i = 0; i < _checked.Length; i++)
                {
                    _checked[i] = false;
                }
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.EXTRACT_IMAGE_BEGIN:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[0] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_IMAGE_END:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[1] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_FILE_STRUCTURE:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[2] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_STREAMS:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[3] = true;
                    }
                    break;

                    case ProgressMsg.EXTRACT_METADATA:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        Assert.IsNotNull(m);

                        _checked[4] = true;
                    }
                    break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                try
                {
                    using (Wim wim = Wim.OpenWim(splitWims[0], OpenFlags.DEFAULT, ProgressCallback))
                    {
                        var leftSplitWims = splitWims.Skip(1);
                        wim.ReferenceResourceFiles(leftSplitWims, refFlags, OpenFlags.DEFAULT);

                        wim.ExtractImage(1, destDir, ExtractFlags.NO_ACLS);
                    }
                }
                catch (WimLibException)
                {
                    if (failure)
                    {
                        return;
                    }
                    else
                    {
                        Assert.Fail();
                    }
                }

                Assert.IsTrue(_checked.All(x => x));

                TestHelper.CheckFileSystem(SampleSet.Src03, destDir);
            }
            finally
            {
                if (Directory.Exists(destDir))
                {
                    Directory.Delete(destDir, true);
                }
            }
        }
Example #5
0
        public void ReferenceTemplateImageTemplate(string[] splitWimNames, RefFlags refFlags = RefFlags.None, bool failure = false)
        {
            string[] splitWims = splitWimNames.Select(x => Path.Combine(TestSetup.SampleDir, x)).ToArray();
            string   destDir   = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());

            try
            {
                Directory.CreateDirectory(destDir);

                bool[] _checked = new bool[5];
                for (int i = 0; i < _checked.Length; i++)
                {
                    _checked[i] = false;
                }
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.ExtractImageBegin:
                    {
                        ExtractProgress m = (ExtractProgress)info;
                        Assert.IsNotNull(m);

                        _checked[0] = true;
                    }
                    break;

                    case ProgressMsg.ExtractImageEnd:
                    {
                        ExtractProgress m = (ExtractProgress)info;
                        Assert.IsNotNull(m);

                        _checked[1] = true;
                    }
                    break;

                    case ProgressMsg.ExtractFileStructure:
                    {
                        ExtractProgress m = (ExtractProgress)info;
                        Assert.IsNotNull(m);

                        _checked[2] = true;
                    }
                    break;

                    case ProgressMsg.ExtractStreams:
                    {
                        ExtractProgress m = (ExtractProgress)info;
                        Assert.IsNotNull(m);

                        _checked[3] = true;
                    }
                    break;

                    case ProgressMsg.ExtractMetadata:
                    {
                        ExtractProgress m = (ExtractProgress)info;
                        Assert.IsNotNull(m);

                        _checked[4] = true;
                    }
                    break;
                    }
                    return(CallbackStatus.Continue);
                }

                try
                {
                    using (Wim wim = Wim.OpenWim(splitWims[0], OpenFlags.None, ProgressCallback))
                    {
                        var leftSplitWims = splitWims.Skip(1);
                        wim.ReferenceResourceFiles(leftSplitWims, refFlags, OpenFlags.None);

                        wim.ExtractImage(1, destDir, ExtractFlags.NoAcls);
                    }
                }
                catch (WimLibException)
                {
                    if (failure)
                    {
                        return;
                    }
                    else
                    {
                        Assert.Fail();
                    }
                }

                Assert.IsTrue(_checked.All(x => x));

                TestHelper.CheckFileSystem(SampleSet.Src03, destDir);
            }
            finally
            {
                if (Directory.Exists(destDir))
                {
                    Directory.Delete(destDir, true);
                }
            }
        }
 public StoreApplicationReference(System.Guid RefScheme, string Id, string NcData)
 {
     Size = (UInt32)Marshal.SizeOf(typeof(StoreApplicationReference));
     Flags = RefFlags.Nothing;
     GuidScheme = RefScheme;
     Identifier = Id;
     NonCanonicalData = NcData;
 }
Example #7
0
        public bool ApplyImage(string wimFile, int imageIndex, string Output, IEnumerable <string> referenceWIMs = null, ExtractFlags extractFlags = ExtractFlags.DEFAULT, RefFlags refFlags = RefFlags.DEFAULT, ProgressCallback progressCallback = null)
        {
            string title = $"Applying {wimFile.Split('\\').Last()}...";

            try
            {
                CallbackStatus ProgressCallback(ProgressMsg msg, object info, object progctx)
                {
                    switch (msg)
                    {
                    case ProgressMsg.EXTRACT_IMAGE_BEGIN:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                    }
                    break;

                    case ProgressMsg.EXTRACT_IMAGE_END:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                    }
                    break;

                    case ProgressMsg.EXTRACT_FILE_STRUCTURE:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        progressCallback?.Invoke($"Applying file structure ({(int)Math.Round((double)m.CurrentFileCount / m.EndFileCount * 100)}%)", 0, true);
                    }
                    break;

                    case ProgressMsg.EXTRACT_STREAMS:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        progressCallback?.Invoke(title, (int)Math.Round((double)m.CompletedBytes / m.TotalBytes * 100), false);
                    }
                    break;

                    case ProgressMsg.EXTRACT_METADATA:
                    {
                        ProgressInfo_Extract m = (ProgressInfo_Extract)info;
                        progressCallback?.Invoke($"Applying metadata ({(int)Math.Round((double)m.CompletedBytes / m.TotalBytes * 100)}%)", 0, true);
                    }
                    break;
                    }
                    return(CallbackStatus.CONTINUE);
                }

                using (Wim wim = Wim.OpenWim(wimFile, OpenFlags.DEFAULT))
                {
                    wim.RegisterCallback(ProgressCallback);
                    if (referenceWIMs != null && referenceWIMs.Count() > 0)
                    {
                        wim.ReferenceResourceFiles(referenceWIMs, (ManagedWimLib.RefFlags)refFlags, OpenFlags.DEFAULT);
                    }
                    wim.ExtractImage(imageIndex, Output, (ManagedWimLib.ExtractFlags)extractFlags);
                }
            }
            catch
            {
                return(false);
            }
            return(true);
        }