From e85c88848654dd7283046bdd5a6969492d8aa4c4 Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Fri, 13 Feb 2026 13:52:10 +0100 Subject: [PATCH 1/7] Introduce helpers for DWM/USER32 APIs --- MicroWin/MicroWin.csproj | 1 + .../DesktopWindowManager/WindowHelper.cs | 126 ++++++++++++++++++ 2 files changed, 127 insertions(+) create mode 100644 MicroWin/functions/Helpers/DesktopWindowManager/WindowHelper.cs diff --git a/MicroWin/MicroWin.csproj b/MicroWin/MicroWin.csproj index 7dba702..48bba20 100755 --- a/MicroWin/MicroWin.csproj +++ b/MicroWin/MicroWin.csproj @@ -84,6 +84,7 @@ + diff --git a/MicroWin/functions/Helpers/DesktopWindowManager/WindowHelper.cs b/MicroWin/functions/Helpers/DesktopWindowManager/WindowHelper.cs new file mode 100644 index 0000000..8e474c7 --- /dev/null +++ b/MicroWin/functions/Helpers/DesktopWindowManager/WindowHelper.cs @@ -0,0 +1,126 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using System.Drawing; +using System.Runtime.Remoting.Messaging; + +namespace MicroWin.functions.Helpers.DesktopWindowManager +{ + public class WindowHelper + { + public sealed class NativeMethods + { + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern IntPtr GetSystemMenu(IntPtr hwnd, bool bRevert); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + public static extern bool EnableMenuItem(IntPtr hMenu, uint uIDEnableItem, uint uEnable); + + [DllImport("dwmapi.dll")] + public static extern int DwmSetWindowAttribute(IntPtr hwnd, int attr, ref int attrValue, int attrSize); + } + + // User32 constants + const int SC_CLOSE = 0xF060; + const long MF_BYCOMMAND = 0; + const long MF_ENABLED = 0; + const long MF_GRAYED = 1; + const long MF_DISABLED = 2; + + // DwmApi constants + const int DWMWA_USE_IMMERSIVE_DARK_MODE = 20; + const int WS_EX_COMPOSITED = 0x2000000; + const int GWL_EXSTYLE = -20; + + public static void DisableCloseCapability(IntPtr wndHandle) + { + if (!wndHandle.Equals(IntPtr.Zero)) + { + IntPtr menu = NativeMethods.GetSystemMenu(wndHandle, false); + if (!menu.Equals(IntPtr.Zero)) + NativeMethods.EnableMenuItem(menu, SC_CLOSE, (uint)(MF_BYCOMMAND | MF_GRAYED | MF_DISABLED)); + } + } + + public static void EnableCloseCapability(IntPtr wndHandle) + { + if (!wndHandle.Equals(IntPtr.Zero)) + { + IntPtr menu = NativeMethods.GetSystemMenu(wndHandle, false); + if (!menu.Equals(IntPtr.Zero)) + NativeMethods.EnableMenuItem(menu, SC_CLOSE, (uint)(MF_BYCOMMAND | MF_ENABLED)); + } + } + + public static IntPtr? GetWindowHandleFromControl(Control ctrl) + { + return ctrl?.Handle; + } + + const int DARKMODE_MINMAJOR = 10; + const int DARKMODE_MINMINOR = 0; + const int DARKMODE_MINBUILD = 18362; + + public static void ToggleDarkTitleBar(IntPtr hwnd, bool darkMode) + { + int attribute = darkMode ? 1 : 0; + if (!IsWindowsVersionOrGreater(DARKMODE_MINMAJOR, DARKMODE_MINMINOR, DARKMODE_MINBUILD)) + return; + int result = NativeMethods.DwmSetWindowAttribute(hwnd, DWMWA_USE_IMMERSIVE_DARK_MODE, ref attribute, 4); + } + + private static bool IsWindowsVersionOrGreater(int majorVersion, int minorVersion, int buildNumber) + { + Version version = Environment.OSVersion.Version; + return version.Major > majorVersion || + (version.Major == majorVersion && version.Minor > minorVersion) || + (version.Major == majorVersion && version.Minor == minorVersion && version.Build >= buildNumber); + } + + public static int ScaleLogical(int px) + { + Single dx; + Control control = new(); + Graphics g = control.CreateGraphics(); + + try + { + dx = g.DpiX; + } + finally + { + g.Dispose(); + } + + return (int)(px * (dx / 96.0)); + } + + public static Point ScalePositionLogical(int posX, int posY) + { + return new Point(ScaleLogical(posX), ScaleLogical(posY)); + } + + public static Size ScaleSizeLogical(int width, int height) + { + return new Size(ScaleLogical(width), ScaleLogical(height)); + } + + public static Single GetSystemDpi() + { + return (Single)ScaleLogical(100); + } + + public static void DisplayToolTip(object tooltipSender, string tooltipMessage) + { + if (tooltipSender is Control ctrl) + { + ToolTip displayedToolTip = new(); + displayedToolTip.SetToolTip(ctrl, tooltipMessage); + } + } + } +} From 355ee622487dcf9d993c2eb00cc2554a68f78922 Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Tue, 17 Feb 2026 17:07:51 +0100 Subject: [PATCH 2/7] Revamped UI No more vibe-coded user controls; now plain panels and WinForms goodness! --- MicroWin/AppState.cs | 36 +- MicroWin/Classes/DriverExportMode.cs | 15 + MicroWin/Classes/UserAccount.cs | 15 + MicroWin/MainForm.Designer.cs | 987 +++++++++++++++++- MicroWin/MainForm.cs | 465 ++++++++- MicroWin/MainForm.resx | 132 +++ MicroWin/MicroWin.csproj | 15 +- MicroWin/Properties/AssemblyInfo.cs | 4 +- MicroWin/Properties/Resources.Designer.cs | 20 + MicroWin/Properties/Resources.resx | 20 +- MicroWin/Resources/user_creation_lusrmgr.png | Bin 0 -> 71717 bytes MicroWin/Resources/user_creation_settings.png | Bin 0 -> 31208 bytes MicroWin/WizardPages.cs | 412 -------- .../functions/OSCDIMG/OscdimgUtilities.cs | 2 +- MicroWin/functions/UI/WizardPage.cs | 27 + MicroWin/functions/dism/DismManager.cs | 18 +- MicroWin/functions/dism/OsFeatureDisabler.cs | 2 + MicroWin/functions/dism/OsPackageRemover.cs | 2 +- 18 files changed, 1688 insertions(+), 484 deletions(-) create mode 100644 MicroWin/Classes/DriverExportMode.cs create mode 100644 MicroWin/Classes/UserAccount.cs create mode 100644 MicroWin/MainForm.resx create mode 100644 MicroWin/Resources/user_creation_lusrmgr.png create mode 100644 MicroWin/Resources/user_creation_settings.png delete mode 100755 MicroWin/WizardPages.cs create mode 100644 MicroWin/functions/UI/WizardPage.cs diff --git a/MicroWin/AppState.cs b/MicroWin/AppState.cs index f8dbd22..c5ebff8 100755 --- a/MicroWin/AppState.cs +++ b/MicroWin/AppState.cs @@ -1,39 +1,27 @@ -using System.Collections.Generic; +using MicroWin.Classes; +using System.Collections.Generic; using System.IO; namespace MicroWin { - public class UserAccount - { - public string Name { get; set; } - public string Password { get; set; } - public string Role { get; set; } - } public static class AppState { - // 1. Path Definitions public static string IsoPath { get; set; } public static string TempRoot => Path.Combine(Path.GetTempPath(), "microwin"); - - // These provide the locations for the extraction and DISM workspace public static string MountPath => $"{Path.Combine(TempRoot, "mount")}"; public static string ScratchPath => $"{Path.Combine(TempRoot, "scratch")}"; - - // 2. Selection Data - public static int SelectedImageIndex { get; set; } - public static bool IsAuto { get; set; } - - // 3. Collections - public static List UserAccounts { get; set; } = new List(); - public static List SelectedPackages { get; set; } = new List(); - - // 4. Customization Toggles - public static bool AddWinUtilShortcut { get; set; } + public static int SelectedImageIndex { get; set; } = 0; + public static List UserAccounts { get; set; } = []; + /// + /// Determines whether to encode passwords with Base64 + /// + public static bool EncodeWithB64 { get; set; } = true; public static bool AddReportingToolShortcut { get; set; } + public static bool CopyUnattendToFileSystem { get; set; } + public static DriverExportMode DriverExportMode { get; set; } = DriverExportMode.NoExport; + public static string SaveISO { get; set; } - public static string saveISO { get; set; } - - public static string Version => "V1.0"; + public static string Version => "v1.99.2"; } } \ No newline at end of file diff --git a/MicroWin/Classes/DriverExportMode.cs b/MicroWin/Classes/DriverExportMode.cs new file mode 100644 index 0000000..e15ad27 --- /dev/null +++ b/MicroWin/Classes/DriverExportMode.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MicroWin.Classes +{ + public enum DriverExportMode : int + { + NoExport = 0, + ExportEssential = 1, + ExportAll = 2 + } +} diff --git a/MicroWin/Classes/UserAccount.cs b/MicroWin/Classes/UserAccount.cs new file mode 100644 index 0000000..6283ec6 --- /dev/null +++ b/MicroWin/Classes/UserAccount.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MicroWin.Classes +{ + public class UserAccount + { + public string Name { get; set; } + public string Password { get; set; } + public string Role { get; set; } + } +} diff --git a/MicroWin/MainForm.Designer.cs b/MicroWin/MainForm.Designer.cs index 093d23f..480fba7 100755 --- a/MicroWin/MainForm.Designer.cs +++ b/MicroWin/MainForm.Designer.cs @@ -28,12 +28,993 @@ protected override void Dispose(bool disposing) /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.ButtonPanel = new System.Windows.Forms.Panel(); + this.TableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.Back_Button = new System.Windows.Forms.Button(); + this.Next_Button = new System.Windows.Forms.Button(); + this.Cancel_Button = new System.Windows.Forms.Button(); + this.PageContainerPanel = new System.Windows.Forms.Panel(); + this.IsoChooserPage = new System.Windows.Forms.Panel(); + this.isoExtractionPB = new System.Windows.Forms.ProgressBar(); + this.isoPickerBtn = new System.Windows.Forms.Button(); + this.isoPathTB = new System.Windows.Forms.TextBox(); + this.lblExtractionStatus = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.SysCheckPage_Description = new System.Windows.Forms.Label(); + this.SysCheckPage_Header = new System.Windows.Forms.Label(); + this.WelcomePage = new System.Windows.Forms.Panel(); + this.lblDisclaimer = new System.Windows.Forms.Label(); + this.WelcomePage_Description = new System.Windows.Forms.Label(); + this.WelcomePage_Header = new System.Windows.Forms.Label(); + this.FinishPanel = new System.Windows.Forms.Panel(); + this.FinishPage_Description = new System.Windows.Forms.Label(); + this.FinishPage_Header = new System.Windows.Forms.Label(); + this.isoPickerOFD = new System.Windows.Forms.OpenFileDialog(); + this.ImageChooserPage = new System.Windows.Forms.Panel(); + this.label2 = new System.Windows.Forms.Label(); + this.lvVersions = new System.Windows.Forms.ListView(); + this.columnHeader1 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader2 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader3 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); + this.label3 = new System.Windows.Forms.Label(); + this.UserAccountsPage = new System.Windows.Forms.Panel(); + this.panel1 = new System.Windows.Forms.Panel(); + this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); + this.panel3 = new System.Windows.Forms.Panel(); + this.label10 = new System.Windows.Forms.Label(); + this.lnkLusrMgr = new System.Windows.Forms.LinkLabel(); + this.pictureBox1 = new System.Windows.Forms.PictureBox(); + this.pictureBox2 = new System.Windows.Forms.PictureBox(); + this.panel2 = new System.Windows.Forms.Panel(); + this.label9 = new System.Windows.Forms.Label(); + this.lnkImmersiveAccounts = new System.Windows.Forms.LinkLabel(); + this.label8 = new System.Windows.Forms.Label(); + this.b64CB = new System.Windows.Forms.CheckBox(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.label6 = new System.Windows.Forms.Label(); + this.label7 = new System.Windows.Forms.Label(); + this.usrNameTB = new System.Windows.Forms.TextBox(); + this.usrPasswordTB = new System.Windows.Forms.TextBox(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.usrNameCurrentSysNameBtn = new System.Windows.Forms.Button(); + this.usrPasswordRevealCB = new System.Windows.Forms.CheckBox(); + this.IsoSettingsPage = new System.Windows.Forms.Panel(); + this.label11 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); + this.ReportToolCB = new System.Windows.Forms.CheckBox(); + this.label13 = new System.Windows.Forms.Label(); + this.DriverExportCombo = new System.Windows.Forms.ComboBox(); + this.UnattendCopyCB = new System.Windows.Forms.CheckBox(); + this.IsoCreationPage = new System.Windows.Forms.Panel(); + this.label14 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.textBox1 = new System.Windows.Forms.TextBox(); + this.pnlProgress = new System.Windows.Forms.Panel(); + this.lblCurrentStatus = new System.Windows.Forms.Label(); + this.pbCurrent = new System.Windows.Forms.ProgressBar(); + this.lblOverallStatus = new System.Windows.Forms.Label(); + this.pbOverall = new System.Windows.Forms.ProgressBar(); + this.isoSaverSFD = new System.Windows.Forms.SaveFileDialog(); + this.ButtonPanel.SuspendLayout(); + this.TableLayoutPanel1.SuspendLayout(); + this.PageContainerPanel.SuspendLayout(); + this.IsoChooserPage.SuspendLayout(); + this.WelcomePage.SuspendLayout(); + this.FinishPanel.SuspendLayout(); + this.ImageChooserPage.SuspendLayout(); + this.UserAccountsPage.SuspendLayout(); + this.panel1.SuspendLayout(); + this.tableLayoutPanel3.SuspendLayout(); + this.panel3.SuspendLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); + this.panel2.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); + this.IsoSettingsPage.SuspendLayout(); + this.IsoCreationPage.SuspendLayout(); + this.pnlProgress.SuspendLayout(); + this.SuspendLayout(); + // + // ButtonPanel + // + this.ButtonPanel.Controls.Add(this.TableLayoutPanel1); + this.ButtonPanel.Dock = System.Windows.Forms.DockStyle.Bottom; + this.ButtonPanel.Location = new System.Drawing.Point(0, 521); + this.ButtonPanel.Name = "ButtonPanel"; + this.ButtonPanel.Size = new System.Drawing.Size(1008, 40); + this.ButtonPanel.TabIndex = 1; + // + // TableLayoutPanel1 + // + this.TableLayoutPanel1.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.TableLayoutPanel1.ColumnCount = 3; + this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.TableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 25F)); + this.TableLayoutPanel1.Controls.Add(this.Back_Button, 0, 0); + this.TableLayoutPanel1.Controls.Add(this.Next_Button, 1, 0); + this.TableLayoutPanel1.Controls.Add(this.Cancel_Button, 2, 0); + this.TableLayoutPanel1.Location = new System.Drawing.Point(777, 6); + this.TableLayoutPanel1.Name = "TableLayoutPanel1"; + this.TableLayoutPanel1.RowCount = 1; + this.TableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100F)); + this.TableLayoutPanel1.Size = new System.Drawing.Size(219, 29); + this.TableLayoutPanel1.TabIndex = 1; + // + // Back_Button + // + this.Back_Button.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Back_Button.Enabled = false; + this.Back_Button.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Back_Button.Location = new System.Drawing.Point(4, 3); + this.Back_Button.Name = "Back_Button"; + this.Back_Button.Size = new System.Drawing.Size(64, 23); + this.Back_Button.TabIndex = 0; + this.Back_Button.Text = "Back"; + this.Back_Button.Click += new System.EventHandler(this.Back_Button_Click); + // + // Next_Button + // + this.Next_Button.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Next_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Next_Button.Enabled = false; + this.Next_Button.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Next_Button.Location = new System.Drawing.Point(77, 3); + this.Next_Button.Name = "Next_Button"; + this.Next_Button.Size = new System.Drawing.Size(64, 23); + this.Next_Button.TabIndex = 1; + this.Next_Button.Text = "Next"; + this.Next_Button.Click += new System.EventHandler(this.Next_Button_Click); + // + // Cancel_Button + // + this.Cancel_Button.Anchor = System.Windows.Forms.AnchorStyles.None; + this.Cancel_Button.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.Cancel_Button.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.Cancel_Button.Location = new System.Drawing.Point(150, 3); + this.Cancel_Button.Name = "Cancel_Button"; + this.Cancel_Button.Size = new System.Drawing.Size(64, 23); + this.Cancel_Button.TabIndex = 1; + this.Cancel_Button.Text = "Cancel"; + // + // PageContainerPanel + // + this.PageContainerPanel.Controls.Add(this.IsoChooserPage); + this.PageContainerPanel.Controls.Add(this.WelcomePage); + this.PageContainerPanel.Controls.Add(this.FinishPanel); + this.PageContainerPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.PageContainerPanel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.PageContainerPanel.Location = new System.Drawing.Point(0, 0); + this.PageContainerPanel.Name = "PageContainerPanel"; + this.PageContainerPanel.Size = new System.Drawing.Size(1008, 521); + this.PageContainerPanel.TabIndex = 3; + // + // IsoChooserPage + // + this.IsoChooserPage.Controls.Add(this.isoExtractionPB); + this.IsoChooserPage.Controls.Add(this.isoPickerBtn); + this.IsoChooserPage.Controls.Add(this.isoPathTB); + this.IsoChooserPage.Controls.Add(this.lblExtractionStatus); + this.IsoChooserPage.Controls.Add(this.label1); + this.IsoChooserPage.Controls.Add(this.SysCheckPage_Description); + this.IsoChooserPage.Controls.Add(this.SysCheckPage_Header); + this.IsoChooserPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsoChooserPage.Location = new System.Drawing.Point(0, 0); + this.IsoChooserPage.Name = "IsoChooserPage"; + this.IsoChooserPage.Size = new System.Drawing.Size(1008, 521); + this.IsoChooserPage.TabIndex = 1; + this.IsoChooserPage.Visible = false; + // + // isoExtractionPB + // + this.isoExtractionPB.Location = new System.Drawing.Point(125, 219); + this.isoExtractionPB.Name = "isoExtractionPB"; + this.isoExtractionPB.Size = new System.Drawing.Size(719, 23); + this.isoExtractionPB.TabIndex = 4; + // + // isoPickerBtn + // + this.isoPickerBtn.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.isoPickerBtn.Location = new System.Drawing.Point(769, 146); + this.isoPickerBtn.Name = "isoPickerBtn"; + this.isoPickerBtn.Size = new System.Drawing.Size(75, 23); + this.isoPickerBtn.TabIndex = 3; + this.isoPickerBtn.Text = "Browse..."; + this.isoPickerBtn.UseVisualStyleBackColor = true; + this.isoPickerBtn.Click += new System.EventHandler(this.isoPickerBtn_Click); + // + // isoPathTB + // + this.isoPathTB.Location = new System.Drawing.Point(125, 147); + this.isoPathTB.Name = "isoPathTB"; + this.isoPathTB.ReadOnly = true; + this.isoPathTB.Size = new System.Drawing.Size(638, 23); + this.isoPathTB.TabIndex = 2; + this.isoPathTB.TextChanged += new System.EventHandler(this.isoPathTB_TextChanged); + // + // lblExtractionStatus + // + this.lblExtractionStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblExtractionStatus.AutoEllipsis = true; + this.lblExtractionStatus.AutoSize = true; + this.lblExtractionStatus.Location = new System.Drawing.Point(122, 200); + this.lblExtractionStatus.Name = "lblExtractionStatus"; + this.lblExtractionStatus.Size = new System.Drawing.Size(243, 15); + this.lblExtractionStatus.TabIndex = 1; + this.lblExtractionStatus.Text = "Disc image extraction status will appear here."; + // + // label1 + // + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label1.AutoEllipsis = true; + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(122, 128); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(68, 15); + this.label1.TabIndex = 1; + this.label1.Text = "Disc image:"; + // + // SysCheckPage_Description + // + this.SysCheckPage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SysCheckPage_Description.AutoEllipsis = true; + this.SysCheckPage_Description.Location = new System.Drawing.Point(17, 64); + this.SysCheckPage_Description.Name = "SysCheckPage_Description"; + this.SysCheckPage_Description.Size = new System.Drawing.Size(977, 52); + this.SysCheckPage_Description.TabIndex = 1; + this.SysCheckPage_Description.Text = "Please specify the ISO that you want to use with this wizard. Supported operating" + + " systems are Windows 10 and Windows 11."; + // + // SysCheckPage_Header + // + this.SysCheckPage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SysCheckPage_Header.AutoEllipsis = true; + this.SysCheckPage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SysCheckPage_Header.Location = new System.Drawing.Point(14, 12); + this.SysCheckPage_Header.Name = "SysCheckPage_Header"; + this.SysCheckPage_Header.Size = new System.Drawing.Size(980, 45); + this.SysCheckPage_Header.TabIndex = 0; + this.SysCheckPage_Header.Text = "Choose a disc image"; + // + // WelcomePage + // + this.WelcomePage.Controls.Add(this.lblDisclaimer); + this.WelcomePage.Controls.Add(this.WelcomePage_Description); + this.WelcomePage.Controls.Add(this.WelcomePage_Header); + this.WelcomePage.Dock = System.Windows.Forms.DockStyle.Fill; + this.WelcomePage.Location = new System.Drawing.Point(0, 0); + this.WelcomePage.Name = "WelcomePage"; + this.WelcomePage.Size = new System.Drawing.Size(1008, 521); + this.WelcomePage.TabIndex = 0; + // + // lblDisclaimer + // + this.lblDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblDisclaimer.AutoEllipsis = true; + this.lblDisclaimer.Location = new System.Drawing.Point(119, 128); + this.lblDisclaimer.Name = "lblDisclaimer"; + this.lblDisclaimer.Size = new System.Drawing.Size(770, 313); + this.lblDisclaimer.TabIndex = 1; + // + // WelcomePage_Description + // + this.WelcomePage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.WelcomePage_Description.AutoEllipsis = true; + this.WelcomePage_Description.Location = new System.Drawing.Point(17, 64); + this.WelcomePage_Description.Name = "WelcomePage_Description"; + this.WelcomePage_Description.Size = new System.Drawing.Size(977, 52); + this.WelcomePage_Description.TabIndex = 1; + this.WelcomePage_Description.Text = "This wizard will help you configure your Windows image. To begin, click Next."; + // + // WelcomePage_Header + // + this.WelcomePage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.WelcomePage_Header.AutoEllipsis = true; + this.WelcomePage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.WelcomePage_Header.Location = new System.Drawing.Point(14, 12); + this.WelcomePage_Header.Name = "WelcomePage_Header"; + this.WelcomePage_Header.Size = new System.Drawing.Size(980, 45); + this.WelcomePage_Header.TabIndex = 0; + this.WelcomePage_Header.Text = "Welcome"; + // + // FinishPanel + // + this.FinishPanel.Controls.Add(this.FinishPage_Description); + this.FinishPanel.Controls.Add(this.FinishPage_Header); + this.FinishPanel.Dock = System.Windows.Forms.DockStyle.Fill; + this.FinishPanel.Location = new System.Drawing.Point(0, 0); + this.FinishPanel.Name = "FinishPanel"; + this.FinishPanel.Size = new System.Drawing.Size(1008, 521); + this.FinishPanel.TabIndex = 4; + this.FinishPanel.Visible = false; + // + // FinishPage_Description + // + this.FinishPage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.FinishPage_Description.AutoEllipsis = true; + this.FinishPage_Description.Location = new System.Drawing.Point(17, 64); + this.FinishPage_Description.Name = "FinishPage_Description"; + this.FinishPage_Description.Size = new System.Drawing.Size(977, 52); + this.FinishPage_Description.TabIndex = 1; + this.FinishPage_Description.Text = resources.GetString("FinishPage_Description.Text"); + // + // FinishPage_Header + // + this.FinishPage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.FinishPage_Header.AutoEllipsis = true; + this.FinishPage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.FinishPage_Header.Location = new System.Drawing.Point(14, 12); + this.FinishPage_Header.Name = "FinishPage_Header"; + this.FinishPage_Header.Size = new System.Drawing.Size(980, 45); + this.FinishPage_Header.TabIndex = 0; + this.FinishPage_Header.Text = "Finishing Preparation..."; + // + // isoPickerOFD + // + this.isoPickerOFD.Filter = "ISO Files|*.iso"; + this.isoPickerOFD.FileOk += new System.ComponentModel.CancelEventHandler(this.isoPickerOFD_FileOk); + // + // ImageChooserPage + // + this.ImageChooserPage.Controls.Add(this.label2); + this.ImageChooserPage.Controls.Add(this.lvVersions); + this.ImageChooserPage.Controls.Add(this.label3); + this.ImageChooserPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.ImageChooserPage.Location = new System.Drawing.Point(0, 0); + this.ImageChooserPage.Name = "ImageChooserPage"; + this.ImageChooserPage.Size = new System.Drawing.Size(1008, 521); + this.ImageChooserPage.TabIndex = 4; + // + // label2 + // + this.label2.AutoSize = true; + this.label2.Location = new System.Drawing.Point(80, 448); + this.label2.Name = "label2"; + this.label2.Size = new System.Drawing.Size(529, 15); + this.label2.TabIndex = 4; + this.label2.Text = "We have automatically picked the Pro edition for you. However, you can still sele" + + "ct another edition."; + // + // lvVersions + // + this.lvVersions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { + this.columnHeader1, + this.columnHeader2, + this.columnHeader3, + this.columnHeader4, + this.columnHeader5}); + this.lvVersions.FullRowSelect = true; + this.lvVersions.HideSelection = false; + this.lvVersions.Location = new System.Drawing.Point(80, 89); + this.lvVersions.MultiSelect = false; + this.lvVersions.Name = "lvVersions"; + this.lvVersions.Size = new System.Drawing.Size(849, 352); + this.lvVersions.TabIndex = 3; + this.lvVersions.UseCompatibleStateImageBehavior = false; + this.lvVersions.View = System.Windows.Forms.View.Details; + this.lvVersions.SelectedIndexChanged += new System.EventHandler(this.lvVersions_SelectedIndexChanged); + // + // columnHeader1 + // + this.columnHeader1.Text = "#"; + this.columnHeader1.Width = 32; + // + // columnHeader2 + // + this.columnHeader2.Text = "Name"; + this.columnHeader2.Width = 200; + // + // columnHeader3 + // + this.columnHeader3.Text = "Description"; + this.columnHeader3.Width = 256; + // + // columnHeader4 + // + this.columnHeader4.Text = "Architecture"; + this.columnHeader4.Width = 84; + // + // columnHeader5 + // + this.columnHeader5.Text = "Last Modified"; + this.columnHeader5.Width = 160; + // + // label3 + // + this.label3.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label3.AutoEllipsis = true; + this.label3.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label3.Location = new System.Drawing.Point(14, 12); + this.label3.Name = "label3"; + this.label3.Size = new System.Drawing.Size(980, 45); + this.label3.TabIndex = 2; + this.label3.Text = "Choose the image to modify"; + // + // UserAccountsPage + // + this.UserAccountsPage.Controls.Add(this.panel1); + this.UserAccountsPage.Controls.Add(this.b64CB); + this.UserAccountsPage.Controls.Add(this.tableLayoutPanel2); + this.UserAccountsPage.Controls.Add(this.label5); + this.UserAccountsPage.Controls.Add(this.label4); + this.UserAccountsPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.UserAccountsPage.Location = new System.Drawing.Point(0, 0); + this.UserAccountsPage.Name = "UserAccountsPage"; + this.UserAccountsPage.Size = new System.Drawing.Size(1008, 521); + this.UserAccountsPage.TabIndex = 5; + // + // panel1 + // + this.panel1.Controls.Add(this.tableLayoutPanel3); + this.panel1.Controls.Add(this.label8); + this.panel1.Location = new System.Drawing.Point(85, 254); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(838, 236); + this.panel1.TabIndex = 7; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 47.61337F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 52.38663F)); + this.tableLayoutPanel3.Controls.Add(this.panel3, 0, 1); + this.tableLayoutPanel3.Controls.Add(this.pictureBox1, 1, 0); + this.tableLayoutPanel3.Controls.Add(this.pictureBox2, 1, 1); + this.tableLayoutPanel3.Controls.Add(this.panel2, 0, 0); + this.tableLayoutPanel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel3.Location = new System.Drawing.Point(0, 29); + this.tableLayoutPanel3.Name = "tableLayoutPanel3"; + this.tableLayoutPanel3.RowCount = 2; + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 41.54589F)); + this.tableLayoutPanel3.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 58.45411F)); + this.tableLayoutPanel3.Size = new System.Drawing.Size(838, 207); + this.tableLayoutPanel3.TabIndex = 2; + // + // panel3 + // + this.panel3.Controls.Add(this.label10); + this.panel3.Controls.Add(this.lnkLusrMgr); + this.panel3.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel3.Location = new System.Drawing.Point(3, 88); + this.panel3.Name = "panel3"; + this.panel3.Size = new System.Drawing.Size(393, 116); + this.panel3.TabIndex = 3; + // + // label10 + // + this.label10.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label10.AutoEllipsis = true; + this.label10.Location = new System.Drawing.Point(8, 8); + this.label10.Name = "label10"; + this.label10.Size = new System.Drawing.Size(375, 62); + this.label10.TabIndex = 4; + this.label10.Text = "- Open Local Users and Groups, then go to Users"; + // + // lnkLusrMgr + // + this.lnkLusrMgr.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lnkLusrMgr.AutoSize = true; + this.lnkLusrMgr.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.lnkLusrMgr.LinkColor = System.Drawing.Color.DodgerBlue; + this.lnkLusrMgr.Location = new System.Drawing.Point(302, 91); + this.lnkLusrMgr.Name = "lnkLusrMgr"; + this.lnkLusrMgr.Size = new System.Drawing.Size(81, 15); + this.lnkLusrMgr.TabIndex = 0; + this.lnkLusrMgr.TabStop = true; + this.lnkLusrMgr.Text = "Take me there"; + this.lnkLusrMgr.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkLusrMgr_LinkClicked); + // + // pictureBox1 + // + this.pictureBox1.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox1.Image = global::MicroWin.Properties.Resources.user_creation_settings; + this.pictureBox1.Location = new System.Drawing.Point(402, 3); + this.pictureBox1.Name = "pictureBox1"; + this.pictureBox1.Size = new System.Drawing.Size(433, 79); + this.pictureBox1.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox1.TabIndex = 1; + this.pictureBox1.TabStop = false; + // + // pictureBox2 + // + this.pictureBox2.Dock = System.Windows.Forms.DockStyle.Fill; + this.pictureBox2.Image = global::MicroWin.Properties.Resources.user_creation_lusrmgr; + this.pictureBox2.Location = new System.Drawing.Point(402, 88); + this.pictureBox2.Name = "pictureBox2"; + this.pictureBox2.Size = new System.Drawing.Size(433, 116); + this.pictureBox2.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Zoom; + this.pictureBox2.TabIndex = 1; + this.pictureBox2.TabStop = false; + // + // panel2 + // + this.panel2.Controls.Add(this.label9); + this.panel2.Controls.Add(this.lnkImmersiveAccounts); + this.panel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.panel2.Location = new System.Drawing.Point(3, 3); + this.panel2.Name = "panel2"; + this.panel2.Size = new System.Drawing.Size(393, 79); + this.panel2.TabIndex = 2; + // + // label9 + // + this.label9.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label9.AutoEllipsis = true; + this.label9.Location = new System.Drawing.Point(8, 8); + this.label9.Name = "label9"; + this.label9.Size = new System.Drawing.Size(293, 43); + this.label9.TabIndex = 4; + this.label9.Text = "- Head over to Settings > Accounts > Other Users"; + // + // lnkImmersiveAccounts + // + this.lnkImmersiveAccounts.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.lnkImmersiveAccounts.AutoSize = true; + this.lnkImmersiveAccounts.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.lnkImmersiveAccounts.LinkColor = System.Drawing.Color.DodgerBlue; + this.lnkImmersiveAccounts.Location = new System.Drawing.Point(302, 54); + this.lnkImmersiveAccounts.Name = "lnkImmersiveAccounts"; + this.lnkImmersiveAccounts.Size = new System.Drawing.Size(81, 15); + this.lnkImmersiveAccounts.TabIndex = 0; + this.lnkImmersiveAccounts.TabStop = true; + this.lnkImmersiveAccounts.Text = "Take me there"; + this.lnkImmersiveAccounts.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkImmersiveAccounts_LinkClicked); + // + // label8 + // + this.label8.Dock = System.Windows.Forms.DockStyle.Top; + this.label8.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label8.Location = new System.Drawing.Point(0, 0); + this.label8.Name = "label8"; + this.label8.Size = new System.Drawing.Size(838, 29); + this.label8.TabIndex = 0; + this.label8.Text = "To set up new accounts:"; + // + // b64CB + // + this.b64CB.AutoSize = true; + this.b64CB.Checked = true; + this.b64CB.CheckState = System.Windows.Forms.CheckState.Checked; + this.b64CB.Location = new System.Drawing.Point(85, 200); + this.b64CB.Name = "b64CB"; + this.b64CB.Size = new System.Drawing.Size(259, 19); + this.b64CB.TabIndex = 6; + this.b64CB.Text = "Encode password in Base64 (recommended)"; + this.b64CB.UseVisualStyleBackColor = true; + this.b64CB.CheckedChanged += new System.EventHandler(this.b64CB_CheckedChanged); + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 3; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 19.12799F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.85919F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 20.04773F)); + this.tableLayoutPanel2.Controls.Add(this.label6, 0, 0); + this.tableLayoutPanel2.Controls.Add(this.label7, 0, 1); + this.tableLayoutPanel2.Controls.Add(this.usrNameTB, 1, 0); + this.tableLayoutPanel2.Controls.Add(this.usrPasswordTB, 1, 1); + this.tableLayoutPanel2.Controls.Add(this.usrNameCurrentSysNameBtn, 2, 0); + this.tableLayoutPanel2.Controls.Add(this.usrPasswordRevealCB, 2, 1); + this.tableLayoutPanel2.Location = new System.Drawing.Point(85, 133); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 2; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Size = new System.Drawing.Size(838, 59); + this.tableLayoutPanel2.TabIndex = 5; + // + // label6 + // + this.label6.AutoEllipsis = true; + this.label6.Dock = System.Windows.Forms.DockStyle.Fill; + this.label6.Location = new System.Drawing.Point(3, 0); + this.label6.Name = "label6"; + this.label6.Size = new System.Drawing.Size(154, 29); + this.label6.TabIndex = 4; + this.label6.Text = "User Name:"; + this.label6.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // label7 + // + this.label7.AutoEllipsis = true; + this.label7.Dock = System.Windows.Forms.DockStyle.Fill; + this.label7.Location = new System.Drawing.Point(3, 29); + this.label7.Name = "label7"; + this.label7.Size = new System.Drawing.Size(154, 30); + this.label7.TabIndex = 4; + this.label7.Text = "Password:"; + this.label7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft; + // + // usrNameTB + // + this.usrNameTB.Dock = System.Windows.Forms.DockStyle.Fill; + this.usrNameTB.Location = new System.Drawing.Point(163, 3); + this.usrNameTB.MaxLength = 20; + this.usrNameTB.Name = "usrNameTB"; + this.usrNameTB.Size = new System.Drawing.Size(503, 23); + this.usrNameTB.TabIndex = 5; + this.usrNameTB.TextChanged += new System.EventHandler(this.usrNameTB_TextChanged); + // + // usrPasswordTB + // + this.usrPasswordTB.Dock = System.Windows.Forms.DockStyle.Fill; + this.usrPasswordTB.Location = new System.Drawing.Point(163, 32); + this.usrPasswordTB.Name = "usrPasswordTB"; + this.usrPasswordTB.PasswordChar = '*'; + this.usrPasswordTB.Size = new System.Drawing.Size(503, 23); + this.usrPasswordTB.TabIndex = 5; + this.usrPasswordTB.TextChanged += new System.EventHandler(this.usrPasswordTB_TextChanged); + // + // label5 + // + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label5.AutoEllipsis = true; + this.label5.Location = new System.Drawing.Point(17, 64); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(977, 52); + this.label5.TabIndex = 4; + this.label5.Text = resources.GetString("label5.Text"); + // + // label4 + // + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label4.AutoEllipsis = true; + this.label4.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(14, 12); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(980, 45); + this.label4.TabIndex = 3; + this.label4.Text = "Who will use the computer?"; + // + // usrNameCurrentSysNameBtn + // + this.usrNameCurrentSysNameBtn.Dock = System.Windows.Forms.DockStyle.Fill; + this.usrNameCurrentSysNameBtn.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.usrNameCurrentSysNameBtn.Location = new System.Drawing.Point(672, 3); + this.usrNameCurrentSysNameBtn.Name = "usrNameCurrentSysNameBtn"; + this.usrNameCurrentSysNameBtn.Size = new System.Drawing.Size(163, 23); + this.usrNameCurrentSysNameBtn.TabIndex = 6; + this.usrNameCurrentSysNameBtn.Text = "Use current user name"; + this.usrNameCurrentSysNameBtn.UseVisualStyleBackColor = true; + this.usrNameCurrentSysNameBtn.Click += new System.EventHandler(this.usrNameCurrentSysNameBtn_Click); + // + // usrPasswordRevealCB + // + this.usrPasswordRevealCB.Appearance = System.Windows.Forms.Appearance.Button; + this.usrPasswordRevealCB.AutoSize = true; + this.usrPasswordRevealCB.Dock = System.Windows.Forms.DockStyle.Fill; + this.usrPasswordRevealCB.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.usrPasswordRevealCB.Location = new System.Drawing.Point(672, 32); + this.usrPasswordRevealCB.Name = "usrPasswordRevealCB"; + this.usrPasswordRevealCB.Size = new System.Drawing.Size(163, 24); + this.usrPasswordRevealCB.TabIndex = 7; + this.usrPasswordRevealCB.Text = "Reveal password"; + this.usrPasswordRevealCB.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; + this.usrPasswordRevealCB.UseVisualStyleBackColor = true; + this.usrPasswordRevealCB.CheckedChanged += new System.EventHandler(this.usrPasswordRevealCB_CheckedChanged); + // + // IsoSettingsPage + // + this.IsoSettingsPage.Controls.Add(this.DriverExportCombo); + this.IsoSettingsPage.Controls.Add(this.label13); + this.IsoSettingsPage.Controls.Add(this.UnattendCopyCB); + this.IsoSettingsPage.Controls.Add(this.ReportToolCB); + this.IsoSettingsPage.Controls.Add(this.label11); + this.IsoSettingsPage.Controls.Add(this.label12); + this.IsoSettingsPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsoSettingsPage.Location = new System.Drawing.Point(0, 0); + this.IsoSettingsPage.Name = "IsoSettingsPage"; + this.IsoSettingsPage.Size = new System.Drawing.Size(1008, 521); + this.IsoSettingsPage.TabIndex = 6; + // + // label11 + // + this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label11.AutoEllipsis = true; + this.label11.Location = new System.Drawing.Point(17, 64); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(977, 52); + this.label11.TabIndex = 6; + this.label11.Text = "Configure additional settings for your customized image."; + // + // label12 + // + this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label12.AutoEllipsis = true; + this.label12.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label12.Location = new System.Drawing.Point(14, 12); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(980, 45); + this.label12.TabIndex = 5; + this.label12.Text = "Specify additional settings for the image"; + // + // ReportToolCB + // + this.ReportToolCB.AutoSize = true; + this.ReportToolCB.Location = new System.Drawing.Point(83, 133); + this.ReportToolCB.Name = "ReportToolCB"; + this.ReportToolCB.Size = new System.Drawing.Size(218, 19); + this.ReportToolCB.TabIndex = 7; + this.ReportToolCB.Text = "Add a shortcut for the reporting tool"; + this.ReportToolCB.UseVisualStyleBackColor = true; + this.ReportToolCB.CheckedChanged += new System.EventHandler(this.ReportToolCB_CheckedChanged); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(80, 185); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(111, 15); + this.label13.TabIndex = 8; + this.label13.Text = "Driver export mode:"; + // + // DriverExportCombo + // + this.DriverExportCombo.FormattingEnabled = true; + this.DriverExportCombo.Items.AddRange(new object[] { + "Don\'t export drivers", + "Export essential drivers (SCSI Adapters/Storage Controllers)", + "Export all drivers"}); + this.DriverExportCombo.Location = new System.Drawing.Point(83, 206); + this.DriverExportCombo.Name = "DriverExportCombo"; + this.DriverExportCombo.Size = new System.Drawing.Size(374, 23); + this.DriverExportCombo.TabIndex = 9; + this.DriverExportCombo.SelectedIndexChanged += new System.EventHandler(this.DriverExportCombo_SelectedIndexChanged); + // + // UnattendCopyCB + // + this.UnattendCopyCB.AutoSize = true; + this.UnattendCopyCB.Location = new System.Drawing.Point(83, 158); + this.UnattendCopyCB.Name = "UnattendCopyCB"; + this.UnattendCopyCB.Size = new System.Drawing.Size(412, 19); + this.UnattendCopyCB.TabIndex = 7; + this.UnattendCopyCB.Text = "Make a copy of the unattended answer file that I can use on other images"; + this.UnattendCopyCB.UseVisualStyleBackColor = true; + this.UnattendCopyCB.CheckedChanged += new System.EventHandler(this.UnattendCopyCB_CheckedChanged); + // + // IsoCreationPage + // + this.IsoCreationPage.Controls.Add(this.pnlProgress); + this.IsoCreationPage.Controls.Add(this.textBox1); + this.IsoCreationPage.Controls.Add(this.label14); + this.IsoCreationPage.Controls.Add(this.label15); + this.IsoCreationPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsoCreationPage.Location = new System.Drawing.Point(0, 0); + this.IsoCreationPage.Name = "IsoCreationPage"; + this.IsoCreationPage.Size = new System.Drawing.Size(1008, 521); + this.IsoCreationPage.TabIndex = 7; + // + // label14 + // + this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label14.AutoEllipsis = true; + this.label14.Location = new System.Drawing.Point(17, 64); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(977, 52); + this.label14.TabIndex = 8; + this.label14.Text = "This process will take several minutes; please be patient."; + // + // label15 + // + this.label15.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label15.AutoEllipsis = true; + this.label15.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label15.Location = new System.Drawing.Point(14, 12); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(980, 45); + this.label15.TabIndex = 7; + this.label15.Text = "Customizations in progress"; + // + // textBox1 + // + this.textBox1.Location = new System.Drawing.Point(99, 128); + this.textBox1.Multiline = true; + this.textBox1.Name = "textBox1"; + this.textBox1.ReadOnly = true; + this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.textBox1.Size = new System.Drawing.Size(790, 248); + this.textBox1.TabIndex = 9; + // + // pnlProgress + // + this.pnlProgress.Controls.Add(this.pbOverall); + this.pnlProgress.Controls.Add(this.pbCurrent); + this.pnlProgress.Controls.Add(this.lblOverallStatus); + this.pnlProgress.Controls.Add(this.lblCurrentStatus); + this.pnlProgress.Location = new System.Drawing.Point(19, 405); + this.pnlProgress.Name = "pnlProgress"; + this.pnlProgress.Size = new System.Drawing.Size(971, 110); + this.pnlProgress.TabIndex = 10; + // + // lblCurrentStatus + // + this.lblCurrentStatus.AutoSize = true; + this.lblCurrentStatus.Location = new System.Drawing.Point(11, 11); + this.lblCurrentStatus.Name = "lblCurrentStatus"; + this.lblCurrentStatus.Size = new System.Drawing.Size(98, 15); + this.lblCurrentStatus.TabIndex = 0; + this.lblCurrentStatus.Text = "Current Progress:"; + // + // pbCurrent + // + this.pbCurrent.Location = new System.Drawing.Point(14, 30); + this.pbCurrent.Name = "pbCurrent"; + this.pbCurrent.Size = new System.Drawing.Size(941, 23); + this.pbCurrent.TabIndex = 1; + // + // lblOverallStatus + // + this.lblOverallStatus.AutoSize = true; + this.lblOverallStatus.Location = new System.Drawing.Point(11, 58); + this.lblOverallStatus.Name = "lblOverallStatus"; + this.lblOverallStatus.Size = new System.Drawing.Size(95, 15); + this.lblOverallStatus.TabIndex = 0; + this.lblOverallStatus.Text = "Overall Progress:"; + // + // pbOverall + // + this.pbOverall.Location = new System.Drawing.Point(14, 77); + this.pbOverall.Name = "pbOverall"; + this.pbOverall.Size = new System.Drawing.Size(941, 23); + this.pbOverall.TabIndex = 1; + // + // isoSaverSFD + // + this.isoSaverSFD.Filter = "ISO Files|*.iso"; + // + // MainForm + // + this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(800, 450); - this.Text = "MainForm"; + this.ClientSize = new System.Drawing.Size(1008, 561); + this.Controls.Add(this.IsoCreationPage); + this.Controls.Add(this.IsoSettingsPage); + this.Controls.Add(this.UserAccountsPage); + this.Controls.Add(this.ImageChooserPage); + this.Controls.Add(this.PageContainerPanel); + this.Controls.Add(this.ButtonPanel); + this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.Margin = new System.Windows.Forms.Padding(4, 3, 4, 3); + this.MinimumSize = new System.Drawing.Size(1024, 600); + this.Name = "MainForm"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; + this.Text = "MicroWin .NET"; + this.Load += new System.EventHandler(this.MainForm_Load); + this.ButtonPanel.ResumeLayout(false); + this.TableLayoutPanel1.ResumeLayout(false); + this.PageContainerPanel.ResumeLayout(false); + this.IsoChooserPage.ResumeLayout(false); + this.IsoChooserPage.PerformLayout(); + this.WelcomePage.ResumeLayout(false); + this.FinishPanel.ResumeLayout(false); + this.ImageChooserPage.ResumeLayout(false); + this.ImageChooserPage.PerformLayout(); + this.UserAccountsPage.ResumeLayout(false); + this.UserAccountsPage.PerformLayout(); + this.panel1.ResumeLayout(false); + this.tableLayoutPanel3.ResumeLayout(false); + this.panel3.ResumeLayout(false); + this.panel3.PerformLayout(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).EndInit(); + ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).EndInit(); + this.panel2.ResumeLayout(false); + this.panel2.PerformLayout(); + this.tableLayoutPanel2.ResumeLayout(false); + this.tableLayoutPanel2.PerformLayout(); + this.IsoSettingsPage.ResumeLayout(false); + this.IsoSettingsPage.PerformLayout(); + this.IsoCreationPage.ResumeLayout(false); + this.IsoCreationPage.PerformLayout(); + this.pnlProgress.ResumeLayout(false); + this.pnlProgress.PerformLayout(); + this.ResumeLayout(false); + } #endregion + + internal System.Windows.Forms.Panel ButtonPanel; + internal System.Windows.Forms.TableLayoutPanel TableLayoutPanel1; + internal System.Windows.Forms.Button Back_Button; + internal System.Windows.Forms.Button Next_Button; + internal System.Windows.Forms.Button Cancel_Button; + internal System.Windows.Forms.Panel PageContainerPanel; + internal System.Windows.Forms.Panel WelcomePage; + internal System.Windows.Forms.Label WelcomePage_Description; + internal System.Windows.Forms.Label WelcomePage_Header; + internal System.Windows.Forms.Panel IsoChooserPage; + internal System.Windows.Forms.Label SysCheckPage_Description; + internal System.Windows.Forms.Label SysCheckPage_Header; + internal System.Windows.Forms.Panel FinishPanel; + internal System.Windows.Forms.Label FinishPage_Description; + internal System.Windows.Forms.Label FinishPage_Header; + internal System.Windows.Forms.Label lblDisclaimer; + internal System.Windows.Forms.Label label1; + private System.Windows.Forms.Button isoPickerBtn; + private System.Windows.Forms.TextBox isoPathTB; + private System.Windows.Forms.ProgressBar isoExtractionPB; + internal System.Windows.Forms.Label lblExtractionStatus; + private System.Windows.Forms.OpenFileDialog isoPickerOFD; + private System.Windows.Forms.Panel ImageChooserPage; + private System.Windows.Forms.ListView lvVersions; + private System.Windows.Forms.ColumnHeader columnHeader1; + private System.Windows.Forms.ColumnHeader columnHeader2; + private System.Windows.Forms.ColumnHeader columnHeader3; + internal System.Windows.Forms.Label label3; + private System.Windows.Forms.ColumnHeader columnHeader4; + private System.Windows.Forms.ColumnHeader columnHeader5; + private System.Windows.Forms.Label label2; + private System.Windows.Forms.Panel UserAccountsPage; + internal System.Windows.Forms.Label label4; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + internal System.Windows.Forms.Label label6; + internal System.Windows.Forms.Label label7; + private System.Windows.Forms.TextBox usrNameTB; + private System.Windows.Forms.TextBox usrPasswordTB; + internal System.Windows.Forms.Label label5; + private System.Windows.Forms.CheckBox b64CB; + private System.Windows.Forms.Panel panel1; + private System.Windows.Forms.Label label8; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel3; + private System.Windows.Forms.PictureBox pictureBox1; + private System.Windows.Forms.PictureBox pictureBox2; + private System.Windows.Forms.Panel panel2; + internal System.Windows.Forms.Label label9; + private System.Windows.Forms.LinkLabel lnkImmersiveAccounts; + private System.Windows.Forms.Panel panel3; + internal System.Windows.Forms.Label label10; + private System.Windows.Forms.LinkLabel lnkLusrMgr; + private System.Windows.Forms.Button usrNameCurrentSysNameBtn; + private System.Windows.Forms.CheckBox usrPasswordRevealCB; + private System.Windows.Forms.Panel IsoSettingsPage; + internal System.Windows.Forms.Label label11; + internal System.Windows.Forms.Label label12; + private System.Windows.Forms.CheckBox ReportToolCB; + private System.Windows.Forms.ComboBox DriverExportCombo; + private System.Windows.Forms.Label label13; + private System.Windows.Forms.CheckBox UnattendCopyCB; + private System.Windows.Forms.Panel IsoCreationPage; + internal System.Windows.Forms.Label label14; + internal System.Windows.Forms.Label label15; + private System.Windows.Forms.Panel pnlProgress; + private System.Windows.Forms.ProgressBar pbOverall; + private System.Windows.Forms.ProgressBar pbCurrent; + private System.Windows.Forms.Label lblOverallStatus; + private System.Windows.Forms.Label lblCurrentStatus; + private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.SaveFileDialog isoSaverSFD; } } \ No newline at end of file diff --git a/MicroWin/MainForm.cs b/MicroWin/MainForm.cs index 516de7e..ceb4f77 100755 --- a/MicroWin/MainForm.cs +++ b/MicroWin/MainForm.cs @@ -1,5 +1,22 @@ -using System; +using Microsoft.Dism; +using Microsoft.Win32; +using MicroWin.Classes; +using MicroWin.functions.dism; +using MicroWin.functions.Helpers.DeleteFile; +using MicroWin.functions.Helpers.DesktopWindowManager; +using MicroWin.functions.Helpers.Loggers; +using MicroWin.functions.Helpers.RegistryHelpers; +using MicroWin.functions.iso; +using MicroWin.functions.UI; +using MicroWin.OSCDIMG; +using System; +using System.Collections.Generic; +using System.Diagnostics; using System.Drawing; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading.Tasks; using System.Windows.Forms; namespace MicroWin @@ -8,36 +25,454 @@ public partial class MainForm : Form { private Panel pnlContent; + private const string swStatus = "BETA"; + + private WizardPage CurrentWizardPage = new(); + private List VerifyInPages = [ + WizardPage.Page.IsoChooserPage, + WizardPage.Page.ImageChooserPage, + WizardPage.Page.UserAccountsPage + ]; + public MainForm() { - this.Text = "MicroWin .NET (ALPHA 0.1)"; - this.Size = new Size(600, 450); - this.StartPosition = FormStartPosition.CenterScreen; + InitializeComponent(); + } + + private void SetColorMode() + { + RegistryKey colorRk = Registry.CurrentUser.OpenSubKey("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Themes\\Personalize"); + int colorVal = (int)colorRk.GetValue("AppsUseLightTheme", 1); + colorRk.Close(); + if (colorVal == 0) + { + BackColor = Color.FromArgb(35, 38, 41); + ForeColor = Color.FromArgb(247, 247, 247); + } + else + { + BackColor = Color.FromArgb(247, 247, 247); + ForeColor = Color.FromArgb(35, 38, 41); + } + WindowHelper.ToggleDarkTitleBar(Handle, colorVal == 0); + } + + public void ShowPage(UserControl page) + { + pnlContent.Controls.Clear(); + page.Dock = DockStyle.Fill; + pnlContent.Controls.Add(page); + } + + private void ChangePage(WizardPage.Page newPage) + { + DynaLog.logMessage("Changing current page of the wizard..."); + DynaLog.logMessage($"New page to load: {newPage.ToString()}"); + + if (newPage > CurrentWizardPage.wizardPage && VerifyInPages.Contains(CurrentWizardPage.wizardPage)) + { + if (!VerifyOptionsInPage(CurrentWizardPage.wizardPage)) + return; + } + + WelcomePage.Visible = newPage == WizardPage.Page.WelcomePage; + IsoChooserPage.Visible = newPage == WizardPage.Page.IsoChooserPage; + ImageChooserPage.Visible = newPage == WizardPage.Page.ImageChooserPage; + UserAccountsPage.Visible = newPage == WizardPage.Page.UserAccountsPage; + IsoSettingsPage.Visible = newPage == WizardPage.Page.IsoSettingsPage; + IsoCreationPage.Visible = newPage == WizardPage.Page.IsoCreationPage; + + CurrentWizardPage.wizardPage = newPage; + + // Handle tasks when switching to certain pages + switch (newPage) + { + case WizardPage.Page.ImageChooserPage: + LoadWimData(); + break; + } + + Next_Button.Enabled = !(newPage != WizardPage.Page.FinishPage) || !((int)newPage + 1 >= WizardPage.PageCount); + Cancel_Button.Enabled = !(newPage == WizardPage.Page.FinishPage); + Back_Button.Enabled = !(newPage == WizardPage.Page.WelcomePage) && !(newPage == WizardPage.Page.FinishPage); + ButtonPanel.Visible = !(newPage > WizardPage.Page.IsoSettingsPage); + + if (CurrentWizardPage.wizardPage == WizardPage.Page.IsoCreationPage) + { + if (isoSaverSFD.ShowDialog(this) != DialogResult.OK) + { + ChangePage(CurrentWizardPage.wizardPage - 1); + return; + } + AppState.SaveISO = isoSaverSFD.FileName; + RunDeployment(); + } + } + + private bool VerifyOptionsInPage(WizardPage.Page wizardPage) + { + switch (wizardPage) + { + case WizardPage.Page.IsoChooserPage: + if (String.IsNullOrEmpty(isoPathTB.Text) || !File.Exists(isoPathTB.Text)) + { + MessageBox.Show("Specify an ISO file and try again. Make sure that it exists", Text, MessageBoxButtons.OK, MessageBoxIcon.Error); + return false; + } + break; + case WizardPage.Page.ImageChooserPage: + if (AppState.SelectedImageIndex < 1) + { + MessageBox.Show("Please specify an image to modify and try again."); + return false; + } + break; + case WizardPage.Page.UserAccountsPage: + // Default to "User" if no name is set + if (String.IsNullOrEmpty(usrNameTB.Text)) + usrNameTB.Text = "User"; + // Trim invalid characters from the user account + char[] invalidChars = ['/', '\\', '[', ']', ':', ';', '|', '=', ',', '+', '*', '?', '<', '>', '\"', '%']; + if (AppState.UserAccounts.Any()) + { + foreach (UserAccount account in AppState.UserAccounts) + { + account.Name = new string(account.Name.Where(c => !invalidChars.Contains(c)).ToArray()).TrimEnd('.'); + } + } + break; + } + return true; + } + + private void MainForm_Load(object sender, EventArgs e) + { + Text = $"MicroWin .NET ({swStatus} 0.2)"; pnlContent = new Panel { Dock = DockStyle.Fill }; - this.Controls.Add(pnlContent); - string disclaimerMessage = $"Thank you for trying this ALPHA release of MicroWin .NET.\n\n" + - $"Because this is an alpha version of a rewrite of the original PowerShell version, bugs may happen. We expect improvements in quality " + + string disclaimerMessage = $"Thank you for trying this {swStatus} release of MicroWin .NET.\n\n" + + $"Because this is a prerelease version of a rewrite of the original PowerShell version, bugs may happen. We expect improvements in quality " + $"as time goes on, but that can be done with your help. Report the bugs over on the GitHub repository.\n\n" + - $"This ALPHA release already has almost every feature implemented, besides a few that couldn't make it to this release. Those will be " + + $"This {swStatus} release already has almost every feature implemented, besides a few that couldn't make it to this release. Those will be " + $"implemented in future releases. Head over to the roadmap available in the repository for more info.\n\n" + $"Please disable your antivirus or set an exclusion to prevent conflicts. Do not worry, this is an open-source project and we take " + $"your computer's security seriously.\n\n" + $"Thanks,\n" + $"CWSOFTWARE and the rest of the team behind MicroWin."; - MessageBox.Show(disclaimerMessage, "ALPHA RELEASE", MessageBoxButtons.OK, MessageBoxIcon.Information); + lblDisclaimer.Text = disclaimerMessage; + + ChangePage(WizardPage.Page.WelcomePage); - // Start at the first page - ShowPage(new Page_SelectISO(this)); + SetColorMode(); + pnlContent.BringToFront(); + + // Insert an item in there so we can work with it + AppState.UserAccounts.Add(new UserAccount() { Role = "Administrator" }); + + // Other default settings + DriverExportCombo.SelectedIndexChanged -= DriverExportCombo_SelectedIndexChanged; + DriverExportCombo.SelectedIndex = (int)AppState.DriverExportMode; + DriverExportCombo.SelectedIndexChanged += DriverExportCombo_SelectedIndexChanged; } - public void ShowPage(UserControl page) + private void Next_Button_Click(object sender, EventArgs e) { - pnlContent.Controls.Clear(); - page.Dock = DockStyle.Fill; - pnlContent.Controls.Add(page); + if (CurrentWizardPage.wizardPage == WizardPage.Page.FinishPage) + { + Close(); + } + else + { + ChangePage(CurrentWizardPage.wizardPage + 1); + } + } + + private void Back_Button_Click(object sender, EventArgs e) + { + ChangePage(CurrentWizardPage.wizardPage - 1); + } + + private void isoPickerBtn_Click(object sender, EventArgs e) + { + isoPickerOFD.ShowDialog(this); + } + + private void isoPickerOFD_FileOk(object sender, System.ComponentModel.CancelEventArgs e) + { + isoPathTB.Text = isoPickerOFD.FileName; + } + + private void InvokeIsoExtractionUIUpdate(string status, int progress) + { + if (InvokeRequired) + { + Invoke(new Action(() => { + lblExtractionStatus.Text = $"Status: {status}"; + isoExtractionPB.Value = progress; + })); + } + else + { + lblExtractionStatus.Text = $"Status: {status}"; + isoExtractionPB.Value = progress; + } + } + + private void LoadWimData() + { + string wimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); + if (!File.Exists(wimPath)) wimPath = Path.Combine(AppState.MountPath, "sources", "install.esd"); + + if (File.Exists(wimPath)) + { + DismImageInfoCollection imageInfo = DismManager.GetImageInformation(wimPath); + if (imageInfo is null) + return; + + lvVersions.Items.Clear(); + lvVersions.Items.AddRange(imageInfo.Select(image => new ListViewItem([image.ImageIndex.ToString(), + image.ImageName, image.ImageDescription, + image.Architecture.ToString(), + image.CustomizedInfo?.ModifiedTime.ToString("dd/MM/yyyy HH:mm:ss")])).ToArray()); + if (imageInfo.Any()) + { + // Get and select Pro automatically + lvVersions.SelectedIndexChanged -= lvVersions_SelectedIndexChanged; + int? proIdx = imageInfo.FirstOrDefault(image => image.EditionId.Equals("Professional", StringComparison.OrdinalIgnoreCase))?.ImageIndex; + lvVersions.Items[proIdx - 1 ?? 0].Selected = true; + lvVersions.Select(); + lvVersions.SelectedIndexChanged += lvVersions_SelectedIndexChanged; + AppState.SelectedImageIndex = (proIdx ?? 1); + } + } + else + { + MessageBox.Show("Error: Image file not found in extraction folder."); + } + } + + private async void isoPathTB_TextChanged(object sender, EventArgs e) + { + if (File.Exists(isoPathTB.Text)) + { + isoPickerBtn.Enabled = false; + AppState.IsoPath = isoPathTB.Text; + + await Task.Run(() => { + var iso = new IsoManager(); + InvokeIsoExtractionUIUpdate("Mounting ISO...", 5); + + char drive = iso.MountAndGetDrive(AppState.IsoPath); + if (drive != '\0') + { + iso.ExtractIso(drive.ToString(), AppState.MountPath, (p) => { + // Update the bar based on the 0-100 value from IsoManager + InvokeIsoExtractionUIUpdate($"Extracting: {p}%", p); + }); + + InvokeIsoExtractionUIUpdate("Dismounting...", 100); + iso.Dismount(AppState.IsoPath); + } + + InvokeIsoExtractionUIUpdate("Extraction complete. Click Next to continue.", 100); + }); + isoPickerBtn.Enabled = true; + } + } + + private void lvVersions_SelectedIndexChanged(object sender, EventArgs e) + { + if (lvVersions.SelectedItems.Count == 1) + AppState.SelectedImageIndex = lvVersions.FocusedItem.Index + 1; + } + + private void lnkImmersiveAccounts_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("ms-settings:otherusers"); + } + + private void lnkLusrMgr_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "system32", "lusrmgr.msc")); + } + + private void usrNameTB_TextChanged(object sender, EventArgs e) + { + AppState.UserAccounts[0].Name = usrNameTB.Text; + } + + private void b64CB_CheckedChanged(object sender, EventArgs e) + { + AppState.EncodeWithB64 = b64CB.Checked; + } + + private void usrPasswordTB_TextChanged(object sender, EventArgs e) + { + AppState.UserAccounts[0].Password = usrPasswordTB.Text; + } + + private void usrNameCurrentSysNameBtn_Click(object sender, EventArgs e) + { + usrNameTB.Text = Environment.UserName; + } + + private void usrPasswordRevealCB_CheckedChanged(object sender, EventArgs e) + { + usrPasswordTB.PasswordChar = usrPasswordRevealCB.Checked ? '\0' : '*'; + } + + private void DriverExportCombo_SelectedIndexChanged(object sender, EventArgs e) + { + AppState.DriverExportMode = (DriverExportMode)DriverExportCombo.SelectedIndex; + } + + private void ReportToolCB_CheckedChanged(object sender, EventArgs e) + { + AppState.AddReportingToolShortcut = ReportToolCB.Checked; + } + + private void UnattendCopyCB_CheckedChanged(object sender, EventArgs e) + { + AppState.CopyUnattendToFileSystem = UnattendCopyCB.Checked; + } + + private void UpdateStatus(string text) + { + if (this.InvokeRequired) this.Invoke(new Action(() => { lblCurrentStatus.Text = text; pbCurrent.Value = 0; })); + else { lblCurrentStatus.Text = text; pbCurrent.Value = 0; } + } + + private void UpdateProgressBar(int value) + { + int safeValue = Math.Max(0, Math.Min(value, 100)); + if (this.InvokeRequired) this.Invoke(new Action(() => pbCurrent.Value = safeValue)); + else pbCurrent.Value = safeValue; + } + + private async void RunDeployment() + { + await Task.Run(async () => { + string installwimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); + if (!File.Exists(installwimPath)) installwimPath = Path.Combine(AppState.MountPath, "sources", "install.esd"); + + UpdateStatus("Mounting Install WIM..."); + DismManager.MountImage(installwimPath, AppState.SelectedImageIndex, AppState.ScratchPath, (p) => UpdateProgressBar(p)); + + UnattendGenerator.CreateUnattend($"{Path.Combine(AppState.ScratchPath, "Windows", "Panther")}"); + + new OsFeatureDisabler().RunTask(); + new OsPackageRemover().RunTask(); + new StoreAppRemover().RunTask(); + + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); + + if (AppState.AddReportingToolShortcut) + { + using (var client = new HttpClient()) + { + var data = await client.GetByteArrayAsync("https://raw.githubusercontent.com/CodingWonders/MyScripts/refs/heads/main/MicroWinHelperTools/ReportingTool/ReportingTool.ps1"); + File.WriteAllBytes(Path.Combine(AppState.ScratchPath, "ReportingTool.ps1"), data); + } + + RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin"); + RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin", new RegistryItem("MicroWinVersion", ValueKind.REG_SZ, $"{AppState.Version}")); + RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin", new RegistryItem("MicroWinBuildDate", ValueKind.REG_SZ, $"{DateTime.Now}")); + + } + + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\ControlSet001\\Control\\Session Manager", new RegistryItem("DisableWpbtExecution", ValueKind.REG_DWORD, 1)); + + // Skip first logon animation + RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", new RegistryItem("EnableFirstLogonAnimation", ValueKind.REG_DWORD, 0)); + + RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell", new RegistryItem("ExecutionPolicy", ValueKind.REG_SZ, "RemoteSigned")); + + // int majorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMajorVersionNumber")); + // int minorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMinorVersionNumber")); + // string build = Convert.ToString(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentBuild")); + // string ubr = Convert.ToString(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "UBR")); + + //if (majorver == 10 && minorver == 0 && build == "26100" && ubr == "1") + //{ + //try + //{ + //DismApi.Initialize(DismLogLevel.LogErrors); + //using DismSession session = DismApi.OpenOfflineSession(AppState.ScratchPath); + + //DismApi.EnableFeature(session, "Recall", false, true); + //DismApi.Shutdown(); + //} + //catch + //{ + // Add logging + //} + //} + + using (var client = new HttpClient()) + { + try + { + var data = client.GetByteArrayAsync("https://github.com/CodingWonders/MicroWin/raw/main/MicroWin/tools/FirstStartup.ps1").GetAwaiter().GetResult(); + File.WriteAllBytes(Path.Combine(AppState.ScratchPath, "Windows"), data); + } + catch { } + } + + RegistryHelper.UnloadRegistryHive("zSYSTEM"); + RegistryHelper.UnloadRegistryHive("zSOFTWARE"); + RegistryHelper.UnloadRegistryHive("zDEFAULT"); + RegistryHelper.UnloadRegistryHive("zNTUSER"); + + UpdateStatus("Finalizing..."); + DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateProgressBar(p)); + + string bootwimPath = Path.Combine(AppState.MountPath, "sources", "boot.wim"); + if (!File.Exists(bootwimPath)) bootwimPath = Path.Combine(AppState.MountPath, "sources", "boot.esd"); + + UpdateStatus("Mounting Boot WIM..."); + DismManager.MountImage(bootwimPath, 2, AppState.ScratchPath, (p) => UpdateProgressBar(p)); + + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); + RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); + + RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); + RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV2", ValueKind.REG_DWORD, 0)); + RegistryHelper.AddRegistryItem("HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); + RegistryHelper.AddRegistryItem("HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV2", ValueKind.REG_DWORD, 0)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassCPUCheck", ValueKind.REG_DWORD, 1)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassRAMCheck", ValueKind.REG_DWORD, 1)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassSecureBootCheck", ValueKind.REG_DWORD, 1)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassStorageCheck", ValueKind.REG_DWORD, 1)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassTPMCheck", ValueKind.REG_DWORD, 1)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\MoSetup", new RegistryItem("AllowUpgradesWithUnsupportedTPMOrCPU", ValueKind.REG_DWORD, 1)); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\Status\\ChildCompletion", new RegistryItem("setup.exe", ValueKind.REG_DWORD, 3)); + + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup", new RegistryItem("CmdLine", ValueKind.REG_SZ, "\\sources\\setup.exe")); + + RegistryHelper.UnloadRegistryHive("zSYSTEM"); + RegistryHelper.UnloadRegistryHive("zSOFTWARE"); + RegistryHelper.UnloadRegistryHive("zDEFAULT"); + RegistryHelper.UnloadRegistryHive("zNTUSER"); + + UpdateStatus("Finalizing..."); + DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateProgressBar(p)); + + OscdimgUtilities.checkoscdImg(); + + Console.Write(AppState.SaveISO); + + DeleteFiles.SafeDeleteDirectory(AppState.TempRoot); + }); + + MessageBox.Show("Generation Complete."); + Close(); } } } \ No newline at end of file diff --git a/MicroWin/MainForm.resx b/MicroWin/MainForm.resx new file mode 100644 index 0000000..f417c40 --- /dev/null +++ b/MicroWin/MainForm.resx @@ -0,0 +1,132 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Sysprep will be launched and will perform the final steps. This will take some time. After this is complete, use one of the buttons below to either close this wizard, or relaunch Sysprep if it failed to prepare your computer. + + + 17, 17 + + + Enter the information that will be used to create the first user account on the target system. Additional users can be created later. You can skip entering this information. In that case, default values will be used. + + + 141, 17 + + \ No newline at end of file diff --git a/MicroWin/MicroWin.csproj b/MicroWin/MicroWin.csproj index 48bba20..0106d3c 100755 --- a/MicroWin/MicroWin.csproj +++ b/MicroWin/MicroWin.csproj @@ -1,6 +1,5 @@ - Debug @@ -59,6 +58,9 @@ app.manifest + + MicroWin.Program + ..\packages\Microsoft.Dism.4.0.7\lib\net40\Microsoft.Dism.dll @@ -77,6 +79,8 @@ + + @@ -91,6 +95,7 @@ + Form @@ -100,9 +105,9 @@ - - UserControl - + + MainForm.cs + ResXFileCodeGenerator Resources.Designer.cs @@ -143,6 +148,8 @@ + + diff --git a/MicroWin/Properties/AssemblyInfo.cs b/MicroWin/Properties/AssemblyInfo.cs index 3e1b232..ff951c7 100755 --- a/MicroWin/Properties/AssemblyInfo.cs +++ b/MicroWin/Properties/AssemblyInfo.cs @@ -29,5 +29,5 @@ // Build Number // Revision // -[assembly: AssemblyVersion("0.1.0.0")] -[assembly: AssemblyFileVersion("0.1.0.0")] +[assembly: AssemblyVersion("0.2.0.0")] +[assembly: AssemblyFileVersion("0.2.0.0")] diff --git a/MicroWin/Properties/Resources.Designer.cs b/MicroWin/Properties/Resources.Designer.cs index 6a82555..1d2110f 100755 --- a/MicroWin/Properties/Resources.Designer.cs +++ b/MicroWin/Properties/Resources.Designer.cs @@ -59,5 +59,25 @@ internal Resources() { resourceCulture = value; } } + + /// + /// Busca un recurso adaptado de tipo System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap user_creation_lusrmgr { + get { + object obj = ResourceManager.GetObject("user_creation_lusrmgr", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// Busca un recurso adaptado de tipo System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap user_creation_settings { + get { + object obj = ResourceManager.GetObject("user_creation_settings", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/MicroWin/Properties/Resources.resx b/MicroWin/Properties/Resources.resx index ffecec8..828f75d 100755 --- a/MicroWin/Properties/Resources.resx +++ b/MicroWin/Properties/Resources.resx @@ -46,7 +46,7 @@ mimetype: application/x-microsoft.net.object.binary.base64 value : The object must be serialized with - : System.Serialization.Formatters.Binary.BinaryFormatter + : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter : and then encoded with base64 encoding. mimetype: application/x-microsoft.net.object.soap.base64 @@ -60,6 +60,7 @@ : and then encoded with base64 encoding. --> + @@ -68,9 +69,10 @@ - + + @@ -85,9 +87,10 @@ - + + @@ -109,9 +112,16 @@ 2.0 - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\user_creation_lusrmgr.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\user_creation_settings.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + \ No newline at end of file diff --git a/MicroWin/Resources/user_creation_lusrmgr.png b/MicroWin/Resources/user_creation_lusrmgr.png new file mode 100644 index 0000000000000000000000000000000000000000..ac00ba68a5f6e3482b9a719f087287ca6b302413 GIT binary patch literal 71717 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 aNsMWcQCZTY1#V|%P*>ABouy(P`2PS+S-nsI literal 0 HcmV?d00001 diff --git a/MicroWin/WizardPages.cs b/MicroWin/WizardPages.cs deleted file mode 100755 index 79ca956..0000000 --- a/MicroWin/WizardPages.cs +++ /dev/null @@ -1,412 +0,0 @@ -using Microsoft.Dism; -using MicroWin.functions.dism; -using MicroWin.functions.Helpers.DeleteFile; -using MicroWin.functions.Helpers.RegistryHelpers; -using MicroWin.functions.iso; -using MicroWin.OSCDIMG; -using System; -using System.Collections.Generic; -using System.Drawing; -using System.IO; -using System.Linq; -using System.Net.Http; -using System.Threading.Tasks; -using System.Windows.Forms; - -namespace MicroWin -{ - /* TODO: Use this as the logo (in Courier New) - * - * /\/\ (_) ___ _ __ ___ / / /\ \ \(_) _ __ - * / \ | | / __|| '__| / _ \ \ \/ \/ /| || '_ \ - * / /\/\ \| || (__ | | | (_) | \ /\ / | || | | | - * \/ \/|_| \___||_| \___/ \/ \/ |_||_| |_| - * - */ - - - // --- PAGE 1: SELECT ISO --- - public class Page_SelectISO : UserControl - { - private MainForm _parent; - private Label lblStatus; - private ProgressBar pb; - - public Page_SelectISO(MainForm main) - { - _parent = main; - var lbl = new Label { Text = "Step 1: Select Windows ISO", Location = new Point(50, 30), AutoSize = true, Font = new Font("Arial", 12, FontStyle.Bold) }; - var btn = new Button { Text = "Browse ISO", Location = new Point(50, 60), Size = new Size(120, 30) }; - - lblStatus = new Label { Text = "Status: Ready", Location = new Point(50, 100), AutoSize = true }; - - // The Progress Bar - pb = new ProgressBar - { - Location = new Point(50, 130), - Size = new Size(400, 20), - Minimum = 0, - Maximum = 100, - Visible = false - }; - - btn.Click += async (s, e) => { - if (Directory.Exists(AppState.TempRoot)) - { - DeleteFiles.SafeDeleteDirectory(AppState.TempRoot); - } - - using (OpenFileDialog ofd = new OpenFileDialog { Filter = "ISO Files|*.iso" }) - { - if (ofd.ShowDialog() == DialogResult.OK) - { - btn.Enabled = false; - pb.Visible = true; - AppState.IsoPath = ofd.FileName; - - await Task.Run(() => { - var iso = new IsoManager(); - UpdateUI("Mounting ISO...", 5); - - char drive = iso.MountAndGetDrive(AppState.IsoPath); - if (drive != '\0') - { - iso.ExtractIso(drive.ToString(), AppState.MountPath, (p) => { - // Update the bar based on the 0-100 value from IsoManager - UpdateUI($"Extracting: {p}%", p); - }); - - UpdateUI("Dismounting...", 100); - iso.Dismount(AppState.IsoPath); - } - }); - - _parent.ShowPage(new Page_WinVersion(_parent)); - } - } - }; - this.Controls.AddRange(new Control[] { lbl, btn, lblStatus, pb }); - } - - private void UpdateUI(string status, int progress) - { - if (this.InvokeRequired) - { - this.Invoke(new Action(() => { - lblStatus.Text = $"Status: {status}"; - pb.Value = progress; - })); - } - else - { - lblStatus.Text = $"Status: {status}"; - pb.Value = progress; - } - } - } - - // --- PAGE 2: SELECT WINDOWS VERSION --- - public class Page_WinVersion : UserControl - { - private MainForm _parent; - private ListBox lstVersions; - - public Page_WinVersion(MainForm main) - { - _parent = main; - var lbl = new Label { Text = "Step 2: Select Windows Version", Location = new Point(50, 20), AutoSize = true }; - lstVersions = new ListBox { Location = new Point(50, 50), Size = new Size(350, 200) }; - var btnNext = new Button { Text = "Next", Location = new Point(50, 270), Size = new Size(100, 30) }; - - btnNext.Click += (s, e) => { - if (lstVersions.SelectedIndex != -1) - { - AppState.SelectedImageIndex = lstVersions.SelectedIndex + 1; - _parent.ShowPage(new Page_SetupType(_parent)); - } - }; - - this.Controls.AddRange(new Control[] { lbl, lstVersions, btnNext }); - - // Important: Handle the Load event to ensure files exist before reading - this.Load += (s, e) => LoadWimData(); - } - - private void LoadWimData() - { - string wimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); - if (!File.Exists(wimPath)) wimPath = Path.Combine(AppState.MountPath, "sources", "install.esd"); - - if (File.Exists(wimPath)) - { - Dictionary versions = DismManager.GetWimVersions(wimPath); - lstVersions.Items.Clear(); - lstVersions.Items.AddRange(versions.Select(kvp => String.Format("{0}: {1}", kvp.Key, kvp.Value)).ToArray()); - } - else - { - MessageBox.Show("Error: Image file not found in extraction folder."); - } - } - } - - // --- PAGE 3: SETUP TYPE --- - public class Page_SetupType : UserControl - { - private MainForm _parent; - public Page_SetupType(MainForm main) - { - _parent = main; - var btnAuto = new Button { Text = "Auto Setup (Automated OOBE)", Location = new Point(50, 80), Size = new Size(200, 40) }; - btnAuto.Click += (s, e) => { AppState.IsAuto = true; _parent.ShowPage(new Page_Users(_parent)); }; - this.Controls.Add(btnAuto); - } - } - - // --- PAGE 4: USERS (TABLE VIEW) --- - public class Page_Users : UserControl - { - private MainForm _parent; - private DataGridView grid; - - public Page_Users(MainForm main) - { - _parent = main; - var txtUser = new TextBox { Location = new Point(20, 40), Width = 100 }; - var txtPass = new TextBox { Location = new Point(130, 40), Width = 100, PasswordChar = '*' }; - var cmbRole = new ComboBox { Location = new Point(240, 40), Width = 100 }; - cmbRole.Items.AddRange(new string[] { "Administrator", "User" }); - cmbRole.SelectedIndex = 0; - - var btnAdd = new Button { Text = "Add", Location = new Point(350, 38) }; - grid = new DataGridView { Location = new Point(20, 80), Size = new Size(500, 150), AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill, AllowUserToAddRows = false }; - grid.Columns.Add("U", "User"); grid.Columns.Add("P", "Password"); grid.Columns.Add("R", "Role"); - - btnAdd.Click += (s, e) => { - if (!string.IsNullOrEmpty(txtUser.Text)) - { - AppState.UserAccounts.Add(new UserAccount { Name = txtUser.Text, Password = txtPass.Text, Role = cmbRole.Text }); - grid.Rows.Add(txtUser.Text, "********", cmbRole.Text); - txtUser.Clear(); txtPass.Clear(); - } - }; - - var btnNext = new Button { Text = "Next", Location = new Point(20, 250) }; - btnNext.Click += (s, e) => _parent.ShowPage(new Page_Tools(_parent)); - this.Controls.AddRange(new Control[] { txtUser, txtPass, cmbRole, btnAdd, grid, btnNext }); - } - } - - // --- PAGE 5: TOOLS & SHORTCUTS --- - public class Page_Tools : UserControl - { - private MainForm _parent; - public Page_Tools(MainForm main) - { - _parent = main; - var chkReport = new CheckBox { Text = "Add Reporting Tool Shortcut", Location = new Point(50, 80), AutoSize = true }; - var btnNext = new Button { Text = "Deploy Image", Location = new Point(50, 150), Size = new Size(150, 40), BackColor = Color.LightGreen }; - - btnNext.Click += (s, e) => { - AppState.AddReportingToolShortcut = chkReport.Checked; - _parent.ShowPage(new Page_Save(_parent)); - }; - this.Controls.AddRange(new Control[] { chkReport, btnNext }); - } - } - - // --- PAGE 6: Save --- - public class Page_Save : UserControl - { - private MainForm _parent; - public Page_Save(MainForm main) - { - _parent = main; - - var lbl = new Label { Text = "Save ISO", Location = new Point(50, 30), AutoSize = true, Font = new Font("Arial", 12, FontStyle.Bold) }; - var btn = new Button { Text = "Browse", Location = new Point(50, 60), Size = new Size(120, 30) }; - - btn.Click += (s, e) => { - using (SaveFileDialog ofd = new SaveFileDialog { - Filter = "ISO Files|*.iso", - FileName = "MicroWin.iso" - }) - { - if (ofd.ShowDialog() == DialogResult.OK) - { - AppState.saveISO = ofd.FileName; - _parent.ShowPage(new Page_Progress(_parent)); - } - } - }; - this.Controls.AddRange(new Control[] { lbl, btn }); - } - - } - - // --- PAGE 7: PROGRESS & DEPLOYMENT --- - public class Page_Progress : UserControl - { - private Label lblStatus; - private ProgressBar pb; - private MainForm _main; - - public Page_Progress(MainForm main) - { - _main = main; - lblStatus = new Label { Text = "Initializing...", Location = new Point(50, 50), Width = 400, AutoSize = true }; - pb = new ProgressBar { Location = new Point(50, 80), Size = new Size(400, 25), Style = ProgressBarStyle.Continuous }; - this.Controls.AddRange(new Control[] { lblStatus, pb }); - RunDeployment(); - } - - private void UpdateStatus(string text) - { - if (this.InvokeRequired) this.Invoke(new Action(() => { lblStatus.Text = text; pb.Value = 0; })); - else { lblStatus.Text = text; pb.Value = 0; } - } - - private void UpdateProgressBar(int value) - { - int safeValue = Math.Max(0, Math.Min(value, 100)); - if (this.InvokeRequired) this.Invoke(new Action(() => pb.Value = safeValue)); - else pb.Value = safeValue; - } - - private async void RunDeployment() - { - await Task.Run(async () => { - string installwimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); - if (!File.Exists(installwimPath)) installwimPath = Path.Combine(AppState.MountPath, "sources", "install.esd"); - - UpdateStatus("Mounting Install WIM..."); - DismManager.MountImage(installwimPath, AppState.SelectedImageIndex, AppState.ScratchPath, (p) => UpdateProgressBar(p)); - - UnattendGenerator.CreateUnattend($"{Path.Combine(AppState.ScratchPath, "Windows", "Panther")}"); - - new OsFeatureDisabler().RunTask(); - new OsPackageRemover().RunTask(); - new StoreAppRemover().RunTask(); - - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); - - if (AppState.AddReportingToolShortcut) - { - using (var client = new HttpClient()) - { - var data = await client.GetByteArrayAsync("https://raw.githubusercontent.com/CodingWonders/MyScripts/refs/heads/main/MicroWinHelperTools/ReportingTool/ReportingTool.ps1"); - File.WriteAllBytes(Path.Combine(AppState.ScratchPath, "ReportingTool.ps1"), data); - } - - RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin"); - RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin", new RegistryItem("MicroWinVersion", ValueKind.REG_SZ, $"{AppState.Version}")); - RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin", new RegistryItem("MicroWinBuildDate", ValueKind.REG_SZ, $"{DateTime.Now}")); - - } - - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\ControlSet001\\Control\\Session Manager", new RegistryItem("DisableWpbtExecution", ValueKind.REG_DWORD, 1)); - - // Skip first logon animation - RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", new RegistryItem("EnableFirstLogonAnimation", ValueKind.REG_DWORD, 0)); - - RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell", new RegistryItem("ExecutionPolicy", ValueKind.REG_SZ, "RemoteSigned")); - - // int majorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMajorVersionNumber")); - // int minorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMinorVersionNumber")); - // string build = Convert.ToString(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentBuild")); - // string ubr = Convert.ToString(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "UBR")); - - //if (majorver == 10 && minorver == 0 && build == "26100" && ubr == "1") - //{ - //try - //{ - //DismApi.Initialize(DismLogLevel.LogErrors); - //using DismSession session = DismApi.OpenOfflineSession(AppState.ScratchPath); - - //DismApi.EnableFeature(session, "Recall", false, true); - //DismApi.Shutdown(); - //} - //catch - //{ - // Add logging - //} - //} - - using (var client = new HttpClient()) - { - try - { - var data = client.GetByteArrayAsync("https://github.com/CodingWonders/MicroWin/raw/main/MicroWin/tools/FirstStartup.ps1").GetAwaiter().GetResult(); - File.WriteAllBytes(Path.Combine(AppState.ScratchPath, "Windows"), data); - } - catch { } - } - - RegistryHelper.UnloadRegistryHive("zSYSTEM"); - RegistryHelper.UnloadRegistryHive("zSOFTWARE"); - RegistryHelper.UnloadRegistryHive("zDEFAULT"); - RegistryHelper.UnloadRegistryHive("zNTUSER"); - - UpdateStatus("Finalizing..."); - DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateProgressBar(p)); - - string bootwimPath = Path.Combine(AppState.MountPath, "sources", "boot.wim"); - if (!File.Exists(bootwimPath)) bootwimPath = Path.Combine(AppState.MountPath, "sources", "boot.esd"); - - UpdateStatus("Mounting Boot WIM..."); - DismManager.MountImage(bootwimPath, 2, AppState.ScratchPath, (p) => UpdateProgressBar(p)); - - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); - RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); - - RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); - RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV2", ValueKind.REG_DWORD, 0)); - RegistryHelper.AddRegistryItem("HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); - RegistryHelper.AddRegistryItem("HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV2", ValueKind.REG_DWORD, 0)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassCPUCheck", ValueKind.REG_DWORD, 1)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassRAMCheck", ValueKind.REG_DWORD, 1)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassSecureBootCheck", ValueKind.REG_DWORD, 1)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassStorageCheck", ValueKind.REG_DWORD, 1)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\LabConfig", new RegistryItem("BypassTPMCheck", ValueKind.REG_DWORD, 1)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\MoSetup", new RegistryItem("AllowUpgradesWithUnsupportedTPMOrCPU", ValueKind.REG_DWORD, 1)); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\Status\\ChildCompletion", new RegistryItem("setup.exe", ValueKind.REG_DWORD, 3)); - - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup", new RegistryItem("CmdLine", ValueKind.REG_SZ, "\\sources\\setup.exe")); - - RegistryHelper.UnloadRegistryHive("zSYSTEM"); - RegistryHelper.UnloadRegistryHive("zSOFTWARE"); - RegistryHelper.UnloadRegistryHive("zDEFAULT"); - RegistryHelper.UnloadRegistryHive("zNTUSER"); - - UpdateStatus("Finalizing..."); - DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateProgressBar(p)); - - OscdimgUtilities.checkoscdImg(); - - Console.Write(AppState.saveISO); - - DeleteFiles.SafeDeleteDirectory(AppState.TempRoot); - }); - - _main.ShowPage(new Page_Finish(_main)); - } - } - - // --- PAGE 8: FINISH --- - public class Page_Finish : UserControl - { - public Page_Finish(MainForm main) - { - var lbl = new Label { Text = "Finished!", Location = new Point(50, 50), AutoSize = true }; - var btnClose = new Button { Text = "Close", Location = new Point(50, 100) }; - btnClose.Click += (s, e) => Application.Exit(); - this.Controls.AddRange(new Control[] { lbl, btnClose }); - } - } - -} diff --git a/MicroWin/functions/OSCDIMG/OscdimgUtilities.cs b/MicroWin/functions/OSCDIMG/OscdimgUtilities.cs index 7eb87fa..34ad15e 100644 --- a/MicroWin/functions/OSCDIMG/OscdimgUtilities.cs +++ b/MicroWin/functions/OSCDIMG/OscdimgUtilities.cs @@ -52,7 +52,7 @@ public static void startInstall() StartInfo = new ProcessStartInfo() { FileName = oscdimgPath, - Arguments = $"-m -o -u2 -udfver102 -bootdata:2#p0,e,b{Path.Combine(AppState.MountPath, "boot", "etfsboot.com")}#pEF,e,b{Path.Combine(AppState.MountPath, "efi", "microsoft", "boot", "efisys.bin")} \"{AppState.MountPath}\" \"{AppState.saveISO}\"" + Arguments = $"-m -o -u2 -udfver102 -bootdata:2#p0,e,b{Path.Combine(AppState.MountPath, "boot", "etfsboot.com")}#pEF,e,b{Path.Combine(AppState.MountPath, "efi", "microsoft", "boot", "efisys.bin")} \"{AppState.MountPath}\" \"{AppState.SaveISO}\"" } }; oscdimgProc.Start(); diff --git a/MicroWin/functions/UI/WizardPage.cs b/MicroWin/functions/UI/WizardPage.cs new file mode 100644 index 0000000..552eeb6 --- /dev/null +++ b/MicroWin/functions/UI/WizardPage.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MicroWin.functions.UI +{ + public class WizardPage + { + public enum Page : int + { + WelcomePage = 0, + IsoChooserPage = 1, + ImageChooserPage = 2, + UserAccountsPage = 3, + IsoSettingsPage = 4, + IsoCreationPage = 5, + FinishPage = 6 + } + + public Page wizardPage { get; set; } + + public const int PageCount = 7; + + } +} diff --git a/MicroWin/functions/dism/DismManager.cs b/MicroWin/functions/dism/DismManager.cs index f1e9808..a74d0f2 100755 --- a/MicroWin/functions/dism/DismManager.cs +++ b/MicroWin/functions/dism/DismManager.cs @@ -11,22 +11,6 @@ namespace MicroWin.functions.dism public static class DismManager { - public static Dictionary GetWimVersions(string wimPath) - { - Dictionary versions = new Dictionary(); - - DismImageInfoCollection imageInfoCollection = GetImageInformation(wimPath); - if (imageInfoCollection is null) - return versions; - - foreach (DismImageInfo imageInfo in imageInfoCollection) - { - versions.Add(imageInfo.ImageIndex, imageInfo.ImageName); - } - - return versions; - } - public static void MountImage(string wimPath, int index, string mountPath, Action progress) { // Check whether the file exists, then the index, then the mount path. @@ -110,7 +94,7 @@ private static DismMountedImageInfoCollection GetMountedImages() return mountedImages; } - private static DismImageInfoCollection GetImageInformation(string wimFile) + public static DismImageInfoCollection GetImageInformation(string wimFile) { DismImageInfoCollection imageInfo = null; diff --git a/MicroWin/functions/dism/OsFeatureDisabler.cs b/MicroWin/functions/dism/OsFeatureDisabler.cs index 9b1a538..4de0803 100644 --- a/MicroWin/functions/dism/OsFeatureDisabler.cs +++ b/MicroWin/functions/dism/OsFeatureDisabler.cs @@ -34,6 +34,8 @@ private void DisableFeatures() { DismFeatureCollection allFeatures = GetFeatureList(); + if (allFeatures is null) return; + IEnumerable featuresToDisable = allFeatures .Where(feature => ! new DismPackageFeatureState[3] { DismPackageFeatureState.NotPresent, DismPackageFeatureState.UninstallPending, DismPackageFeatureState.Staged }.Contains(feature.State)) .Select(feature => feature.FeatureName) diff --git a/MicroWin/functions/dism/OsPackageRemover.cs b/MicroWin/functions/dism/OsPackageRemover.cs index d7267ca..5224ce8 100644 --- a/MicroWin/functions/dism/OsPackageRemover.cs +++ b/MicroWin/functions/dism/OsPackageRemover.cs @@ -44,7 +44,7 @@ private void RemoveUnwantedPackages() { DismPackageCollection allPackages = GetPackageList(); - List selectedNames = AppState.SelectedPackages.ToList(); + if (allPackages is null) return; IEnumerable packagesToRemove = allPackages.Select(pkg => pkg.PackageName).Where(pkg => !excludedItems.Any(entry => pkg.IndexOf(entry, StringComparison.OrdinalIgnoreCase) >= 0)); From 4c967d4f980b1c742682fa529650238425c30aec Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Tue, 17 Feb 2026 18:49:53 +0100 Subject: [PATCH 3/7] Add sub-process reporting and other improvements --- MicroWin/AppState.cs | 2 +- MicroWin/MainForm.Designer.cs | 26 +++-- MicroWin/MainForm.cs | 107 +++++++++++++++--- MicroWin/functions/dism/DismManager.cs | 14 ++- .../functions/dism/ImageModificationTask.cs | 2 +- MicroWin/functions/dism/OsFeatureDisabler.cs | 12 +- MicroWin/functions/dism/OsPackageRemover.cs | 12 +- MicroWin/functions/dism/StoreAppRemover.cs | 12 +- 8 files changed, 144 insertions(+), 43 deletions(-) diff --git a/MicroWin/AppState.cs b/MicroWin/AppState.cs index c5ebff8..bab98c5 100755 --- a/MicroWin/AppState.cs +++ b/MicroWin/AppState.cs @@ -17,7 +17,7 @@ public static class AppState /// Determines whether to encode passwords with Base64 /// public static bool EncodeWithB64 { get; set; } = true; - public static bool AddReportingToolShortcut { get; set; } + public static bool AddReportingToolShortcut { get; set; } = true; public static bool CopyUnattendToFileSystem { get; set; } public static DriverExportMode DriverExportMode { get; set; } = DriverExportMode.NoExport; public static string SaveISO { get; set; } diff --git a/MicroWin/MainForm.Designer.cs b/MicroWin/MainForm.Designer.cs index 480fba7..4e4b3e8 100755 --- a/MicroWin/MainForm.Designer.cs +++ b/MicroWin/MainForm.Designer.cs @@ -92,7 +92,7 @@ private void InitializeComponent() this.IsoCreationPage = new System.Windows.Forms.Panel(); this.label14 = new System.Windows.Forms.Label(); this.label15 = new System.Windows.Forms.Label(); - this.textBox1 = new System.Windows.Forms.TextBox(); + this.logTB = new System.Windows.Forms.TextBox(); this.pnlProgress = new System.Windows.Forms.Panel(); this.lblCurrentStatus = new System.Windows.Forms.Label(); this.pbCurrent = new System.Windows.Forms.ProgressBar(); @@ -761,6 +761,8 @@ private void InitializeComponent() // ReportToolCB // this.ReportToolCB.AutoSize = true; + this.ReportToolCB.Checked = true; + this.ReportToolCB.CheckState = System.Windows.Forms.CheckState.Checked; this.ReportToolCB.Location = new System.Drawing.Point(83, 133); this.ReportToolCB.Name = "ReportToolCB"; this.ReportToolCB.Size = new System.Drawing.Size(218, 19); @@ -805,7 +807,7 @@ private void InitializeComponent() // IsoCreationPage // this.IsoCreationPage.Controls.Add(this.pnlProgress); - this.IsoCreationPage.Controls.Add(this.textBox1); + this.IsoCreationPage.Controls.Add(this.logTB); this.IsoCreationPage.Controls.Add(this.label14); this.IsoCreationPage.Controls.Add(this.label15); this.IsoCreationPage.Dock = System.Windows.Forms.DockStyle.Fill; @@ -838,15 +840,17 @@ private void InitializeComponent() this.label15.TabIndex = 7; this.label15.Text = "Customizations in progress"; // - // textBox1 + // logTB // - this.textBox1.Location = new System.Drawing.Point(99, 128); - this.textBox1.Multiline = true; - this.textBox1.Name = "textBox1"; - this.textBox1.ReadOnly = true; - this.textBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.textBox1.Size = new System.Drawing.Size(790, 248); - this.textBox1.TabIndex = 9; + this.logTB.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.logTB.Font = new System.Drawing.Font("Courier New", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.logTB.Location = new System.Drawing.Point(99, 128); + this.logTB.Multiline = true; + this.logTB.Name = "logTB"; + this.logTB.ReadOnly = true; + this.logTB.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.logTB.Size = new System.Drawing.Size(790, 248); + this.logTB.TabIndex = 9; // // pnlProgress // @@ -1014,7 +1018,7 @@ private void InitializeComponent() private System.Windows.Forms.ProgressBar pbCurrent; private System.Windows.Forms.Label lblOverallStatus; private System.Windows.Forms.Label lblCurrentStatus; - private System.Windows.Forms.TextBox textBox1; + private System.Windows.Forms.TextBox logTB; private System.Windows.Forms.SaveFileDialog isoSaverSFD; } } \ No newline at end of file diff --git a/MicroWin/MainForm.cs b/MicroWin/MainForm.cs index ceb4f77..74d959f 100755 --- a/MicroWin/MainForm.cs +++ b/MicroWin/MainForm.cs @@ -54,6 +54,12 @@ private void SetColorMode() BackColor = Color.FromArgb(247, 247, 247); ForeColor = Color.FromArgb(35, 38, 41); } + + // Change colors of other components. I want consistency + // TODO Add remaining controls + logTB.BackColor = BackColor; + logTB.ForeColor = ForeColor; + WindowHelper.ToggleDarkTitleBar(Handle, colorVal == 0); } @@ -338,39 +344,95 @@ private void UnattendCopyCB_CheckedChanged(object sender, EventArgs e) AppState.CopyUnattendToFileSystem = UnattendCopyCB.Checked; } - private void UpdateStatus(string text) + private void UpdateCurrentStatus(string text, bool resetBar = true) { - if (this.InvokeRequired) this.Invoke(new Action(() => { lblCurrentStatus.Text = text; pbCurrent.Value = 0; })); - else { lblCurrentStatus.Text = text; pbCurrent.Value = 0; } + if (InvokeRequired) + { + Invoke(new Action(() => + { + lblCurrentStatus.Text = text; + if (resetBar) pbCurrent.Value = 0; + })); + } + else + { + lblCurrentStatus.Text = text; + if (resetBar) pbCurrent.Value = 0; + } } - private void UpdateProgressBar(int value) + private void UpdateCurrentProgressBar(int value) { int safeValue = Math.Max(0, Math.Min(value, 100)); if (this.InvokeRequired) this.Invoke(new Action(() => pbCurrent.Value = safeValue)); else pbCurrent.Value = safeValue; } + private void UpdateOverallStatus(string text) + { + if (this.InvokeRequired) this.Invoke(new Action(() => { lblOverallStatus.Text = text; })); + else { lblOverallStatus.Text = text; } + } + + private void UpdateOverallProgressBar(int value) + { + int safeValue = Math.Max(0, Math.Min(value, 100)); + if (this.InvokeRequired) this.Invoke(new Action(() => pbOverall.Value = safeValue)); + else pbOverall.Value = safeValue; + } + + private void WriteLogMessage(string message) + { + string fullMsg = $"[{DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss")}] {message}\n"; + if (InvokeRequired) + { + Invoke(new Action(() => logTB.AppendText(fullMsg))); + } + else + { + logTB.AppendText(fullMsg); + } + } + private async void RunDeployment() { + // Clear old results and write the cool banner + logTB.Clear(); + logTB.Text = @" + /\/\ (_) ___ _ __ ___ / / /\ \ \(_) _ __ + / \ | | / __|| '__| / _ \ \ \/ \/ /| || '_ \ + / /\/\ \| || (__ | | | (_) | \ /\ / | || | | | + \/ \/|_| \___||_| \___/ \/ \/ |_||_| |_| + + MicroWin .NET (BETA 0.2) + +"; + await Task.Run(async () => { string installwimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); if (!File.Exists(installwimPath)) installwimPath = Path.Combine(AppState.MountPath, "sources", "install.esd"); - UpdateStatus("Mounting Install WIM..."); - DismManager.MountImage(installwimPath, AppState.SelectedImageIndex, AppState.ScratchPath, (p) => UpdateProgressBar(p)); + UpdateOverallStatus("Customizing install image..."); + UpdateOverallProgressBar(0); + UpdateCurrentStatus("Mounting install image..."); + DismManager.MountImage(installwimPath, AppState.SelectedImageIndex, AppState.ScratchPath, (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); UnattendGenerator.CreateUnattend($"{Path.Combine(AppState.ScratchPath, "Windows", "Panther")}"); - new OsFeatureDisabler().RunTask(); - new OsPackageRemover().RunTask(); - new StoreAppRemover().RunTask(); + UpdateOverallProgressBar(10); + new OsFeatureDisabler().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false)); + UpdateOverallProgressBar(20); + new OsPackageRemover().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false)); + UpdateOverallProgressBar(30); + new StoreAppRemover().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false)); + UpdateOverallProgressBar(40); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); + UpdateCurrentStatus("Modifying install image..."); if (AppState.AddReportingToolShortcut) { using (var client = new HttpClient()) @@ -418,7 +480,7 @@ await Task.Run(async () => { try { var data = client.GetByteArrayAsync("https://github.com/CodingWonders/MicroWin/raw/main/MicroWin/tools/FirstStartup.ps1").GetAwaiter().GetResult(); - File.WriteAllBytes(Path.Combine(AppState.ScratchPath, "Windows"), data); + File.WriteAllBytes(Path.Combine(AppState.ScratchPath, "Windows", "FirstStartup.ps1"), data); } catch { } } @@ -428,20 +490,25 @@ await Task.Run(async () => { RegistryHelper.UnloadRegistryHive("zDEFAULT"); RegistryHelper.UnloadRegistryHive("zNTUSER"); - UpdateStatus("Finalizing..."); - DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateProgressBar(p)); + UpdateCurrentStatus("Unmounting install image..."); + DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); + + UpdateOverallProgressBar(50); string bootwimPath = Path.Combine(AppState.MountPath, "sources", "boot.wim"); if (!File.Exists(bootwimPath)) bootwimPath = Path.Combine(AppState.MountPath, "sources", "boot.esd"); - UpdateStatus("Mounting Boot WIM..."); - DismManager.MountImage(bootwimPath, 2, AppState.ScratchPath, (p) => UpdateProgressBar(p)); + UpdateOverallStatus("Customizing boot image..."); + UpdateCurrentStatus("Mounting boot image..."); + DismManager.MountImage(bootwimPath, 2, AppState.ScratchPath, (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); + UpdateCurrentStatus("Modifying WinPE registry..."); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); + UpdateCurrentProgressBar(50); RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV2", ValueKind.REG_DWORD, 0)); RegistryHelper.AddRegistryItem("HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); @@ -454,16 +521,21 @@ await Task.Run(async () => { RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\MoSetup", new RegistryItem("AllowUpgradesWithUnsupportedTPMOrCPU", ValueKind.REG_DWORD, 1)); RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\Status\\ChildCompletion", new RegistryItem("setup.exe", ValueKind.REG_DWORD, 3)); + UpdateCurrentProgressBar(75); RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup", new RegistryItem("CmdLine", ValueKind.REG_SZ, "\\sources\\setup.exe")); + UpdateCurrentProgressBar(95); RegistryHelper.UnloadRegistryHive("zSYSTEM"); RegistryHelper.UnloadRegistryHive("zSOFTWARE"); RegistryHelper.UnloadRegistryHive("zDEFAULT"); RegistryHelper.UnloadRegistryHive("zNTUSER"); - UpdateStatus("Finalizing..."); - DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateProgressBar(p)); + UpdateCurrentStatus("Unmounting boot image..."); + DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); + UpdateOverallStatus("Generating ISO file..."); + UpdateOverallProgressBar(90); + UpdateCurrentStatus("Generating ISO file..."); OscdimgUtilities.checkoscdImg(); Console.Write(AppState.SaveISO); @@ -471,6 +543,9 @@ await Task.Run(async () => { DeleteFiles.SafeDeleteDirectory(AppState.TempRoot); }); + UpdateCurrentStatus("Generation complete"); + UpdateOverallProgressBar(100); + UpdateCurrentProgressBar(100); MessageBox.Show("Generation Complete."); Close(); } diff --git a/MicroWin/functions/dism/DismManager.cs b/MicroWin/functions/dism/DismManager.cs index a74d0f2..4d876ca 100755 --- a/MicroWin/functions/dism/DismManager.cs +++ b/MicroWin/functions/dism/DismManager.cs @@ -1,4 +1,5 @@ using Microsoft.Dism; +using MicroWin.functions.Helpers.Loggers; using System; using System.CodeDom; using System.Collections.Generic; @@ -11,10 +12,10 @@ namespace MicroWin.functions.dism public static class DismManager { - public static void MountImage(string wimPath, int index, string mountPath, Action progress) + public static void MountImage(string wimPath, int index, string mountPath, Action progress, Action logMessage) { // Check whether the file exists, then the index, then the mount path. - + logMessage.Invoke($"Preparing to mount image {Path.GetFileName(wimPath)} (index {index})..."); if (!File.Exists(wimPath)) return; @@ -37,23 +38,26 @@ public static void MountImage(string wimPath, int index, string mountPath, Actio // exception. if ((File.GetAttributes(wimPath) & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { + DynaLog.logMessage("Removing readonly..."); File.SetAttributes(wimPath, (File.GetAttributes(wimPath) & ~FileAttributes.ReadOnly)); } try { + logMessage.Invoke("Beginning mount operation..."); DismApi.Initialize(DismLogLevel.LogErrors); DismApi.MountImage(wimPath, mountPath, index, false, DismMountImageOptions.None, (currentProgress) => { progress(currentProgress.Current); }); } - catch (Exception) + catch (Exception ex) { - + DynaLog.logMessage($"Image could not be mounted. Message: {ex.Message}"); } finally { + logMessage.Invoke("Finishing mount operation..."); try { DismApi.Shutdown(); @@ -122,7 +126,7 @@ public static DismImageInfoCollection GetImageInformation(string wimFile) return imageInfo; } - public static void UnmountAndSave(string mountPath, Action progress) + public static void UnmountAndSave(string mountPath, Action progress, Action logMessage) { if (!Directory.Exists(mountPath)) { diff --git a/MicroWin/functions/dism/ImageModificationTask.cs b/MicroWin/functions/dism/ImageModificationTask.cs index ef8fb15..a47d227 100644 --- a/MicroWin/functions/dism/ImageModificationTask.cs +++ b/MicroWin/functions/dism/ImageModificationTask.cs @@ -10,6 +10,6 @@ public abstract class ImageModificationTask { public virtual List excludedItems { get; protected set; } = []; - public abstract void RunTask(); + public abstract void RunTask(Action pbReporter, Action curOpReporter); } } diff --git a/MicroWin/functions/dism/OsFeatureDisabler.cs b/MicroWin/functions/dism/OsFeatureDisabler.cs index 4de0803..a6924d1 100644 --- a/MicroWin/functions/dism/OsFeatureDisabler.cs +++ b/MicroWin/functions/dism/OsFeatureDisabler.cs @@ -25,17 +25,19 @@ public override List excludedItems { "RemoteDesktop" ]; - public override void RunTask() + public override void RunTask(Action pbReporter, Action curOpReporter) { - DisableFeatures(); + DisableFeatures(pbReporter, curOpReporter); } - private void DisableFeatures() + private void DisableFeatures(Action pbReporter, Action curOpReporter) { + curOpReporter.Invoke("Getting image features..."); DismFeatureCollection allFeatures = GetFeatureList(); if (allFeatures is null) return; + curOpReporter.Invoke("Filtering image features..."); IEnumerable featuresToDisable = allFeatures .Where(feature => ! new DismPackageFeatureState[3] { DismPackageFeatureState.NotPresent, DismPackageFeatureState.UninstallPending, DismPackageFeatureState.Staged }.Contains(feature.State)) .Select(feature => feature.FeatureName) @@ -45,8 +47,11 @@ private void DisableFeatures() { DismApi.Initialize(DismLogLevel.LogErrors); using DismSession session = DismApi.OpenOfflineSession(AppState.ScratchPath); + int idx = 0; foreach (string featureToDisable in featuresToDisable) { + curOpReporter.Invoke($"Disabling feature {featureToDisable}..."); + pbReporter.Invoke((idx / featuresToDisable.Count()) * 100); try { DismApi.DisableFeature(session, featureToDisable, null, true); @@ -55,6 +60,7 @@ private void DisableFeatures() { DynaLog.logMessage($"ERROR: Failed to disable {featureToDisable}: {ex.Message}"); } + idx++; } } catch (Exception) diff --git a/MicroWin/functions/dism/OsPackageRemover.cs b/MicroWin/functions/dism/OsPackageRemover.cs index 5224ce8..9e08c5d 100644 --- a/MicroWin/functions/dism/OsPackageRemover.cs +++ b/MicroWin/functions/dism/OsPackageRemover.cs @@ -35,17 +35,19 @@ public override List excludedItems "PMCPPC" ]; - public override void RunTask() + public override void RunTask(Action pbReporter, Action curOpReporter) { - RemoveUnwantedPackages(); + RemoveUnwantedPackages(pbReporter, curOpReporter); } - private void RemoveUnwantedPackages() + private void RemoveUnwantedPackages(Action pbReporter, Action curOpReporter) { + curOpReporter.Invoke("Getting image packages..."); DismPackageCollection allPackages = GetPackageList(); if (allPackages is null) return; + curOpReporter.Invoke("Filtering image packages..."); IEnumerable packagesToRemove = allPackages.Select(pkg => pkg.PackageName).Where(pkg => !excludedItems.Any(entry => pkg.IndexOf(entry, StringComparison.OrdinalIgnoreCase) >= 0)); @@ -53,8 +55,11 @@ private void RemoveUnwantedPackages() { DismApi.Initialize(DismLogLevel.LogErrors); using DismSession session = DismApi.OpenOfflineSession(AppState.ScratchPath); + int idx = 0; foreach (string packageToRemove in packagesToRemove) { + curOpReporter.Invoke($"Removing package {packageToRemove}..."); + pbReporter.Invoke((idx / packagesToRemove.Count()) * 100); // we have this because the API throws an exception on removal error try { @@ -64,6 +69,7 @@ private void RemoveUnwantedPackages() { DynaLog.logMessage($"ERROR: Failed to remove {packageToRemove}: {ex.Message}"); } + idx++; } } catch (Exception) diff --git a/MicroWin/functions/dism/StoreAppRemover.cs b/MicroWin/functions/dism/StoreAppRemover.cs index f7b6826..d8f6430 100644 --- a/MicroWin/functions/dism/StoreAppRemover.cs +++ b/MicroWin/functions/dism/StoreAppRemover.cs @@ -33,16 +33,18 @@ public override List excludedItems { "CrossDevice" ]; - public override void RunTask() + public override void RunTask(Action pbReporter, Action curOpReporter) { - RemoveStoreApps(); + RemoveStoreApps(pbReporter, curOpReporter); } - private void RemoveStoreApps() + private void RemoveStoreApps(Action pbReporter, Action curOpReporter) { + curOpReporter.Invoke("Getting image AppX packages..."); DismAppxPackageCollection allStoreApps = GetStoreAppsList(); if (allStoreApps is null) return; + curOpReporter.Invoke("Filtering image AppX packages..."); IEnumerable appsToRemove = allStoreApps.Select(appx => appx.PackageName).Where(appx => !excludedItems.Any(entry => appx.IndexOf(entry, StringComparison.OrdinalIgnoreCase) >= 0)); @@ -50,8 +52,11 @@ private void RemoveStoreApps() { DismApi.Initialize(DismLogLevel.LogErrors); using DismSession session = DismApi.OpenOfflineSession(AppState.ScratchPath); + int idx = 0; foreach (string appToRemove in appsToRemove) { + curOpReporter.Invoke($"Removing AppX package {appToRemove}..."); + pbReporter.Invoke((idx / appsToRemove.Count()) * 100); try { DismApi.RemoveProvisionedAppxPackage(session, appToRemove); @@ -60,6 +65,7 @@ private void RemoveStoreApps() { DynaLog.logMessage($"ERROR: Failed to remove {appToRemove}: {ex.Message}"); } + idx++; } } catch (Exception) From 80d3542fc72dd9f0d01873c24eecb88ce0be8552 Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Tue, 17 Feb 2026 22:52:21 +0100 Subject: [PATCH 4/7] Improve subprocess reporting and logging --- MicroWin/MainForm.cs | 6 +++++- MicroWin/functions/dism/OsFeatureDisabler.cs | 3 ++- MicroWin/functions/dism/OsPackageRemover.cs | 3 ++- MicroWin/functions/dism/StoreAppRemover.cs | 3 ++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/MicroWin/MainForm.cs b/MicroWin/MainForm.cs index 74d959f..2ba6362 100755 --- a/MicroWin/MainForm.cs +++ b/MicroWin/MainForm.cs @@ -383,7 +383,7 @@ private void UpdateOverallProgressBar(int value) private void WriteLogMessage(string message) { - string fullMsg = $"[{DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss")}] {message}\n"; + string fullMsg = $"[{DateTime.UtcNow.ToString("yyyy/MM/dd HH:mm:ss")} UTC] {message}{Environment.NewLine}"; if (InvokeRequired) { Invoke(new Action(() => logTB.AppendText(fullMsg))); @@ -446,6 +446,7 @@ await Task.Run(async () => { RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\MicroWin", new RegistryItem("MicroWinBuildDate", ValueKind.REG_SZ, $"{DateTime.Now}")); } + UpdateCurrentProgressBar(10); RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\ControlSet001\\Control\\Session Manager", new RegistryItem("DisableWpbtExecution", ValueKind.REG_DWORD, 1)); @@ -475,6 +476,7 @@ await Task.Run(async () => { //} //} + UpdateCurrentProgressBar(50); using (var client = new HttpClient()) { try @@ -485,10 +487,12 @@ await Task.Run(async () => { catch { } } + UpdateCurrentProgressBar(90); RegistryHelper.UnloadRegistryHive("zSYSTEM"); RegistryHelper.UnloadRegistryHive("zSOFTWARE"); RegistryHelper.UnloadRegistryHive("zDEFAULT"); RegistryHelper.UnloadRegistryHive("zNTUSER"); + UpdateCurrentProgressBar(100); UpdateCurrentStatus("Unmounting install image..."); DismManager.UnmountAndSave(AppState.ScratchPath.TrimEnd('\\'), (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); diff --git a/MicroWin/functions/dism/OsFeatureDisabler.cs b/MicroWin/functions/dism/OsFeatureDisabler.cs index a6924d1..5f0ea5b 100644 --- a/MicroWin/functions/dism/OsFeatureDisabler.cs +++ b/MicroWin/functions/dism/OsFeatureDisabler.cs @@ -51,7 +51,7 @@ private void DisableFeatures(Action pbReporter, Action curOpReporte foreach (string featureToDisable in featuresToDisable) { curOpReporter.Invoke($"Disabling feature {featureToDisable}..."); - pbReporter.Invoke((idx / featuresToDisable.Count()) * 100); + pbReporter.Invoke((int)(((double)idx / featuresToDisable.ToList().Count) * 100)); try { DismApi.DisableFeature(session, featureToDisable, null, true); @@ -69,6 +69,7 @@ private void DisableFeatures(Action pbReporter, Action curOpReporte } finally { + pbReporter.Invoke(100); try { DismApi.Shutdown(); diff --git a/MicroWin/functions/dism/OsPackageRemover.cs b/MicroWin/functions/dism/OsPackageRemover.cs index 9e08c5d..2012b3e 100644 --- a/MicroWin/functions/dism/OsPackageRemover.cs +++ b/MicroWin/functions/dism/OsPackageRemover.cs @@ -59,7 +59,7 @@ private void RemoveUnwantedPackages(Action pbReporter, Action curOp foreach (string packageToRemove in packagesToRemove) { curOpReporter.Invoke($"Removing package {packageToRemove}..."); - pbReporter.Invoke((idx / packagesToRemove.Count()) * 100); + pbReporter.Invoke((int)(((double)idx / packagesToRemove.ToList().Count) * 100)); // we have this because the API throws an exception on removal error try { @@ -78,6 +78,7 @@ private void RemoveUnwantedPackages(Action pbReporter, Action curOp } finally { + pbReporter.Invoke(100); try { DismApi.Shutdown(); diff --git a/MicroWin/functions/dism/StoreAppRemover.cs b/MicroWin/functions/dism/StoreAppRemover.cs index d8f6430..fffaccc 100644 --- a/MicroWin/functions/dism/StoreAppRemover.cs +++ b/MicroWin/functions/dism/StoreAppRemover.cs @@ -56,7 +56,7 @@ private void RemoveStoreApps(Action pbReporter, Action curOpReporte foreach (string appToRemove in appsToRemove) { curOpReporter.Invoke($"Removing AppX package {appToRemove}..."); - pbReporter.Invoke((idx / appsToRemove.Count()) * 100); + pbReporter.Invoke((int)(((double)idx / appsToRemove.ToList().Count) * 100)); try { DismApi.RemoveProvisionedAppxPackage(session, appToRemove); @@ -74,6 +74,7 @@ private void RemoveStoreApps(Action pbReporter, Action curOpReporte } finally { + pbReporter.Invoke(100); try { DismApi.Shutdown(); From 42d016bde4192ce4b8c0685ea2469c61a6a53759 Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Wed, 18 Feb 2026 15:40:51 +0100 Subject: [PATCH 5/7] Major improvements --- MicroWin/MainForm.Designer.cs | 973 ++++++++++-------- MicroWin/MainForm.cs | 79 +- MicroWin/MainForm.resx | 12 +- MicroWin/functions/dism/DismManager.cs | 3 + .../functions/dism/ImageModificationTask.cs | 2 +- MicroWin/functions/dism/OsFeatureDisabler.cs | 11 +- MicroWin/functions/dism/OsPackageRemover.cs | 11 +- MicroWin/functions/dism/StoreAppRemover.cs | 11 +- MicroWin/functions/dism/UnattendGenerator.cs | 37 +- 9 files changed, 678 insertions(+), 461 deletions(-) diff --git a/MicroWin/MainForm.Designer.cs b/MicroWin/MainForm.Designer.cs index 4e4b3e8..d8f98d4 100755 --- a/MicroWin/MainForm.Designer.cs +++ b/MicroWin/MainForm.Designer.cs @@ -35,22 +35,6 @@ private void InitializeComponent() this.Next_Button = new System.Windows.Forms.Button(); this.Cancel_Button = new System.Windows.Forms.Button(); this.PageContainerPanel = new System.Windows.Forms.Panel(); - this.IsoChooserPage = new System.Windows.Forms.Panel(); - this.isoExtractionPB = new System.Windows.Forms.ProgressBar(); - this.isoPickerBtn = new System.Windows.Forms.Button(); - this.isoPathTB = new System.Windows.Forms.TextBox(); - this.lblExtractionStatus = new System.Windows.Forms.Label(); - this.label1 = new System.Windows.Forms.Label(); - this.SysCheckPage_Description = new System.Windows.Forms.Label(); - this.SysCheckPage_Header = new System.Windows.Forms.Label(); - this.WelcomePage = new System.Windows.Forms.Panel(); - this.lblDisclaimer = new System.Windows.Forms.Label(); - this.WelcomePage_Description = new System.Windows.Forms.Label(); - this.WelcomePage_Header = new System.Windows.Forms.Label(); - this.FinishPanel = new System.Windows.Forms.Panel(); - this.FinishPage_Description = new System.Windows.Forms.Label(); - this.FinishPage_Header = new System.Windows.Forms.Label(); - this.isoPickerOFD = new System.Windows.Forms.OpenFileDialog(); this.ImageChooserPage = new System.Windows.Forms.Panel(); this.label2 = new System.Windows.Forms.Label(); this.lvVersions = new System.Windows.Forms.ListView(); @@ -60,6 +44,31 @@ private void InitializeComponent() this.columnHeader4 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.columnHeader5 = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.label3 = new System.Windows.Forms.Label(); + this.FinishPage = new System.Windows.Forms.Panel(); + this.lnkViewCreationLogs = new System.Windows.Forms.LinkLabel(); + this.lnkOpenIsoLoc = new System.Windows.Forms.LinkLabel(); + this.panel4 = new System.Windows.Forms.Panel(); + this.lnkUseNtLite = new System.Windows.Forms.LinkLabel(); + this.lnkUseDT = new System.Windows.Forms.LinkLabel(); + this.label18 = new System.Windows.Forms.Label(); + this.label16 = new System.Windows.Forms.Label(); + this.label17 = new System.Windows.Forms.Label(); + this.IsoCreationPage = new System.Windows.Forms.Panel(); + this.pnlProgress = new System.Windows.Forms.Panel(); + this.pbOverall = new System.Windows.Forms.ProgressBar(); + this.pbCurrent = new System.Windows.Forms.ProgressBar(); + this.lblOverallStatus = new System.Windows.Forms.Label(); + this.lblCurrentStatus = new System.Windows.Forms.Label(); + this.logTB = new System.Windows.Forms.TextBox(); + this.label14 = new System.Windows.Forms.Label(); + this.label15 = new System.Windows.Forms.Label(); + this.IsoSettingsPage = new System.Windows.Forms.Panel(); + this.DriverExportCombo = new System.Windows.Forms.ComboBox(); + this.label13 = new System.Windows.Forms.Label(); + this.UnattendCopyCB = new System.Windows.Forms.CheckBox(); + this.ReportToolCB = new System.Windows.Forms.CheckBox(); + this.label11 = new System.Windows.Forms.Label(); + this.label12 = new System.Windows.Forms.Label(); this.UserAccountsPage = new System.Windows.Forms.Panel(); this.panel1 = new System.Windows.Forms.Panel(); this.tableLayoutPanel3 = new System.Windows.Forms.TableLayoutPanel(); @@ -78,34 +87,33 @@ private void InitializeComponent() this.label7 = new System.Windows.Forms.Label(); this.usrNameTB = new System.Windows.Forms.TextBox(); this.usrPasswordTB = new System.Windows.Forms.TextBox(); - this.label5 = new System.Windows.Forms.Label(); - this.label4 = new System.Windows.Forms.Label(); this.usrNameCurrentSysNameBtn = new System.Windows.Forms.Button(); this.usrPasswordRevealCB = new System.Windows.Forms.CheckBox(); - this.IsoSettingsPage = new System.Windows.Forms.Panel(); - this.label11 = new System.Windows.Forms.Label(); - this.label12 = new System.Windows.Forms.Label(); - this.ReportToolCB = new System.Windows.Forms.CheckBox(); - this.label13 = new System.Windows.Forms.Label(); - this.DriverExportCombo = new System.Windows.Forms.ComboBox(); - this.UnattendCopyCB = new System.Windows.Forms.CheckBox(); - this.IsoCreationPage = new System.Windows.Forms.Panel(); - this.label14 = new System.Windows.Forms.Label(); - this.label15 = new System.Windows.Forms.Label(); - this.logTB = new System.Windows.Forms.TextBox(); - this.pnlProgress = new System.Windows.Forms.Panel(); - this.lblCurrentStatus = new System.Windows.Forms.Label(); - this.pbCurrent = new System.Windows.Forms.ProgressBar(); - this.lblOverallStatus = new System.Windows.Forms.Label(); - this.pbOverall = new System.Windows.Forms.ProgressBar(); + this.label5 = new System.Windows.Forms.Label(); + this.label4 = new System.Windows.Forms.Label(); + this.IsoChooserPage = new System.Windows.Forms.Panel(); + this.isoExtractionPB = new System.Windows.Forms.ProgressBar(); + this.isoPickerBtn = new System.Windows.Forms.Button(); + this.isoPathTB = new System.Windows.Forms.TextBox(); + this.lblExtractionStatus = new System.Windows.Forms.Label(); + this.label1 = new System.Windows.Forms.Label(); + this.SysCheckPage_Description = new System.Windows.Forms.Label(); + this.SysCheckPage_Header = new System.Windows.Forms.Label(); + this.WelcomePage = new System.Windows.Forms.Panel(); + this.lblDisclaimer = new System.Windows.Forms.Label(); + this.WelcomePage_Description = new System.Windows.Forms.Label(); + this.WelcomePage_Header = new System.Windows.Forms.Label(); + this.isoPickerOFD = new System.Windows.Forms.OpenFileDialog(); this.isoSaverSFD = new System.Windows.Forms.SaveFileDialog(); this.ButtonPanel.SuspendLayout(); this.TableLayoutPanel1.SuspendLayout(); this.PageContainerPanel.SuspendLayout(); - this.IsoChooserPage.SuspendLayout(); - this.WelcomePage.SuspendLayout(); - this.FinishPanel.SuspendLayout(); this.ImageChooserPage.SuspendLayout(); + this.FinishPage.SuspendLayout(); + this.panel4.SuspendLayout(); + this.IsoCreationPage.SuspendLayout(); + this.pnlProgress.SuspendLayout(); + this.IsoSettingsPage.SuspendLayout(); this.UserAccountsPage.SuspendLayout(); this.panel1.SuspendLayout(); this.tableLayoutPanel3.SuspendLayout(); @@ -114,9 +122,8 @@ private void InitializeComponent() ((System.ComponentModel.ISupportInitialize)(this.pictureBox2)).BeginInit(); this.panel2.SuspendLayout(); this.tableLayoutPanel2.SuspendLayout(); - this.IsoSettingsPage.SuspendLayout(); - this.IsoCreationPage.SuspendLayout(); - this.pnlProgress.SuspendLayout(); + this.IsoChooserPage.SuspendLayout(); + this.WelcomePage.SuspendLayout(); this.SuspendLayout(); // // ButtonPanel @@ -183,9 +190,13 @@ private void InitializeComponent() // // PageContainerPanel // + this.PageContainerPanel.Controls.Add(this.FinishPage); + this.PageContainerPanel.Controls.Add(this.IsoCreationPage); + this.PageContainerPanel.Controls.Add(this.IsoSettingsPage); + this.PageContainerPanel.Controls.Add(this.UserAccountsPage); + this.PageContainerPanel.Controls.Add(this.ImageChooserPage); this.PageContainerPanel.Controls.Add(this.IsoChooserPage); this.PageContainerPanel.Controls.Add(this.WelcomePage); - this.PageContainerPanel.Controls.Add(this.FinishPanel); this.PageContainerPanel.Dock = System.Windows.Forms.DockStyle.Fill; this.PageContainerPanel.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.PageContainerPanel.Location = new System.Drawing.Point(0, 0); @@ -193,186 +204,6 @@ private void InitializeComponent() this.PageContainerPanel.Size = new System.Drawing.Size(1008, 521); this.PageContainerPanel.TabIndex = 3; // - // IsoChooserPage - // - this.IsoChooserPage.Controls.Add(this.isoExtractionPB); - this.IsoChooserPage.Controls.Add(this.isoPickerBtn); - this.IsoChooserPage.Controls.Add(this.isoPathTB); - this.IsoChooserPage.Controls.Add(this.lblExtractionStatus); - this.IsoChooserPage.Controls.Add(this.label1); - this.IsoChooserPage.Controls.Add(this.SysCheckPage_Description); - this.IsoChooserPage.Controls.Add(this.SysCheckPage_Header); - this.IsoChooserPage.Dock = System.Windows.Forms.DockStyle.Fill; - this.IsoChooserPage.Location = new System.Drawing.Point(0, 0); - this.IsoChooserPage.Name = "IsoChooserPage"; - this.IsoChooserPage.Size = new System.Drawing.Size(1008, 521); - this.IsoChooserPage.TabIndex = 1; - this.IsoChooserPage.Visible = false; - // - // isoExtractionPB - // - this.isoExtractionPB.Location = new System.Drawing.Point(125, 219); - this.isoExtractionPB.Name = "isoExtractionPB"; - this.isoExtractionPB.Size = new System.Drawing.Size(719, 23); - this.isoExtractionPB.TabIndex = 4; - // - // isoPickerBtn - // - this.isoPickerBtn.FlatStyle = System.Windows.Forms.FlatStyle.System; - this.isoPickerBtn.Location = new System.Drawing.Point(769, 146); - this.isoPickerBtn.Name = "isoPickerBtn"; - this.isoPickerBtn.Size = new System.Drawing.Size(75, 23); - this.isoPickerBtn.TabIndex = 3; - this.isoPickerBtn.Text = "Browse..."; - this.isoPickerBtn.UseVisualStyleBackColor = true; - this.isoPickerBtn.Click += new System.EventHandler(this.isoPickerBtn_Click); - // - // isoPathTB - // - this.isoPathTB.Location = new System.Drawing.Point(125, 147); - this.isoPathTB.Name = "isoPathTB"; - this.isoPathTB.ReadOnly = true; - this.isoPathTB.Size = new System.Drawing.Size(638, 23); - this.isoPathTB.TabIndex = 2; - this.isoPathTB.TextChanged += new System.EventHandler(this.isoPathTB_TextChanged); - // - // lblExtractionStatus - // - this.lblExtractionStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lblExtractionStatus.AutoEllipsis = true; - this.lblExtractionStatus.AutoSize = true; - this.lblExtractionStatus.Location = new System.Drawing.Point(122, 200); - this.lblExtractionStatus.Name = "lblExtractionStatus"; - this.lblExtractionStatus.Size = new System.Drawing.Size(243, 15); - this.lblExtractionStatus.TabIndex = 1; - this.lblExtractionStatus.Text = "Disc image extraction status will appear here."; - // - // label1 - // - this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label1.AutoEllipsis = true; - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(122, 128); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(68, 15); - this.label1.TabIndex = 1; - this.label1.Text = "Disc image:"; - // - // SysCheckPage_Description - // - this.SysCheckPage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SysCheckPage_Description.AutoEllipsis = true; - this.SysCheckPage_Description.Location = new System.Drawing.Point(17, 64); - this.SysCheckPage_Description.Name = "SysCheckPage_Description"; - this.SysCheckPage_Description.Size = new System.Drawing.Size(977, 52); - this.SysCheckPage_Description.TabIndex = 1; - this.SysCheckPage_Description.Text = "Please specify the ISO that you want to use with this wizard. Supported operating" + - " systems are Windows 10 and Windows 11."; - // - // SysCheckPage_Header - // - this.SysCheckPage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.SysCheckPage_Header.AutoEllipsis = true; - this.SysCheckPage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.SysCheckPage_Header.Location = new System.Drawing.Point(14, 12); - this.SysCheckPage_Header.Name = "SysCheckPage_Header"; - this.SysCheckPage_Header.Size = new System.Drawing.Size(980, 45); - this.SysCheckPage_Header.TabIndex = 0; - this.SysCheckPage_Header.Text = "Choose a disc image"; - // - // WelcomePage - // - this.WelcomePage.Controls.Add(this.lblDisclaimer); - this.WelcomePage.Controls.Add(this.WelcomePage_Description); - this.WelcomePage.Controls.Add(this.WelcomePage_Header); - this.WelcomePage.Dock = System.Windows.Forms.DockStyle.Fill; - this.WelcomePage.Location = new System.Drawing.Point(0, 0); - this.WelcomePage.Name = "WelcomePage"; - this.WelcomePage.Size = new System.Drawing.Size(1008, 521); - this.WelcomePage.TabIndex = 0; - // - // lblDisclaimer - // - this.lblDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.lblDisclaimer.AutoEllipsis = true; - this.lblDisclaimer.Location = new System.Drawing.Point(119, 128); - this.lblDisclaimer.Name = "lblDisclaimer"; - this.lblDisclaimer.Size = new System.Drawing.Size(770, 313); - this.lblDisclaimer.TabIndex = 1; - // - // WelcomePage_Description - // - this.WelcomePage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.WelcomePage_Description.AutoEllipsis = true; - this.WelcomePage_Description.Location = new System.Drawing.Point(17, 64); - this.WelcomePage_Description.Name = "WelcomePage_Description"; - this.WelcomePage_Description.Size = new System.Drawing.Size(977, 52); - this.WelcomePage_Description.TabIndex = 1; - this.WelcomePage_Description.Text = "This wizard will help you configure your Windows image. To begin, click Next."; - // - // WelcomePage_Header - // - this.WelcomePage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.WelcomePage_Header.AutoEllipsis = true; - this.WelcomePage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.WelcomePage_Header.Location = new System.Drawing.Point(14, 12); - this.WelcomePage_Header.Name = "WelcomePage_Header"; - this.WelcomePage_Header.Size = new System.Drawing.Size(980, 45); - this.WelcomePage_Header.TabIndex = 0; - this.WelcomePage_Header.Text = "Welcome"; - // - // FinishPanel - // - this.FinishPanel.Controls.Add(this.FinishPage_Description); - this.FinishPanel.Controls.Add(this.FinishPage_Header); - this.FinishPanel.Dock = System.Windows.Forms.DockStyle.Fill; - this.FinishPanel.Location = new System.Drawing.Point(0, 0); - this.FinishPanel.Name = "FinishPanel"; - this.FinishPanel.Size = new System.Drawing.Size(1008, 521); - this.FinishPanel.TabIndex = 4; - this.FinishPanel.Visible = false; - // - // FinishPage_Description - // - this.FinishPage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.FinishPage_Description.AutoEllipsis = true; - this.FinishPage_Description.Location = new System.Drawing.Point(17, 64); - this.FinishPage_Description.Name = "FinishPage_Description"; - this.FinishPage_Description.Size = new System.Drawing.Size(977, 52); - this.FinishPage_Description.TabIndex = 1; - this.FinishPage_Description.Text = resources.GetString("FinishPage_Description.Text"); - // - // FinishPage_Header - // - this.FinishPage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.FinishPage_Header.AutoEllipsis = true; - this.FinishPage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.FinishPage_Header.Location = new System.Drawing.Point(14, 12); - this.FinishPage_Header.Name = "FinishPage_Header"; - this.FinishPage_Header.Size = new System.Drawing.Size(980, 45); - this.FinishPage_Header.TabIndex = 0; - this.FinishPage_Header.Text = "Finishing Preparation..."; - // - // isoPickerOFD - // - this.isoPickerOFD.Filter = "ISO Files|*.iso"; - this.isoPickerOFD.FileOk += new System.ComponentModel.CancelEventHandler(this.isoPickerOFD_FileOk); - // // ImageChooserPage // this.ImageChooserPage.Controls.Add(this.label2); @@ -386,6 +217,7 @@ private void InitializeComponent() // // label2 // + this.label2.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(80, 448); this.label2.Name = "label2"; @@ -396,6 +228,10 @@ private void InitializeComponent() // // lvVersions // + this.lvVersions.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lvVersions.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.lvVersions.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.columnHeader1, this.columnHeader2, @@ -416,6 +252,7 @@ private void InitializeComponent() // columnHeader1 // this.columnHeader1.Text = "#"; + this.columnHeader1.TextAlign = System.Windows.Forms.HorizontalAlignment.Center; this.columnHeader1.Width = 32; // // columnHeader2 @@ -450,33 +287,336 @@ private void InitializeComponent() this.label3.TabIndex = 2; this.label3.Text = "Choose the image to modify"; // - // UserAccountsPage - // - this.UserAccountsPage.Controls.Add(this.panel1); - this.UserAccountsPage.Controls.Add(this.b64CB); - this.UserAccountsPage.Controls.Add(this.tableLayoutPanel2); - this.UserAccountsPage.Controls.Add(this.label5); - this.UserAccountsPage.Controls.Add(this.label4); - this.UserAccountsPage.Dock = System.Windows.Forms.DockStyle.Fill; - this.UserAccountsPage.Location = new System.Drawing.Point(0, 0); - this.UserAccountsPage.Name = "UserAccountsPage"; - this.UserAccountsPage.Size = new System.Drawing.Size(1008, 521); - this.UserAccountsPage.TabIndex = 5; + // FinishPage + // + this.FinishPage.Controls.Add(this.lnkViewCreationLogs); + this.FinishPage.Controls.Add(this.lnkOpenIsoLoc); + this.FinishPage.Controls.Add(this.panel4); + this.FinishPage.Controls.Add(this.label16); + this.FinishPage.Controls.Add(this.label17); + this.FinishPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.FinishPage.Location = new System.Drawing.Point(0, 0); + this.FinishPage.Name = "FinishPage"; + this.FinishPage.Size = new System.Drawing.Size(1008, 521); + this.FinishPage.TabIndex = 8; + // + // lnkViewCreationLogs + // + this.lnkViewCreationLogs.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lnkViewCreationLogs.AutoSize = true; + this.lnkViewCreationLogs.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.lnkViewCreationLogs.LinkColor = System.Drawing.Color.DodgerBlue; + this.lnkViewCreationLogs.Location = new System.Drawing.Point(99, 441); + this.lnkViewCreationLogs.Name = "lnkViewCreationLogs"; + this.lnkViewCreationLogs.Size = new System.Drawing.Size(124, 15); + this.lnkViewCreationLogs.TabIndex = 12; + this.lnkViewCreationLogs.TabStop = true; + this.lnkViewCreationLogs.Text = "View ISO creation logs"; + // + // lnkOpenIsoLoc + // + this.lnkOpenIsoLoc.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); + this.lnkOpenIsoLoc.AutoSize = true; + this.lnkOpenIsoLoc.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.lnkOpenIsoLoc.LinkColor = System.Drawing.Color.DodgerBlue; + this.lnkOpenIsoLoc.Location = new System.Drawing.Point(99, 416); + this.lnkOpenIsoLoc.Name = "lnkOpenIsoLoc"; + this.lnkOpenIsoLoc.Size = new System.Drawing.Size(103, 15); + this.lnkOpenIsoLoc.TabIndex = 12; + this.lnkOpenIsoLoc.TabStop = true; + this.lnkOpenIsoLoc.Text = "Open ISO location"; + this.lnkOpenIsoLoc.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkOpenIsoLoc_LinkClicked); + // + // panel4 + // + this.panel4.Anchor = System.Windows.Forms.AnchorStyles.None; + this.panel4.Controls.Add(this.lnkUseNtLite); + this.panel4.Controls.Add(this.lnkUseDT); + this.panel4.Controls.Add(this.label18); + this.panel4.Location = new System.Drawing.Point(101, 123); + this.panel4.Name = "panel4"; + this.panel4.Size = new System.Drawing.Size(806, 276); + this.panel4.TabIndex = 11; + // + // lnkUseNtLite + // + this.lnkUseNtLite.AutoSize = true; + this.lnkUseNtLite.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lnkUseNtLite.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.lnkUseNtLite.LinkColor = System.Drawing.Color.DodgerBlue; + this.lnkUseNtLite.Location = new System.Drawing.Point(101, 193); + this.lnkUseNtLite.Name = "lnkUseNtLite"; + this.lnkUseNtLite.Size = new System.Drawing.Size(55, 21); + this.lnkUseNtLite.TabIndex = 11; + this.lnkUseNtLite.TabStop = true; + this.lnkUseNtLite.Text = "NTLite"; + this.lnkUseNtLite.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkUseNtLite_LinkClicked); + // + // lnkUseDT + // + this.lnkUseDT.AutoSize = true; + this.lnkUseDT.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.lnkUseDT.LinkBehavior = System.Windows.Forms.LinkBehavior.NeverUnderline; + this.lnkUseDT.LinkColor = System.Drawing.Color.DodgerBlue; + this.lnkUseDT.Location = new System.Drawing.Point(101, 160); + this.lnkUseDT.Name = "lnkUseDT"; + this.lnkUseDT.Size = new System.Drawing.Size(83, 21); + this.lnkUseDT.TabIndex = 11; + this.lnkUseDT.TabStop = true; + this.lnkUseDT.Text = "DISMTools"; + this.lnkUseDT.LinkClicked += new System.Windows.Forms.LinkLabelLinkClickedEventHandler(this.lnkUseDT_LinkClicked); + // + // label18 + // + this.label18.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label18.AutoEllipsis = true; + this.label18.Font = new System.Drawing.Font("Segoe UI", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label18.Location = new System.Drawing.Point(51, 31); + this.label18.Name = "label18"; + this.label18.Size = new System.Drawing.Size(704, 95); + this.label18.TabIndex = 10; + this.label18.Text = resources.GetString("label18.Text"); + this.label18.TextAlign = System.Drawing.ContentAlignment.TopCenter; + // + // label16 + // + this.label16.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label16.AutoEllipsis = true; + this.label16.Location = new System.Drawing.Point(17, 64); + this.label16.Name = "label16"; + this.label16.Size = new System.Drawing.Size(977, 52); + this.label16.TabIndex = 10; + this.label16.Text = "Your ISO file is now ready for operating system installation."; // - // panel1 + // label17 // - this.panel1.Controls.Add(this.tableLayoutPanel3); - this.panel1.Controls.Add(this.label8); - this.panel1.Location = new System.Drawing.Point(85, 254); - this.panel1.Name = "panel1"; - this.panel1.Size = new System.Drawing.Size(838, 236); - this.panel1.TabIndex = 7; + this.label17.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label17.AutoEllipsis = true; + this.label17.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label17.Location = new System.Drawing.Point(14, 12); + this.label17.Name = "label17"; + this.label17.Size = new System.Drawing.Size(980, 45); + this.label17.TabIndex = 9; + this.label17.Text = "Customizations complete"; // - // tableLayoutPanel3 + // IsoCreationPage // - this.tableLayoutPanel3.ColumnCount = 2; - this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 47.61337F)); - this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 52.38663F)); + this.IsoCreationPage.Controls.Add(this.pnlProgress); + this.IsoCreationPage.Controls.Add(this.logTB); + this.IsoCreationPage.Controls.Add(this.label14); + this.IsoCreationPage.Controls.Add(this.label15); + this.IsoCreationPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsoCreationPage.Location = new System.Drawing.Point(0, 0); + this.IsoCreationPage.Name = "IsoCreationPage"; + this.IsoCreationPage.Size = new System.Drawing.Size(1008, 521); + this.IsoCreationPage.TabIndex = 7; + // + // pnlProgress + // + this.pnlProgress.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pnlProgress.Controls.Add(this.pbOverall); + this.pnlProgress.Controls.Add(this.pbCurrent); + this.pnlProgress.Controls.Add(this.lblOverallStatus); + this.pnlProgress.Controls.Add(this.lblCurrentStatus); + this.pnlProgress.Location = new System.Drawing.Point(19, 405); + this.pnlProgress.Name = "pnlProgress"; + this.pnlProgress.Size = new System.Drawing.Size(971, 110); + this.pnlProgress.TabIndex = 10; + // + // pbOverall + // + this.pbOverall.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pbOverall.Location = new System.Drawing.Point(14, 77); + this.pbOverall.Name = "pbOverall"; + this.pbOverall.Size = new System.Drawing.Size(941, 23); + this.pbOverall.TabIndex = 1; + // + // pbCurrent + // + this.pbCurrent.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.pbCurrent.Location = new System.Drawing.Point(14, 30); + this.pbCurrent.Name = "pbCurrent"; + this.pbCurrent.Size = new System.Drawing.Size(941, 23); + this.pbCurrent.TabIndex = 1; + // + // lblOverallStatus + // + this.lblOverallStatus.AutoSize = true; + this.lblOverallStatus.Location = new System.Drawing.Point(11, 58); + this.lblOverallStatus.Name = "lblOverallStatus"; + this.lblOverallStatus.Size = new System.Drawing.Size(95, 15); + this.lblOverallStatus.TabIndex = 0; + this.lblOverallStatus.Text = "Overall Progress:"; + // + // lblCurrentStatus + // + this.lblCurrentStatus.AutoSize = true; + this.lblCurrentStatus.Location = new System.Drawing.Point(11, 11); + this.lblCurrentStatus.Name = "lblCurrentStatus"; + this.lblCurrentStatus.Size = new System.Drawing.Size(98, 15); + this.lblCurrentStatus.TabIndex = 0; + this.lblCurrentStatus.Text = "Current Progress:"; + // + // logTB + // + this.logTB.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.logTB.BorderStyle = System.Windows.Forms.BorderStyle.None; + this.logTB.Font = new System.Drawing.Font("Courier New", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.logTB.Location = new System.Drawing.Point(99, 128); + this.logTB.Multiline = true; + this.logTB.Name = "logTB"; + this.logTB.ReadOnly = true; + this.logTB.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; + this.logTB.Size = new System.Drawing.Size(790, 248); + this.logTB.TabIndex = 9; + // + // label14 + // + this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label14.AutoEllipsis = true; + this.label14.Location = new System.Drawing.Point(17, 64); + this.label14.Name = "label14"; + this.label14.Size = new System.Drawing.Size(977, 52); + this.label14.TabIndex = 8; + this.label14.Text = "This process will take several minutes; please be patient."; + // + // label15 + // + this.label15.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label15.AutoEllipsis = true; + this.label15.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label15.Location = new System.Drawing.Point(14, 12); + this.label15.Name = "label15"; + this.label15.Size = new System.Drawing.Size(980, 45); + this.label15.TabIndex = 7; + this.label15.Text = "Customizations in progress"; + // + // IsoSettingsPage + // + this.IsoSettingsPage.Controls.Add(this.DriverExportCombo); + this.IsoSettingsPage.Controls.Add(this.label13); + this.IsoSettingsPage.Controls.Add(this.UnattendCopyCB); + this.IsoSettingsPage.Controls.Add(this.ReportToolCB); + this.IsoSettingsPage.Controls.Add(this.label11); + this.IsoSettingsPage.Controls.Add(this.label12); + this.IsoSettingsPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsoSettingsPage.Location = new System.Drawing.Point(0, 0); + this.IsoSettingsPage.Name = "IsoSettingsPage"; + this.IsoSettingsPage.Size = new System.Drawing.Size(1008, 521); + this.IsoSettingsPage.TabIndex = 6; + // + // DriverExportCombo + // + this.DriverExportCombo.FormattingEnabled = true; + this.DriverExportCombo.Items.AddRange(new object[] { + "Don\'t export drivers", + "Export essential drivers (SCSI Adapters/Storage Controllers)", + "Export all drivers"}); + this.DriverExportCombo.Location = new System.Drawing.Point(83, 206); + this.DriverExportCombo.Name = "DriverExportCombo"; + this.DriverExportCombo.Size = new System.Drawing.Size(374, 23); + this.DriverExportCombo.TabIndex = 9; + this.DriverExportCombo.SelectedIndexChanged += new System.EventHandler(this.DriverExportCombo_SelectedIndexChanged); + // + // label13 + // + this.label13.AutoSize = true; + this.label13.Location = new System.Drawing.Point(80, 185); + this.label13.Name = "label13"; + this.label13.Size = new System.Drawing.Size(111, 15); + this.label13.TabIndex = 8; + this.label13.Text = "Driver export mode:"; + // + // UnattendCopyCB + // + this.UnattendCopyCB.AutoSize = true; + this.UnattendCopyCB.Location = new System.Drawing.Point(83, 158); + this.UnattendCopyCB.Name = "UnattendCopyCB"; + this.UnattendCopyCB.Size = new System.Drawing.Size(412, 19); + this.UnattendCopyCB.TabIndex = 7; + this.UnattendCopyCB.Text = "Make a copy of the unattended answer file that I can use on other images"; + this.UnattendCopyCB.UseVisualStyleBackColor = true; + this.UnattendCopyCB.CheckedChanged += new System.EventHandler(this.UnattendCopyCB_CheckedChanged); + // + // ReportToolCB + // + this.ReportToolCB.AutoSize = true; + this.ReportToolCB.Checked = true; + this.ReportToolCB.CheckState = System.Windows.Forms.CheckState.Checked; + this.ReportToolCB.Location = new System.Drawing.Point(83, 133); + this.ReportToolCB.Name = "ReportToolCB"; + this.ReportToolCB.Size = new System.Drawing.Size(218, 19); + this.ReportToolCB.TabIndex = 7; + this.ReportToolCB.Text = "Add a shortcut for the reporting tool"; + this.ReportToolCB.UseVisualStyleBackColor = true; + this.ReportToolCB.CheckedChanged += new System.EventHandler(this.ReportToolCB_CheckedChanged); + // + // label11 + // + this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label11.AutoEllipsis = true; + this.label11.Location = new System.Drawing.Point(17, 64); + this.label11.Name = "label11"; + this.label11.Size = new System.Drawing.Size(977, 52); + this.label11.TabIndex = 6; + this.label11.Text = "Configure additional settings for your customized image."; + // + // label12 + // + this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.label12.AutoEllipsis = true; + this.label12.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label12.Location = new System.Drawing.Point(14, 12); + this.label12.Name = "label12"; + this.label12.Size = new System.Drawing.Size(980, 45); + this.label12.TabIndex = 5; + this.label12.Text = "Specify additional settings for the image"; + // + // UserAccountsPage + // + this.UserAccountsPage.Controls.Add(this.panel1); + this.UserAccountsPage.Controls.Add(this.b64CB); + this.UserAccountsPage.Controls.Add(this.tableLayoutPanel2); + this.UserAccountsPage.Controls.Add(this.label5); + this.UserAccountsPage.Controls.Add(this.label4); + this.UserAccountsPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.UserAccountsPage.Location = new System.Drawing.Point(0, 0); + this.UserAccountsPage.Name = "UserAccountsPage"; + this.UserAccountsPage.Size = new System.Drawing.Size(1008, 521); + this.UserAccountsPage.TabIndex = 5; + // + // panel1 + // + this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.panel1.Controls.Add(this.tableLayoutPanel3); + this.panel1.Controls.Add(this.label8); + this.panel1.Location = new System.Drawing.Point(85, 254); + this.panel1.Name = "panel1"; + this.panel1.Size = new System.Drawing.Size(838, 236); + this.panel1.TabIndex = 7; + // + // tableLayoutPanel3 + // + this.tableLayoutPanel3.ColumnCount = 2; + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 47.61337F)); + this.tableLayoutPanel3.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 52.38663F)); this.tableLayoutPanel3.Controls.Add(this.panel3, 0, 1); this.tableLayoutPanel3.Controls.Add(this.pictureBox1, 1, 0); this.tableLayoutPanel3.Controls.Add(this.pictureBox2, 1, 1); @@ -609,6 +749,8 @@ private void InitializeComponent() // // tableLayoutPanel2 // + this.tableLayoutPanel2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); this.tableLayoutPanel2.ColumnCount = 3; this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 19.12799F)); this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 60.85919F)); @@ -651,6 +793,7 @@ private void InitializeComponent() // // usrNameTB // + this.usrNameTB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.usrNameTB.Dock = System.Windows.Forms.DockStyle.Fill; this.usrNameTB.Location = new System.Drawing.Point(163, 3); this.usrNameTB.MaxLength = 20; @@ -661,6 +804,7 @@ private void InitializeComponent() // // usrPasswordTB // + this.usrPasswordTB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; this.usrPasswordTB.Dock = System.Windows.Forms.DockStyle.Fill; this.usrPasswordTB.Location = new System.Drawing.Point(163, 32); this.usrPasswordTB.Name = "usrPasswordTB"; @@ -669,30 +813,6 @@ private void InitializeComponent() this.usrPasswordTB.TabIndex = 5; this.usrPasswordTB.TextChanged += new System.EventHandler(this.usrPasswordTB_TextChanged); // - // label5 - // - this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) - | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label5.AutoEllipsis = true; - this.label5.Location = new System.Drawing.Point(17, 64); - this.label5.Name = "label5"; - this.label5.Size = new System.Drawing.Size(977, 52); - this.label5.TabIndex = 4; - this.label5.Text = resources.GetString("label5.Text"); - // - // label4 - // - this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) - | System.Windows.Forms.AnchorStyles.Right))); - this.label4.AutoEllipsis = true; - this.label4.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label4.Location = new System.Drawing.Point(14, 12); - this.label4.Name = "label4"; - this.label4.Size = new System.Drawing.Size(980, 45); - this.label4.TabIndex = 3; - this.label4.Text = "Who will use the computer?"; - // // usrNameCurrentSysNameBtn // this.usrNameCurrentSysNameBtn.Dock = System.Windows.Forms.DockStyle.Fill; @@ -720,180 +840,180 @@ private void InitializeComponent() this.usrPasswordRevealCB.UseVisualStyleBackColor = true; this.usrPasswordRevealCB.CheckedChanged += new System.EventHandler(this.usrPasswordRevealCB_CheckedChanged); // - // IsoSettingsPage - // - this.IsoSettingsPage.Controls.Add(this.DriverExportCombo); - this.IsoSettingsPage.Controls.Add(this.label13); - this.IsoSettingsPage.Controls.Add(this.UnattendCopyCB); - this.IsoSettingsPage.Controls.Add(this.ReportToolCB); - this.IsoSettingsPage.Controls.Add(this.label11); - this.IsoSettingsPage.Controls.Add(this.label12); - this.IsoSettingsPage.Dock = System.Windows.Forms.DockStyle.Fill; - this.IsoSettingsPage.Location = new System.Drawing.Point(0, 0); - this.IsoSettingsPage.Name = "IsoSettingsPage"; - this.IsoSettingsPage.Size = new System.Drawing.Size(1008, 521); - this.IsoSettingsPage.TabIndex = 6; - // - // label11 + // label5 // - this.label11.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.label5.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.label11.AutoEllipsis = true; - this.label11.Location = new System.Drawing.Point(17, 64); - this.label11.Name = "label11"; - this.label11.Size = new System.Drawing.Size(977, 52); - this.label11.TabIndex = 6; - this.label11.Text = "Configure additional settings for your customized image."; + this.label5.AutoEllipsis = true; + this.label5.Location = new System.Drawing.Point(17, 64); + this.label5.Name = "label5"; + this.label5.Size = new System.Drawing.Size(977, 52); + this.label5.TabIndex = 4; + this.label5.Text = resources.GetString("label5.Text"); // - // label12 + // label4 // - this.label12.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.label4.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.label12.AutoEllipsis = true; - this.label12.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label12.Location = new System.Drawing.Point(14, 12); - this.label12.Name = "label12"; - this.label12.Size = new System.Drawing.Size(980, 45); - this.label12.TabIndex = 5; - this.label12.Text = "Specify additional settings for the image"; + this.label4.AutoEllipsis = true; + this.label4.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.label4.Location = new System.Drawing.Point(14, 12); + this.label4.Name = "label4"; + this.label4.Size = new System.Drawing.Size(980, 45); + this.label4.TabIndex = 3; + this.label4.Text = "Who will use the computer?"; // - // ReportToolCB + // IsoChooserPage // - this.ReportToolCB.AutoSize = true; - this.ReportToolCB.Checked = true; - this.ReportToolCB.CheckState = System.Windows.Forms.CheckState.Checked; - this.ReportToolCB.Location = new System.Drawing.Point(83, 133); - this.ReportToolCB.Name = "ReportToolCB"; - this.ReportToolCB.Size = new System.Drawing.Size(218, 19); - this.ReportToolCB.TabIndex = 7; - this.ReportToolCB.Text = "Add a shortcut for the reporting tool"; - this.ReportToolCB.UseVisualStyleBackColor = true; - this.ReportToolCB.CheckedChanged += new System.EventHandler(this.ReportToolCB_CheckedChanged); + this.IsoChooserPage.Controls.Add(this.isoExtractionPB); + this.IsoChooserPage.Controls.Add(this.isoPickerBtn); + this.IsoChooserPage.Controls.Add(this.isoPathTB); + this.IsoChooserPage.Controls.Add(this.lblExtractionStatus); + this.IsoChooserPage.Controls.Add(this.label1); + this.IsoChooserPage.Controls.Add(this.SysCheckPage_Description); + this.IsoChooserPage.Controls.Add(this.SysCheckPage_Header); + this.IsoChooserPage.Dock = System.Windows.Forms.DockStyle.Fill; + this.IsoChooserPage.Location = new System.Drawing.Point(0, 0); + this.IsoChooserPage.Name = "IsoChooserPage"; + this.IsoChooserPage.Size = new System.Drawing.Size(1008, 521); + this.IsoChooserPage.TabIndex = 1; + this.IsoChooserPage.Visible = false; // - // label13 + // isoExtractionPB // - this.label13.AutoSize = true; - this.label13.Location = new System.Drawing.Point(80, 185); - this.label13.Name = "label13"; - this.label13.Size = new System.Drawing.Size(111, 15); - this.label13.TabIndex = 8; - this.label13.Text = "Driver export mode:"; + this.isoExtractionPB.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.isoExtractionPB.Location = new System.Drawing.Point(125, 219); + this.isoExtractionPB.Name = "isoExtractionPB"; + this.isoExtractionPB.Size = new System.Drawing.Size(719, 23); + this.isoExtractionPB.TabIndex = 4; // - // DriverExportCombo + // isoPickerBtn // - this.DriverExportCombo.FormattingEnabled = true; - this.DriverExportCombo.Items.AddRange(new object[] { - "Don\'t export drivers", - "Export essential drivers (SCSI Adapters/Storage Controllers)", - "Export all drivers"}); - this.DriverExportCombo.Location = new System.Drawing.Point(83, 206); - this.DriverExportCombo.Name = "DriverExportCombo"; - this.DriverExportCombo.Size = new System.Drawing.Size(374, 23); - this.DriverExportCombo.TabIndex = 9; - this.DriverExportCombo.SelectedIndexChanged += new System.EventHandler(this.DriverExportCombo_SelectedIndexChanged); + this.isoPickerBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); + this.isoPickerBtn.FlatStyle = System.Windows.Forms.FlatStyle.System; + this.isoPickerBtn.Location = new System.Drawing.Point(769, 146); + this.isoPickerBtn.Name = "isoPickerBtn"; + this.isoPickerBtn.Size = new System.Drawing.Size(75, 23); + this.isoPickerBtn.TabIndex = 3; + this.isoPickerBtn.Text = "Browse..."; + this.isoPickerBtn.UseVisualStyleBackColor = true; + this.isoPickerBtn.Click += new System.EventHandler(this.isoPickerBtn_Click); // - // UnattendCopyCB + // isoPathTB // - this.UnattendCopyCB.AutoSize = true; - this.UnattendCopyCB.Location = new System.Drawing.Point(83, 158); - this.UnattendCopyCB.Name = "UnattendCopyCB"; - this.UnattendCopyCB.Size = new System.Drawing.Size(412, 19); - this.UnattendCopyCB.TabIndex = 7; - this.UnattendCopyCB.Text = "Make a copy of the unattended answer file that I can use on other images"; - this.UnattendCopyCB.UseVisualStyleBackColor = true; - this.UnattendCopyCB.CheckedChanged += new System.EventHandler(this.UnattendCopyCB_CheckedChanged); + this.isoPathTB.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.isoPathTB.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; + this.isoPathTB.Location = new System.Drawing.Point(125, 147); + this.isoPathTB.Name = "isoPathTB"; + this.isoPathTB.ReadOnly = true; + this.isoPathTB.Size = new System.Drawing.Size(638, 23); + this.isoPathTB.TabIndex = 2; + this.isoPathTB.TextChanged += new System.EventHandler(this.isoPathTB_TextChanged); // - // IsoCreationPage + // lblExtractionStatus // - this.IsoCreationPage.Controls.Add(this.pnlProgress); - this.IsoCreationPage.Controls.Add(this.logTB); - this.IsoCreationPage.Controls.Add(this.label14); - this.IsoCreationPage.Controls.Add(this.label15); - this.IsoCreationPage.Dock = System.Windows.Forms.DockStyle.Fill; - this.IsoCreationPage.Location = new System.Drawing.Point(0, 0); - this.IsoCreationPage.Name = "IsoCreationPage"; - this.IsoCreationPage.Size = new System.Drawing.Size(1008, 521); - this.IsoCreationPage.TabIndex = 7; + this.lblExtractionStatus.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblExtractionStatus.AutoEllipsis = true; + this.lblExtractionStatus.AutoSize = true; + this.lblExtractionStatus.Location = new System.Drawing.Point(122, 200); + this.lblExtractionStatus.Name = "lblExtractionStatus"; + this.lblExtractionStatus.Size = new System.Drawing.Size(243, 15); + this.lblExtractionStatus.TabIndex = 1; + this.lblExtractionStatus.Text = "Disc image extraction status will appear here."; // - // label14 + // label1 // - this.label14.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + this.label1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.label14.AutoEllipsis = true; - this.label14.Location = new System.Drawing.Point(17, 64); - this.label14.Name = "label14"; - this.label14.Size = new System.Drawing.Size(977, 52); - this.label14.TabIndex = 8; - this.label14.Text = "This process will take several minutes; please be patient."; + this.label1.AutoEllipsis = true; + this.label1.AutoSize = true; + this.label1.Location = new System.Drawing.Point(122, 128); + this.label1.Name = "label1"; + this.label1.Size = new System.Drawing.Size(68, 15); + this.label1.TabIndex = 1; + this.label1.Text = "Disc image:"; // - // label15 + // SysCheckPage_Description // - this.label15.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + this.SysCheckPage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.label15.AutoEllipsis = true; - this.label15.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.label15.Location = new System.Drawing.Point(14, 12); - this.label15.Name = "label15"; - this.label15.Size = new System.Drawing.Size(980, 45); - this.label15.TabIndex = 7; - this.label15.Text = "Customizations in progress"; + this.SysCheckPage_Description.AutoEllipsis = true; + this.SysCheckPage_Description.Location = new System.Drawing.Point(17, 64); + this.SysCheckPage_Description.Name = "SysCheckPage_Description"; + this.SysCheckPage_Description.Size = new System.Drawing.Size(977, 52); + this.SysCheckPage_Description.TabIndex = 1; + this.SysCheckPage_Description.Text = "Please specify the ISO that you want to use with this wizard. Supported operating" + + " systems are Windows 10 and Windows 11."; // - // logTB + // SysCheckPage_Header // - this.logTB.BorderStyle = System.Windows.Forms.BorderStyle.None; - this.logTB.Font = new System.Drawing.Font("Courier New", 11.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.logTB.Location = new System.Drawing.Point(99, 128); - this.logTB.Multiline = true; - this.logTB.Name = "logTB"; - this.logTB.ReadOnly = true; - this.logTB.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; - this.logTB.Size = new System.Drawing.Size(790, 248); - this.logTB.TabIndex = 9; + this.SysCheckPage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.SysCheckPage_Header.AutoEllipsis = true; + this.SysCheckPage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.SysCheckPage_Header.Location = new System.Drawing.Point(14, 12); + this.SysCheckPage_Header.Name = "SysCheckPage_Header"; + this.SysCheckPage_Header.Size = new System.Drawing.Size(980, 45); + this.SysCheckPage_Header.TabIndex = 0; + this.SysCheckPage_Header.Text = "Choose a disc image"; // - // pnlProgress + // WelcomePage // - this.pnlProgress.Controls.Add(this.pbOverall); - this.pnlProgress.Controls.Add(this.pbCurrent); - this.pnlProgress.Controls.Add(this.lblOverallStatus); - this.pnlProgress.Controls.Add(this.lblCurrentStatus); - this.pnlProgress.Location = new System.Drawing.Point(19, 405); - this.pnlProgress.Name = "pnlProgress"; - this.pnlProgress.Size = new System.Drawing.Size(971, 110); - this.pnlProgress.TabIndex = 10; + this.WelcomePage.Controls.Add(this.lblDisclaimer); + this.WelcomePage.Controls.Add(this.WelcomePage_Description); + this.WelcomePage.Controls.Add(this.WelcomePage_Header); + this.WelcomePage.Dock = System.Windows.Forms.DockStyle.Fill; + this.WelcomePage.Location = new System.Drawing.Point(0, 0); + this.WelcomePage.Name = "WelcomePage"; + this.WelcomePage.Size = new System.Drawing.Size(1008, 521); + this.WelcomePage.TabIndex = 0; // - // lblCurrentStatus + // lblDisclaimer // - this.lblCurrentStatus.AutoSize = true; - this.lblCurrentStatus.Location = new System.Drawing.Point(11, 11); - this.lblCurrentStatus.Name = "lblCurrentStatus"; - this.lblCurrentStatus.Size = new System.Drawing.Size(98, 15); - this.lblCurrentStatus.TabIndex = 0; - this.lblCurrentStatus.Text = "Current Progress:"; + this.lblDisclaimer.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.lblDisclaimer.AutoEllipsis = true; + this.lblDisclaimer.Location = new System.Drawing.Point(119, 128); + this.lblDisclaimer.Name = "lblDisclaimer"; + this.lblDisclaimer.Size = new System.Drawing.Size(770, 313); + this.lblDisclaimer.TabIndex = 1; // - // pbCurrent + // WelcomePage_Description // - this.pbCurrent.Location = new System.Drawing.Point(14, 30); - this.pbCurrent.Name = "pbCurrent"; - this.pbCurrent.Size = new System.Drawing.Size(941, 23); - this.pbCurrent.TabIndex = 1; + this.WelcomePage_Description.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) + | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.WelcomePage_Description.AutoEllipsis = true; + this.WelcomePage_Description.Location = new System.Drawing.Point(17, 64); + this.WelcomePage_Description.Name = "WelcomePage_Description"; + this.WelcomePage_Description.Size = new System.Drawing.Size(977, 52); + this.WelcomePage_Description.TabIndex = 1; + this.WelcomePage_Description.Text = "This wizard will help you configure your Windows image. To begin, click Next."; // - // lblOverallStatus + // WelcomePage_Header // - this.lblOverallStatus.AutoSize = true; - this.lblOverallStatus.Location = new System.Drawing.Point(11, 58); - this.lblOverallStatus.Name = "lblOverallStatus"; - this.lblOverallStatus.Size = new System.Drawing.Size(95, 15); - this.lblOverallStatus.TabIndex = 0; - this.lblOverallStatus.Text = "Overall Progress:"; + this.WelcomePage_Header.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.WelcomePage_Header.AutoEllipsis = true; + this.WelcomePage_Header.Font = new System.Drawing.Font("Segoe UI", 18F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.WelcomePage_Header.Location = new System.Drawing.Point(14, 12); + this.WelcomePage_Header.Name = "WelcomePage_Header"; + this.WelcomePage_Header.Size = new System.Drawing.Size(980, 45); + this.WelcomePage_Header.TabIndex = 0; + this.WelcomePage_Header.Text = "Welcome"; // - // pbOverall + // isoPickerOFD // - this.pbOverall.Location = new System.Drawing.Point(14, 77); - this.pbOverall.Name = "pbOverall"; - this.pbOverall.Size = new System.Drawing.Size(941, 23); - this.pbOverall.TabIndex = 1; + this.isoPickerOFD.Filter = "ISO Files|*.iso"; + this.isoPickerOFD.FileOk += new System.ComponentModel.CancelEventHandler(this.isoPickerOFD_FileOk); // // isoSaverSFD // @@ -904,10 +1024,6 @@ private void InitializeComponent() this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1008, 561); - this.Controls.Add(this.IsoCreationPage); - this.Controls.Add(this.IsoSettingsPage); - this.Controls.Add(this.UserAccountsPage); - this.Controls.Add(this.ImageChooserPage); this.Controls.Add(this.PageContainerPanel); this.Controls.Add(this.ButtonPanel); this.Font = new System.Drawing.Font("Segoe UI", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); @@ -920,12 +1036,18 @@ private void InitializeComponent() this.ButtonPanel.ResumeLayout(false); this.TableLayoutPanel1.ResumeLayout(false); this.PageContainerPanel.ResumeLayout(false); - this.IsoChooserPage.ResumeLayout(false); - this.IsoChooserPage.PerformLayout(); - this.WelcomePage.ResumeLayout(false); - this.FinishPanel.ResumeLayout(false); this.ImageChooserPage.ResumeLayout(false); this.ImageChooserPage.PerformLayout(); + this.FinishPage.ResumeLayout(false); + this.FinishPage.PerformLayout(); + this.panel4.ResumeLayout(false); + this.panel4.PerformLayout(); + this.IsoCreationPage.ResumeLayout(false); + this.IsoCreationPage.PerformLayout(); + this.pnlProgress.ResumeLayout(false); + this.pnlProgress.PerformLayout(); + this.IsoSettingsPage.ResumeLayout(false); + this.IsoSettingsPage.PerformLayout(); this.UserAccountsPage.ResumeLayout(false); this.UserAccountsPage.PerformLayout(); this.panel1.ResumeLayout(false); @@ -938,12 +1060,9 @@ private void InitializeComponent() this.panel2.PerformLayout(); this.tableLayoutPanel2.ResumeLayout(false); this.tableLayoutPanel2.PerformLayout(); - this.IsoSettingsPage.ResumeLayout(false); - this.IsoSettingsPage.PerformLayout(); - this.IsoCreationPage.ResumeLayout(false); - this.IsoCreationPage.PerformLayout(); - this.pnlProgress.ResumeLayout(false); - this.pnlProgress.PerformLayout(); + this.IsoChooserPage.ResumeLayout(false); + this.IsoChooserPage.PerformLayout(); + this.WelcomePage.ResumeLayout(false); this.ResumeLayout(false); } @@ -962,9 +1081,6 @@ private void InitializeComponent() internal System.Windows.Forms.Panel IsoChooserPage; internal System.Windows.Forms.Label SysCheckPage_Description; internal System.Windows.Forms.Label SysCheckPage_Header; - internal System.Windows.Forms.Panel FinishPanel; - internal System.Windows.Forms.Label FinishPage_Description; - internal System.Windows.Forms.Label FinishPage_Header; internal System.Windows.Forms.Label lblDisclaimer; internal System.Windows.Forms.Label label1; private System.Windows.Forms.Button isoPickerBtn; @@ -1020,5 +1136,14 @@ private void InitializeComponent() private System.Windows.Forms.Label lblCurrentStatus; private System.Windows.Forms.TextBox logTB; private System.Windows.Forms.SaveFileDialog isoSaverSFD; + private System.Windows.Forms.Panel FinishPage; + internal System.Windows.Forms.Label label16; + internal System.Windows.Forms.Label label17; + internal System.Windows.Forms.Label label18; + private System.Windows.Forms.LinkLabel lnkViewCreationLogs; + private System.Windows.Forms.LinkLabel lnkOpenIsoLoc; + private System.Windows.Forms.Panel panel4; + private System.Windows.Forms.LinkLabel lnkUseNtLite; + private System.Windows.Forms.LinkLabel lnkUseDT; } } \ No newline at end of file diff --git a/MicroWin/MainForm.cs b/MicroWin/MainForm.cs index 2ba6362..8aea14c 100755 --- a/MicroWin/MainForm.cs +++ b/MicroWin/MainForm.cs @@ -23,8 +23,6 @@ namespace MicroWin { public partial class MainForm : Form { - private Panel pnlContent; - private const string swStatus = "BETA"; private WizardPage CurrentWizardPage = new(); @@ -56,20 +54,22 @@ private void SetColorMode() } // Change colors of other components. I want consistency - // TODO Add remaining controls + isoPathTB.BackColor = BackColor; + isoPathTB.ForeColor = ForeColor; + lvVersions.BackColor = BackColor; + lvVersions.ForeColor = ForeColor; + usrNameTB.BackColor = BackColor; + usrNameTB.ForeColor = ForeColor; + usrPasswordTB.BackColor = BackColor; + usrPasswordTB.ForeColor = ForeColor; + DriverExportCombo.BackColor = BackColor; + DriverExportCombo.ForeColor = ForeColor; logTB.BackColor = BackColor; logTB.ForeColor = ForeColor; WindowHelper.ToggleDarkTitleBar(Handle, colorVal == 0); } - public void ShowPage(UserControl page) - { - pnlContent.Controls.Clear(); - page.Dock = DockStyle.Fill; - pnlContent.Controls.Add(page); - } - private void ChangePage(WizardPage.Page newPage) { DynaLog.logMessage("Changing current page of the wizard..."); @@ -87,6 +87,7 @@ private void ChangePage(WizardPage.Page newPage) UserAccountsPage.Visible = newPage == WizardPage.Page.UserAccountsPage; IsoSettingsPage.Visible = newPage == WizardPage.Page.IsoSettingsPage; IsoCreationPage.Visible = newPage == WizardPage.Page.IsoCreationPage; + FinishPage.Visible = newPage == WizardPage.Page.FinishPage; CurrentWizardPage.wizardPage = newPage; @@ -101,7 +102,9 @@ private void ChangePage(WizardPage.Page newPage) Next_Button.Enabled = !(newPage != WizardPage.Page.FinishPage) || !((int)newPage + 1 >= WizardPage.PageCount); Cancel_Button.Enabled = !(newPage == WizardPage.Page.FinishPage); Back_Button.Enabled = !(newPage == WizardPage.Page.WelcomePage) && !(newPage == WizardPage.Page.FinishPage); - ButtonPanel.Visible = !(newPage > WizardPage.Page.IsoSettingsPage); + ButtonPanel.Visible = !(newPage == WizardPage.Page.IsoCreationPage); + + Next_Button.Text = newPage == WizardPage.Page.FinishPage ? "Close" : "Next"; if (CurrentWizardPage.wizardPage == WizardPage.Page.IsoCreationPage) { @@ -155,7 +158,6 @@ private bool VerifyOptionsInPage(WizardPage.Page wizardPage) private void MainForm_Load(object sender, EventArgs e) { Text = $"MicroWin .NET ({swStatus} 0.2)"; - pnlContent = new Panel { Dock = DockStyle.Fill }; string disclaimerMessage = $"Thank you for trying this {swStatus} release of MicroWin .NET.\n\n" + $"Because this is a prerelease version of a rewrite of the original PowerShell version, bugs may happen. We expect improvements in quality " + @@ -172,7 +174,6 @@ private void MainForm_Load(object sender, EventArgs e) ChangePage(WizardPage.Page.WelcomePage); SetColorMode(); - pnlContent.BringToFront(); // Insert an item in there so we can work with it AppState.UserAccounts.Add(new UserAccount() { Role = "Administrator" }); @@ -266,6 +267,9 @@ private async void isoPathTB_TextChanged(object sender, EventArgs e) isoPickerBtn.Enabled = false; AppState.IsoPath = isoPathTB.Text; + ButtonPanel.Enabled = false; + WindowHelper.DisableCloseCapability(Handle); + await Task.Run(() => { var iso = new IsoManager(); InvokeIsoExtractionUIUpdate("Mounting ISO...", 5); @@ -285,6 +289,9 @@ await Task.Run(() => { InvokeIsoExtractionUIUpdate("Extraction complete. Click Next to continue.", 100); }); isoPickerBtn.Enabled = true; + + ButtonPanel.Enabled = true; + WindowHelper.EnableCloseCapability(Handle); } } @@ -408,6 +415,8 @@ MicroWin .NET (BETA 0.2) "; + WindowHelper.DisableCloseCapability(Handle); + await Task.Run(async () => { string installwimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); if (!File.Exists(installwimPath)) installwimPath = Path.Combine(AppState.MountPath, "sources", "install.esd"); @@ -417,16 +426,18 @@ await Task.Run(async () => { UpdateCurrentStatus("Mounting install image..."); DismManager.MountImage(installwimPath, AppState.SelectedImageIndex, AppState.ScratchPath, (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); + WriteLogMessage("Creating unattended answer file..."); UnattendGenerator.CreateUnattend($"{Path.Combine(AppState.ScratchPath, "Windows", "Panther")}"); UpdateOverallProgressBar(10); - new OsFeatureDisabler().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false)); + new OsFeatureDisabler().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false), (msg) => WriteLogMessage(msg)); UpdateOverallProgressBar(20); - new OsPackageRemover().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false)); + new OsPackageRemover().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false), (msg) => WriteLogMessage(msg)); UpdateOverallProgressBar(30); - new StoreAppRemover().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false)); + new StoreAppRemover().RunTask((p) => UpdateCurrentProgressBar(p), (msg) => UpdateCurrentStatus(msg, false), (msg) => WriteLogMessage(msg)); UpdateOverallProgressBar(40); + WriteLogMessage("Loading image registry hives..."); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); @@ -435,6 +446,7 @@ await Task.Run(async () => { UpdateCurrentStatus("Modifying install image..."); if (AppState.AddReportingToolShortcut) { + WriteLogMessage("Downloading and integrating reporting tool..."); using (var client = new HttpClient()) { var data = await client.GetByteArrayAsync("https://raw.githubusercontent.com/CodingWonders/MyScripts/refs/heads/main/MicroWinHelperTools/ReportingTool/ReportingTool.ps1"); @@ -448,11 +460,14 @@ await Task.Run(async () => { } UpdateCurrentProgressBar(10); + WriteLogMessage("Disabling WPBT..."); RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\ControlSet001\\Control\\Session Manager", new RegistryItem("DisableWpbtExecution", ValueKind.REG_DWORD, 1)); // Skip first logon animation + WriteLogMessage("Disabling FLA..."); RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", new RegistryItem("EnableFirstLogonAnimation", ValueKind.REG_DWORD, 0)); + WriteLogMessage("Setting execution policies..."); RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell", new RegistryItem("ExecutionPolicy", ValueKind.REG_SZ, "RemoteSigned")); // int majorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMajorVersionNumber")); @@ -488,6 +503,7 @@ await Task.Run(async () => { } UpdateCurrentProgressBar(90); + WriteLogMessage("Unloading image registry hives..."); RegistryHelper.UnloadRegistryHive("zSYSTEM"); RegistryHelper.UnloadRegistryHive("zSOFTWARE"); RegistryHelper.UnloadRegistryHive("zDEFAULT"); @@ -507,12 +523,14 @@ await Task.Run(async () => { DismManager.MountImage(bootwimPath, 2, AppState.ScratchPath, (p) => UpdateCurrentProgressBar(p), (msg) => WriteLogMessage(msg)); UpdateCurrentStatus("Modifying WinPE registry..."); + WriteLogMessage("Loading image registry hives..."); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SOFTWARE"), "zSOFTWARE"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "SYSTEM"), "zSYSTEM"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Windows", "System32", "config", "default"), "zDEFAULT"); RegistryHelper.LoadRegistryHive(Path.Combine(AppState.ScratchPath, "Users", "Default", "ntuser.dat"), "zNTUSER"); UpdateCurrentProgressBar(50); + WriteLogMessage("Bypassing requirements..."); RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); RegistryHelper.AddRegistryItem("HKLM\\zDEFAULT\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV2", ValueKind.REG_DWORD, 0)); RegistryHelper.AddRegistryItem("HKLM\\zNTUSER\\Control Panel\\UnsupportedHardwareNotificationCache", new RegistryItem("SV1", ValueKind.REG_DWORD, 0)); @@ -526,9 +544,11 @@ await Task.Run(async () => { RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\Status\\ChildCompletion", new RegistryItem("setup.exe", ValueKind.REG_DWORD, 3)); UpdateCurrentProgressBar(75); + WriteLogMessage("Imposing old Setup..."); RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup", new RegistryItem("CmdLine", ValueKind.REG_SZ, "\\sources\\setup.exe")); UpdateCurrentProgressBar(95); + WriteLogMessage("Unloading image registry hives..."); RegistryHelper.UnloadRegistryHive("zSYSTEM"); RegistryHelper.UnloadRegistryHive("zSOFTWARE"); RegistryHelper.UnloadRegistryHive("zDEFAULT"); @@ -542,16 +562,35 @@ await Task.Run(async () => { UpdateCurrentStatus("Generating ISO file..."); OscdimgUtilities.checkoscdImg(); - Console.Write(AppState.SaveISO); - + UpdateOverallStatus("Finishing up..."); + UpdateOverallProgressBar(95); + UpdateCurrentStatus("Finishing up..."); + WriteLogMessage("Deleting temporary files..."); DeleteFiles.SafeDeleteDirectory(AppState.TempRoot); }); + WindowHelper.EnableCloseCapability(Handle); + WriteLogMessage("Finished."); UpdateCurrentStatus("Generation complete"); UpdateOverallProgressBar(100); UpdateCurrentProgressBar(100); - MessageBox.Show("Generation Complete."); - Close(); + ChangePage(WizardPage.Page.FinishPage); + } + + private void lnkUseDT_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("https://github.com/CodingWonders/DISMTools"); + } + + private void lnkUseNtLite_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start("https://ntlite.com"); + } + + private void lnkOpenIsoLoc_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e) + { + Process.Start(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe"), + $"/select,\"{AppState.SaveISO}\""); } } } \ No newline at end of file diff --git a/MicroWin/MainForm.resx b/MicroWin/MainForm.resx index f417c40..1d00b7b 100644 --- a/MicroWin/MainForm.resx +++ b/MicroWin/MainForm.resx @@ -117,15 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Sysprep will be launched and will perform the final steps. This will take some time. After this is complete, use one of the buttons below to either close this wizard, or relaunch Sysprep if it failed to prepare your computer. + + To continue with OS installation, use a tool to create bootable USB drives, such as Rufus or Ventoy, and install the system. + +If you want to continue customizing this system, use either of the following: - - 17, 17 - Enter the information that will be used to create the first user account on the target system. Additional users can be created later. You can skip entering this information. In that case, default values will be used. + + 17, 17 + 141, 17 diff --git a/MicroWin/functions/dism/DismManager.cs b/MicroWin/functions/dism/DismManager.cs index 4d876ca..b83f672 100755 --- a/MicroWin/functions/dism/DismManager.cs +++ b/MicroWin/functions/dism/DismManager.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Linq; +using System.Reflection; namespace MicroWin.functions.dism { @@ -128,6 +129,7 @@ public static DismImageInfoCollection GetImageInformation(string wimFile) public static void UnmountAndSave(string mountPath, Action progress, Action logMessage) { + logMessage.Invoke($"Preparing to unmount image..."); if (!Directory.Exists(mountPath)) { // TODO log this; we immediately return if it doesn't exist. @@ -145,6 +147,7 @@ public static void UnmountAndSave(string mountPath, Action progress, Action { DismApi.Initialize(DismLogLevel.LogErrors); + logMessage.Invoke($"Saving and unmounting image..."); DismProgressCallback progressCallback = (currentProgress) => { int scaledProgress = (currentProgress.Current / 2); diff --git a/MicroWin/functions/dism/ImageModificationTask.cs b/MicroWin/functions/dism/ImageModificationTask.cs index a47d227..51bdd76 100644 --- a/MicroWin/functions/dism/ImageModificationTask.cs +++ b/MicroWin/functions/dism/ImageModificationTask.cs @@ -10,6 +10,6 @@ public abstract class ImageModificationTask { public virtual List excludedItems { get; protected set; } = []; - public abstract void RunTask(Action pbReporter, Action curOpReporter); + public abstract void RunTask(Action pbReporter, Action curOpReporter, Action logWriter); } } diff --git a/MicroWin/functions/dism/OsFeatureDisabler.cs b/MicroWin/functions/dism/OsFeatureDisabler.cs index 5f0ea5b..de4ea96 100644 --- a/MicroWin/functions/dism/OsFeatureDisabler.cs +++ b/MicroWin/functions/dism/OsFeatureDisabler.cs @@ -25,24 +25,28 @@ public override List excludedItems { "RemoteDesktop" ]; - public override void RunTask(Action pbReporter, Action curOpReporter) + public override void RunTask(Action pbReporter, Action curOpReporter, Action logWriter) { - DisableFeatures(pbReporter, curOpReporter); + DisableFeatures(pbReporter, curOpReporter, logWriter); } - private void DisableFeatures(Action pbReporter, Action curOpReporter) + private void DisableFeatures(Action pbReporter, Action curOpReporter, Action logWriter) { curOpReporter.Invoke("Getting image features..."); DismFeatureCollection allFeatures = GetFeatureList(); if (allFeatures is null) return; + logWriter.Invoke($"Amount of features in image: {allFeatures.Count}"); + curOpReporter.Invoke("Filtering image features..."); IEnumerable featuresToDisable = allFeatures .Where(feature => ! new DismPackageFeatureState[3] { DismPackageFeatureState.NotPresent, DismPackageFeatureState.UninstallPending, DismPackageFeatureState.Staged }.Contains(feature.State)) .Select(feature => feature.FeatureName) .Where(feature => !excludedItems.Any(entry => feature.IndexOf(entry, StringComparison.OrdinalIgnoreCase) >= 0)); + logWriter.Invoke($"Features to disable: {featuresToDisable.Count()}"); + try { DismApi.Initialize(DismLogLevel.LogErrors); @@ -58,6 +62,7 @@ private void DisableFeatures(Action pbReporter, Action curOpReporte } catch (Exception ex) { + logWriter.Invoke($"Feature {featureToDisable} could not be disabled: {ex.Message}"); DynaLog.logMessage($"ERROR: Failed to disable {featureToDisable}: {ex.Message}"); } idx++; diff --git a/MicroWin/functions/dism/OsPackageRemover.cs b/MicroWin/functions/dism/OsPackageRemover.cs index 2012b3e..e2b65b0 100644 --- a/MicroWin/functions/dism/OsPackageRemover.cs +++ b/MicroWin/functions/dism/OsPackageRemover.cs @@ -35,22 +35,26 @@ public override List excludedItems "PMCPPC" ]; - public override void RunTask(Action pbReporter, Action curOpReporter) + public override void RunTask(Action pbReporter, Action curOpReporter, Action logWriter) { - RemoveUnwantedPackages(pbReporter, curOpReporter); + RemoveUnwantedPackages(pbReporter, curOpReporter, logWriter); } - private void RemoveUnwantedPackages(Action pbReporter, Action curOpReporter) + private void RemoveUnwantedPackages(Action pbReporter, Action curOpReporter, Action logWriter) { curOpReporter.Invoke("Getting image packages..."); DismPackageCollection allPackages = GetPackageList(); if (allPackages is null) return; + logWriter.Invoke($"Amount of packages in image: {allPackages.Count}"); + curOpReporter.Invoke("Filtering image packages..."); IEnumerable packagesToRemove = allPackages.Select(pkg => pkg.PackageName).Where(pkg => !excludedItems.Any(entry => pkg.IndexOf(entry, StringComparison.OrdinalIgnoreCase) >= 0)); + logWriter.Invoke($"Packages to remove: {packagesToRemove.Count()}"); + try { DismApi.Initialize(DismLogLevel.LogErrors); @@ -67,6 +71,7 @@ private void RemoveUnwantedPackages(Action pbReporter, Action curOp } catch (Exception ex) { + logWriter.Invoke($"Package {packageToRemove} could not be removed: {ex.Message}"); DynaLog.logMessage($"ERROR: Failed to remove {packageToRemove}: {ex.Message}"); } idx++; diff --git a/MicroWin/functions/dism/StoreAppRemover.cs b/MicroWin/functions/dism/StoreAppRemover.cs index fffaccc..ee0b0b2 100644 --- a/MicroWin/functions/dism/StoreAppRemover.cs +++ b/MicroWin/functions/dism/StoreAppRemover.cs @@ -33,21 +33,25 @@ public override List excludedItems { "CrossDevice" ]; - public override void RunTask(Action pbReporter, Action curOpReporter) + public override void RunTask(Action pbReporter, Action curOpReporter, Action logWriter) { - RemoveStoreApps(pbReporter, curOpReporter); + RemoveStoreApps(pbReporter, curOpReporter, logWriter); } - private void RemoveStoreApps(Action pbReporter, Action curOpReporter) + private void RemoveStoreApps(Action pbReporter, Action curOpReporter, Action logWriter) { curOpReporter.Invoke("Getting image AppX packages..."); DismAppxPackageCollection allStoreApps = GetStoreAppsList(); if (allStoreApps is null) return; + logWriter.Invoke($"Amount of AppX packages in image: {allStoreApps.Count}"); + curOpReporter.Invoke("Filtering image AppX packages..."); IEnumerable appsToRemove = allStoreApps.Select(appx => appx.PackageName).Where(appx => !excludedItems.Any(entry => appx.IndexOf(entry, StringComparison.OrdinalIgnoreCase) >= 0)); + logWriter.Invoke($"AppX packages to remove: {appsToRemove.Count()}"); + try { DismApi.Initialize(DismLogLevel.LogErrors); @@ -63,6 +67,7 @@ private void RemoveStoreApps(Action pbReporter, Action curOpReporte } catch (Exception ex) { + logWriter.Invoke($"AppX package {appToRemove} could not be removed: {ex.Message}"); DynaLog.logMessage($"ERROR: Failed to remove {appToRemove}: {ex.Message}"); } idx++; diff --git a/MicroWin/functions/dism/UnattendGenerator.cs b/MicroWin/functions/dism/UnattendGenerator.cs index 8dc0745..4b454bd 100755 --- a/MicroWin/functions/dism/UnattendGenerator.cs +++ b/MicroWin/functions/dism/UnattendGenerator.cs @@ -9,6 +9,8 @@ public class UnattendGenerator { public static void CreateUnattend(string destinationPath) { + // TODO Condition the specialize pass to filter out components that don't exist on Windows 10. + StringBuilder xml = new StringBuilder(); xml.AppendLine(""); xml.AppendLine(""); @@ -91,7 +93,26 @@ public static void CreateUnattend(string destinationPath) foreach (var user in AppState.UserAccounts) { xml.AppendLine(" "); - xml.AppendLine($" {user.Password}true</PlainText></Password>"); + xml.AppendLine($" <Password>"); + // Determine if we need to encode the password with base64. If we need to, we must append + // "Password" to the actual password; otherwise Setup/oobeSystem will fail. Base64 encoding is the only + // way Microsoft provides in order to hide sensitive info. + // https://learn.microsoft.com/en-us/windows-hardware/customize/desktop/wsim/hide-sensitive-data-in-an-answer-file + if (AppState.EncodeWithB64) + { + string b64pass = Convert.ToBase64String(System.Text.Encoding.Unicode.GetBytes($"{user.Password}Password")); + xml.AppendLine($" <Value>{b64pass}</Value>"); + xml.AppendLine($" <PlainText>false</PlainText>"); +#pragma warning disable IDE0059 + b64pass = ""; +#pragma warning restore IDE0059 + } + else + { + xml.AppendLine($" <Value>{user.Password}</Value>"); + xml.AppendLine($" <PlainText>true</PlainText>"); + } + xml.AppendLine($" </Password>"); xml.AppendLine($" <Name>{user.Name}</Name>"); xml.AppendLine($" <Group>{(user.Role == "Administrator" ? "Administrators" : "Users")}</Group>"); xml.AppendLine(" </LocalAccount>"); @@ -136,7 +157,19 @@ public static void CreateUnattend(string destinationPath) if (!Directory.Exists(destinationPath)) Directory.CreateDirectory(destinationPath); - File.WriteAllText(Path.Combine(destinationPath, "unattend.xml"), xml.ToString()); + string destXml = Path.Combine(destinationPath, "unattend.xml"); + + File.WriteAllText(destXml, xml.ToString()); + + if (AppState.CopyUnattendToFileSystem) + { + try + { + DynaLog.logMessage("Answer file will also be copied to the root of the system drive..."); + File.Copy(destXml, $"{Environment.GetEnvironmentVariable("SYSTEMDRIVE")}\\unattend.xml", true); + } + catch { } + } } catch (Exception ex) { From 0010a612cacad0b5632c0d20b49572296e2c055e Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Thu, 19 Feb 2026 10:06:55 +0100 Subject: [PATCH 6/7] Use DPI-based scaling; prevent closure during long-running operations --- MicroWin/MainForm.Designer.cs | 6 ++++-- MicroWin/MainForm.cs | 24 +++++++++++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/MicroWin/MainForm.Designer.cs b/MicroWin/MainForm.Designer.cs index d8f98d4..1f5bd67 100755 --- a/MicroWin/MainForm.Designer.cs +++ b/MicroWin/MainForm.Designer.cs @@ -1021,8 +1021,8 @@ private void InitializeComponent() // // MainForm // - this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.AutoScaleDimensions = new System.Drawing.SizeF(96F, 96F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Dpi; this.ClientSize = new System.Drawing.Size(1008, 561); this.Controls.Add(this.PageContainerPanel); this.Controls.Add(this.ButtonPanel); @@ -1032,7 +1032,9 @@ private void InitializeComponent() this.Name = "MainForm"; this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen; this.Text = "MicroWin .NET"; + this.FormClosing += new System.Windows.Forms.FormClosingEventHandler(this.MainForm_FormClosing); this.Load += new System.EventHandler(this.MainForm_Load); + this.SizeChanged += new System.EventHandler(this.MainForm_SizeChanged); this.ButtonPanel.ResumeLayout(false); this.TableLayoutPanel1.ResumeLayout(false); this.PageContainerPanel.ResumeLayout(false); diff --git a/MicroWin/MainForm.cs b/MicroWin/MainForm.cs index 8aea14c..588b5c0 100755 --- a/MicroWin/MainForm.cs +++ b/MicroWin/MainForm.cs @@ -32,6 +32,8 @@ public partial class MainForm : Form WizardPage.Page.UserAccountsPage ]; + private bool BusyCannotClose = false; + public MainForm() { InitializeComponent(); @@ -266,6 +268,7 @@ private async void isoPathTB_TextChanged(object sender, EventArgs e) { isoPickerBtn.Enabled = false; AppState.IsoPath = isoPathTB.Text; + BusyCannotClose = true; ButtonPanel.Enabled = false; WindowHelper.DisableCloseCapability(Handle); @@ -289,7 +292,7 @@ await Task.Run(() => { InvokeIsoExtractionUIUpdate("Extraction complete. Click Next to continue.", 100); }); isoPickerBtn.Enabled = true; - + BusyCannotClose = false; ButtonPanel.Enabled = true; WindowHelper.EnableCloseCapability(Handle); } @@ -416,6 +419,7 @@ MicroWin .NET (BETA 0.2) "; WindowHelper.DisableCloseCapability(Handle); + BusyCannotClose = true; await Task.Run(async () => { string installwimPath = Path.Combine(AppState.MountPath, "sources", "install.wim"); @@ -574,6 +578,7 @@ await Task.Run(async () => { UpdateCurrentStatus("Generation complete"); UpdateOverallProgressBar(100); UpdateCurrentProgressBar(100); + BusyCannotClose = false; ChangePage(WizardPage.Page.FinishPage); } @@ -592,5 +597,22 @@ private void lnkOpenIsoLoc_LinkClicked(object sender, LinkLabelLinkClickedEventA Process.Start(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe"), $"/select,\"{AppState.SaveISO}\""); } + + private void MainForm_SizeChanged(object sender, EventArgs e) + { + if (BusyCannotClose) + WindowHelper.DisableCloseCapability(Handle); + else + WindowHelper.EnableCloseCapability(Handle); + } + + private void MainForm_FormClosing(object sender, FormClosingEventArgs e) + { + if (BusyCannotClose) + { + e.Cancel = true; + return; + } + } } } \ No newline at end of file From 83f8901afbcecbb1e40cacadc22663e97c06659b Mon Sep 17 00:00:00 2001 From: CodingWonders <101426328+CodingWonders@users.noreply.github.com> Date: Thu, 19 Feb 2026 18:03:48 +0100 Subject: [PATCH 7/7] Add new version checker framework to do things based on the image version --- MicroWin/MainForm.cs | 53 ++++++++++--------- MicroWin/MicroWin.csproj | 1 + .../PropertyCheckers/VersionComparer.cs | 34 ++++++++++++ 3 files changed, 64 insertions(+), 24 deletions(-) create mode 100644 MicroWin/functions/Helpers/PropertyCheckers/VersionComparer.cs diff --git a/MicroWin/MainForm.cs b/MicroWin/MainForm.cs index 588b5c0..bbb332e 100755 --- a/MicroWin/MainForm.cs +++ b/MicroWin/MainForm.cs @@ -5,6 +5,7 @@ using MicroWin.functions.Helpers.DeleteFile; using MicroWin.functions.Helpers.DesktopWindowManager; using MicroWin.functions.Helpers.Loggers; +using MicroWin.functions.Helpers.PropertyCheckers; using MicroWin.functions.Helpers.RegistryHelpers; using MicroWin.functions.iso; using MicroWin.functions.UI; @@ -33,6 +34,9 @@ public partial class MainForm : Form ]; private bool BusyCannotClose = false; + private DismImageInfoCollection imageInfo; + + private DismImageInfo installImageInfo; public MainForm() { @@ -137,6 +141,8 @@ private bool VerifyOptionsInPage(WizardPage.Page wizardPage) MessageBox.Show("Please specify an image to modify and try again."); return false; } + // Store information about the selected image only. We can access it later if we see fit + installImageInfo = imageInfo.ElementAtOrDefault(AppState.SelectedImageIndex - 1); break; case WizardPage.Page.UserAccountsPage: // Default to "User" if no name is set @@ -236,7 +242,7 @@ private void LoadWimData() if (File.Exists(wimPath)) { - DismImageInfoCollection imageInfo = DismManager.GetImageInformation(wimPath); + imageInfo = DismManager.GetImageInformation(wimPath); if (imageInfo is null) return; @@ -474,26 +480,11 @@ await Task.Run(async () => { WriteLogMessage("Setting execution policies..."); RegistryHelper.AddRegistryItem("HKLM\\zSOFTWARE\\Microsoft\\PowerShell\\1\\ShellIds\\Microsoft.PowerShell", new RegistryItem("ExecutionPolicy", ValueKind.REG_SZ, "RemoteSigned")); - // int majorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMajorVersionNumber")); - // int minorver = Convert.ToInt32(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentMinorVersionNumber")); - // string build = Convert.ToString(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "CurrentBuild")); - // string ubr = Convert.ToString(RegistryHelper.QueryRegistryValue("HKLM\\zSOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "UBR")); - - //if (majorver == 10 && minorver == 0 && build == "26100" && ubr == "1") - //{ - //try - //{ - //DismApi.Initialize(DismLogLevel.LogErrors); - //using DismSession session = DismApi.OpenOfflineSession(AppState.ScratchPath); - - //DismApi.EnableFeature(session, "Recall", false, true); - //DismApi.Shutdown(); - //} - //catch - //{ - // Add logging - //} - //} + if (VersionComparer.IsBetweenVersionRange(installImageInfo.ProductVersion, VersionComparer.VERCONST_WIN11_24H2, VersionComparer.VERCONST_WIN11_25H2)) + { + // TODO for now this is here only to show if the image is within that version range. Add the code to add AppRuntime.CBS as a dependency of FileExp. + WriteLogMessage("TEST: Touching up fileexp..."); + } UpdateCurrentProgressBar(50); using (var client = new HttpClient()) @@ -547,9 +538,23 @@ await Task.Run(async () => { RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\MoSetup", new RegistryItem("AllowUpgradesWithUnsupportedTPMOrCPU", ValueKind.REG_DWORD, 1)); RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup\\Status\\ChildCompletion", new RegistryItem("setup.exe", ValueKind.REG_DWORD, 3)); - UpdateCurrentProgressBar(75); - WriteLogMessage("Imposing old Setup..."); - RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup", new RegistryItem("CmdLine", ValueKind.REG_SZ, "\\sources\\setup.exe")); + // Old Setup should only be imposed on 24H2 and later (builds 26040 and later). Get this information + bool shouldUsePanther = false; + + DismImageInfoCollection bootImageInfo = DismManager.GetImageInformation(bootwimPath); + if (bootImageInfo is not null) + { + // Get the second index then get version + DismImageInfo setupImage = bootImageInfo.ElementAtOrDefault(1); + shouldUsePanther = VersionComparer.IsNewerThanVersion(setupImage?.ProductVersion, new(10, 0, 26040, 0)); + } + + if (shouldUsePanther) + { + UpdateCurrentProgressBar(75); + WriteLogMessage("Imposing old Setup..."); + RegistryHelper.AddRegistryItem("HKLM\\zSYSTEM\\Setup", new RegistryItem("CmdLine", ValueKind.REG_SZ, "\\sources\\setup.exe")); + } UpdateCurrentProgressBar(95); WriteLogMessage("Unloading image registry hives..."); diff --git a/MicroWin/MicroWin.csproj b/MicroWin/MicroWin.csproj index 0106d3c..f40cb09 100755 --- a/MicroWin/MicroWin.csproj +++ b/MicroWin/MicroWin.csproj @@ -90,6 +90,7 @@ <Compile Include="functions\Helpers\DeleteFiles\DeleteFile.cs" /> <Compile Include="functions\Helpers\DesktopWindowManager\WindowHelper.cs" /> <Compile Include="functions\Helpers\DynaLog\DynaLog.cs" /> + <Compile Include="functions\Helpers\PropertyCheckers\VersionComparer.cs" /> <Compile Include="functions\Helpers\RegistryHelpers\RegistryHelper.cs" /> <Compile Include="functions\Helpers\RegistryHelpers\RegistryItem.cs" /> <Compile Include="functions\Helpers\RegistryHelpers\ValueKind.cs" /> diff --git a/MicroWin/functions/Helpers/PropertyCheckers/VersionComparer.cs b/MicroWin/functions/Helpers/PropertyCheckers/VersionComparer.cs new file mode 100644 index 0000000..840d6c4 --- /dev/null +++ b/MicroWin/functions/Helpers/PropertyCheckers/VersionComparer.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace MicroWin.functions.Helpers.PropertyCheckers +{ + public static class VersionComparer + { + public static readonly Version VERCONST_WIN10_22H2 = new(10, 0, 19045, 2130); + public static readonly Version VERCONST_WIN11_21H2 = new(10, 0, 22000, 194); + public static readonly Version VERCONST_WIN11_22H2 = new(10, 0, 22621, 382); + public static readonly Version VERCONST_WIN11_23H2 = new(10, 0, 22631, 2428); + public static readonly Version VERCONST_WIN11_24H2 = new(10, 0, 26100, 1742); + public static readonly Version VERCONST_WIN11_25H2 = new(10, 0, 26200, 6584); + public static readonly Version VERCONST_WIN11_26H1 = new(10, 0, 28000, 1575); + + public static bool IsNewerThanVersion(Version versionToCompare, Version minimumThreshold) + { + return versionToCompare >= minimumThreshold; + } + + public static bool IsOlderThanVersion(Version versionToCompare, Version maximumThreshold) + { + return versionToCompare < maximumThreshold; + } + + public static bool IsBetweenVersionRange(Version versionToCompare, Version lowerBound, Version upperBound) + { + return (versionToCompare >= lowerBound) && (versionToCompare < upperBound); + } + } +}