Compare commits

...

15 Commits

Author SHA1 Message Date
Sean (ANGRYxScotsman)
a30664002b added doc link to settings menu (#4156) 2026-03-06 08:29:20 -06:00
Chris Titus
5e78391518 chore: Update generated dev docs (#4163) 2026-03-06 08:29:10 -06:00
Sean (ANGRYxScotsman)
2d2497408f Website updated to latest version (#4157)
* updated theme to latest version

* updated tabs to the new way

* added missing frontmatter to pages

* updated hugo version

* edited the file structure

* revert back to old way

* Update _index.md

* fix typo and made sure it was upto date

* updated docs

* clean up navbar

* Update en.yaml
2026-03-06 08:28:34 -06:00
Gabi
d2dbf03572 Update Invoke-WPFFixesWinget.ps1 (#4160) 2026-03-05 16:39:50 -06:00
Chris Titus
88c68fd411 update bug report 2026-03-04 15:50:00 -06:00
Chris Titus
e82aaf03f0 update bug report 2026-03-04 15:46:18 -06:00
Chris Titus
9a77fed09b minimize feature request template 2026-03-04 15:29:48 -06:00
Chris Titus
336ac6fb8f remove key flag from unattended (#4154) 2026-03-04 15:14:16 -06:00
Gabi
72ad35bbd8 Remove product key from autounattend.xml (#4152) 2026-03-04 12:26:53 -06:00
Chris Titus
df17ca4695 Fix offline mode (#4153)
* Fix usb error on drive with no existing partitions

* fix offline mode

* Add offline banner
2026-03-04 12:21:18 -06:00
Chris Titus
7f46e8d60d Fix usb error on drive with no existing partitions (#4151) 2026-03-04 11:44:10 -06:00
Chris Titus
9769cafa7d change willshow ui (#4150) 2026-03-04 09:25:54 -06:00
Chris Titus
42dfc8c82b fix write failure on letter assignment from failed usb format 2026-03-04 09:21:39 -06:00
Gabi
d13295bdd8 Update start.ps1 (#4141) 2026-03-03 14:25:14 -06:00
Sean (ANGRYxScotsman)
5fc566b46f Winutil website edit (#4140)
* updated the iso creator docs

* added creator info to the arch docs
2026-03-03 09:17:19 -06:00
25 changed files with 364 additions and 197 deletions

View File

@@ -6,9 +6,6 @@ body:
- type: markdown - type: markdown
attributes: attributes:
value: | value: |
# 🐞 **Issue Report**
Thank you for taking the time to report an issue! Please provide as much detail as possible to help us address the problem efficiently.
## ⚠️ **IMPORTANT** ## ⚠️ **IMPORTANT**
- 🛠️ **Supported environments only:** We only support Windows 11. - 🛠️ **Supported environments only:** We only support Windows 11.
- 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ). - 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).
@@ -24,11 +21,16 @@ body:
validations: validations:
required: true required: true
- type: input - type: dropdown
id: affected_part id: affected_part
attributes: attributes:
label: 📜 What part of Winutil are you having issues with? label: What part of Winutil are you having issues with?
placeholder: "e.g., Tweaks, etc." options:
- Program Install Tab
- Tweaks Tab
- Config Tab
- Updates Tab
- Win11 Creator Tab
validations: validations:
required: true required: true
@@ -39,24 +41,8 @@ body:
validations: validations:
required: true required: true
- type: textarea
id: steps_to_reproduce
attributes:
label: 🔄 Steps to reproduce the issue.
placeholder: "e.g., Step 1: ..., Step 2: ..."
validations:
required: true
- type: textarea - type: textarea
id: error_output id: error_output
attributes: attributes:
label: ❌ Paste the full error output (if available). label: ❌ Paste the full error output (if available) or Screenshot.
placeholder: "Include any relevant logs or error messages." placeholder: "Include any relevant logs or error messages."
- type: textarea
id: additional_context
attributes:
label: 🖼️ Additional context.
placeholder: "Include screenshots, code blocks (use triple backticks ```), or any other relevant information."
validations:
required: false

View File

@@ -13,45 +13,10 @@ body:
- 🛠️ **Supported environments only:** We only support Windows 11. - 🛠️ **Supported environments only:** We only support Windows 11.
- 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ). - 💡 For general questions, use the [Discussions section](https://github.com/Christitustech/winutil/discussions) or join our Community-driven [Discord Server](https://discord.gg/RUbZUZyByQ).
- type: checkboxes
attributes:
label: ⚙️ Issue Checklist
options:
- label: I have read the guidelines.
- label: I checked for duplicate issues.
- label: I searched for existing discussions.
- label: I checked for an existing pull request that addresses this request.
validations:
required: true
- type: textarea
id: problem_statement
attributes:
label: ❓ Is your feature request related to a problem?
placeholder: "Provide a clear and concise description of the issue you're facing. Example: 'I'm always frustrated when [...]'"
validations:
required: false
- type: textarea - type: textarea
id: proposed_solution id: proposed_solution
attributes: attributes:
label: 💡 Describe the solution you'd like label: 💡 Describe the solution you'd like
placeholder: "Provide a clear and concise description of what you want to happen." placeholder: "Provide a clear and concise description."
validations: validations:
required: true required: true
- type: textarea
id: alternatives
attributes:
label: 🔄 Describe alternatives you've considered
placeholder: "Provide details on any alternative solutions or features you've thought about."
validations:
required: false
- type: textarea
id: additional_context
attributes:
label: 🖼️ Additional context
placeholder: "Include screenshots, code blocks (use triple backticks ```), or any other relevant information."
validations:
required: false

View File

@@ -30,7 +30,7 @@ jobs:
if: github.repository == 'ChrisTitusTech/winutil' if: github.repository == 'ChrisTitusTech/winutil'
runs-on: ubuntu-latest runs-on: ubuntu-latest
env: env:
HUGO_VERSION: 0.147.7 HUGO_VERSION: 0.156.0
HUGO_ENVIRONMENT: production HUGO_ENVIRONMENT: production
TZ: America/Chicago TZ: America/Chicago
steps: steps:

View File

@@ -15,10 +15,10 @@ If you are seeing errors referencing TLS or security, you may be running an olde
``` ```
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
iex https://christitus.com/win | iex irm https://christitus.com/win | iex
``` ```
If it still isn't working and you live in India, it might be due to India blocking GitHub's content domain and preventing downloads. See more on [Times of India](https://timesofindia.indiatimes.com/gadgets-news/github-content-domain-blocked-for-these-indian-users-reports/articleshow/96687992.cms). If it still isn't working in your region, it may be due to temporary ISP or network filtering of GitHub content domains. This has been reported by some users in India in the past. See: [Times of India](https://timesofindia.indiatimes.com/gadgets-news/github-content-domain-blocked-for-these-indian-users-reports/articleshow/96687992.cms).
If you are still having issues, try using a **VPN**, or changing your **DNS provider** to one of following two providers: If you are still having issues, try using a **VPN**, or changing your **DNS provider** to one of following two providers:
@@ -37,7 +37,7 @@ If it returns `ConstrainedLanguage`, you may need to switch to `FullLanguage` mo
### Script blocked by Execution Policy ### Script blocked by Execution Policy
1. Ensure you are running PowerShell as admin: Press `Windows Key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11. 1. Ensure you are running PowerShell as admin: Press `Windows key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11.
2. In the PowerShell window, type this to allow unsigned code to execute and run the installation script: 2. In the PowerShell window, type this to allow unsigned code to execute and run the installation script:
``` ```
@@ -65,7 +65,7 @@ This could be for a number of reasons:
If that doesn't work, disable Hibernation: If that doesn't work, disable Hibernation:
- Press `Windows Key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11. then type: - Press `Windows key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11, then type:
```bat ```bat
powercfg /H off powercfg /H off
@@ -89,11 +89,11 @@ Related issue: [#198](https://github.com/ChrisTitusTech/Winutil/issues/198)
### Windows 11: Quick Settings no longer works ### Windows 11: Quick Settings no longer works
Launch the Script and click _Enable Action Center_. Launch the script and click _Enable Action Center_.
### Explorer (file browser) no longer launches ### Explorer (file browser) no longer launches
- Press `Windows key`+`R` then type: - Press `Windows key`+`R`, then type:
```bat ```bat
control /name Microsoft.FolderOptions control /name Microsoft.FolderOptions
@@ -106,7 +106,7 @@ Launch the Script and click _Enable Action Center_.
If you're using a laptop or tablet and find your battery drains too fast, please try the below troubleshooting steps, and report the results back to the Winutil community. If you're using a laptop or tablet and find your battery drains too fast, please try the below troubleshooting steps, and report the results back to the Winutil community.
1. **Check Battery Health:** 1. **Check Battery Health:**
- Press `Windows Key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11. - Press `Windows key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11.
- Run the following command to generate a battery report: - Run the following command to generate a battery report:
```powershell ```powershell
powercfg /batteryreport /output "C:\battery_report.html" powercfg /batteryreport /output "C:\battery_report.html"
@@ -114,7 +114,7 @@ If you're using a laptop or tablet and find your battery drains too fast, please
- Open the generated HTML report to review information about battery health and usage. A battery with poor health may hold less charge, discharge faster, or cause other issues. - Open the generated HTML report to review information about battery health and usage. A battery with poor health may hold less charge, discharge faster, or cause other issues.
2. **Review Power Settings:** 2. **Review Power Settings:**
- Open the Settings app, and go to _System_ > _Power & sleep_. - Open Settings and go to _System_ > _Power & battery_ (Windows 11) or _System_ > _Power & sleep_ (Windows 10).
- Adjust power plan settings based on your preferences and usage patterns. - Adjust power plan settings based on your preferences and usage patterns.
- Click on _Additional power settings_ to access advanced power settings that may help. - Click on _Additional power settings_ to access advanced power settings that may help.
@@ -128,7 +128,7 @@ If you're using a laptop or tablet and find your battery drains too fast, please
- Ensure graphics, chipset, and other essential drivers are up to date. - Ensure graphics, chipset, and other essential drivers are up to date.
5. **Check for Windows Updates:** 5. **Check for Windows Updates:**
- Open the Settings app, and go to _Update & Security_ > _Windows Update_. - Open Settings and go to _Windows Update_ (Windows 11) or _Update & Security_ > _Windows Update_ (Windows 10).
- Check for and install any available updates for your operating system. - Check for and install any available updates for your operating system.
6. **Reduce Screen Brightness:** 6. **Reduce Screen Brightness:**
@@ -144,11 +144,11 @@ If you're using a laptop or tablet and find your battery drains too fast, please
- Review the list of apps and their power usage. Disable or uninstall any you don't need. - Review the list of apps and their power usage. Disable or uninstall any you don't need.
9. **Check Background Apps:** 9. **Check Background Apps:**
- Open the Settings app, and go to _Privacy_ > _Background apps_. - Review background app permissions in Settings (location varies by Windows version and app type).
- Disable or uninstall unnecessary apps running in the background. - Disable or uninstall unnecessary apps running in the background.
10. **Use `powercfg` for Analysis:** 10. **Use `powercfg` for Analysis:**
- Press `Windows Key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11. - Press `Windows key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11.
- Run the following command to analyze energy usage and generate a report: - Run the following command to analyze energy usage and generate a report:
```powershell ```powershell
powercfg /energy /output "C:\energy_report.html" powercfg /energy /output "C:\energy_report.html"
@@ -161,7 +161,7 @@ If you're using a laptop or tablet and find your battery drains too fast, please
- Look for events with the source _Power-Troubleshooter_ to identify power-related events. These may highlight battery, input power, and other issues. - Look for events with the source _Power-Troubleshooter_ to identify power-related events. These may highlight battery, input power, and other issues.
12. **Check Wake-up Sources:** 12. **Check Wake-up Sources:**
- Press `Windows Key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11. - Press `Windows key`+`X` and select _PowerShell (Admin)_ in Windows 10, or `Windows Terminal (Admin)` in Windows 11.
- Use the command `powercfg /requests` to identify processes preventing sleep. - Use the command `powercfg /requests` to identify processes preventing sleep.
- Use the command `powercfg /waketimers` to view active wake timers. - Use the command `powercfg /waketimers` to view active wake timers.
- Check Task Scheduler to see if any of the discovered processes are scheduled to start on boot or at regular intervals. - Check Task Scheduler to see if any of the discovered processes are scheduled to start on boot or at regular intervals.
@@ -172,7 +172,7 @@ If you're using a laptop or tablet and find your battery drains too fast, please
- Consider reconfiguring, closing, disabling, or uninstalling applications that use a lot of resources. - Consider reconfiguring, closing, disabling, or uninstalling applications that use a lot of resources.
14. **Disable Activity History:** 14. **Disable Activity History:**
- Open the Settings app, and go to _Privacy_ > _Activity history_. - Open Settings and go to _Privacy & security_ > _Activity history_ (Windows 11) or _Privacy_ > _Activity history_ (Windows 10).
- Turn off _Let Windows collect my activities from this PC_. - Turn off _Let Windows collect my activities from this PC_.
15. **Prevent Network Adapters From Waking PC:** 15. **Prevent Network Adapters From Waking PC:**

View File

@@ -128,6 +128,154 @@ winutil/
- CheckBoxes for options - CheckBoxes for options
- ListBoxes for selections - ListBoxes for selections
## Win11 Creator Architecture
The **Win11 Creator** is a specialized subsystem within Winutil that creates customized Windows 11 ISOs. It operates independently from the main package installation and tweak system.
### Win11 Creator Components
**Core Functions** (`functions/private/`):
- `Invoke-WinUtilISO.ps1`: Main orchestrator containing all Win11 Creator functions
- `Invoke-WinUtilISOBrowse`: ISO file selection dialog
- `Invoke-WinUtilISOMountAndVerify`: Validates and mounts ISO, verifies it's official Windows 11
- `Invoke-WinUtilISOModify`: Launches modification in background runspace
- `Invoke-WinUtilISOExport`: Handles ISO and USB export
- `Invoke-WinUtilISOCheckExistingWork`: Recovers incomplete work sessions
- `Invoke-WinUtilISOCleanAndReset`: Cleans up temp directories and resets UI
- `Invoke-WinUtilISOScript.ps1`: Applies modifications to mounted install.wim
- Removes provisioned AppX packages (40+ bloatware apps)
- Injects drivers (optional) from current system
- Removes OneDrive setup files
- Applies offline registry tweaks (hardware bypass, privacy, telemetry, OOBE)
- Deletes telemetry scheduled task definitions
- Pre-stages setup scripts from autounattend.xml
- Removes unused Windows editions
- Cleans component store via DISM
### Win11 Creator Data Flow
```
User selects official Windows 11 ISO
Invoke-WinUtilISOBrowse → OpenFileDialog, validates file size
Invoke-WinUtilISOMountAndVerify
├─ Mount ISO via Mount-DiskImage
├─ Verify install.wim or install.esd exists
├─ Check for "Windows 11" in image metadata
├─ Extract available editions (Home, Pro, Enterprise, etc.)
└─ Store ISO path, drive letter, WIM path, image info in $sync
User optionally enables Driver Injection checkbox
Invoke-WinUtilISOModify (runs in background runspace)
├─ Create work directory: ~WinUtil_Win11ISO_[timestamp]
├─ Copy ISO contents to disk (~5-6 GB)
├─ Mount install.wim at selected edition/index
├─ Invoke-WinUtilISOScript:
│ ├─ Remove 40+ bloat AppX packages
│ ├─ Export and inject drivers (if enabled)
│ ├─ Remove OneDrive setup
│ ├─ Load offline registry hives
│ ├─ Apply 50+ registry tweaks (hardware bypass, privacy, telemetry, OOBE, etc.)
│ ├─ Delete telemetry scheduled task files
│ ├─ Pre-stage setup scripts from autounattend.xml to C:\Windows\Setup\Scripts\
│ └─ Unload registry hives
├─ DISM /Cleanup-Image /StartComponentCleanup /ResetBase (saves 300-800 MB)
├─ Dismount and save modified install.wim (~10+ minutes, slowest step)
├─ Export selected edition only (removes all other editions, saves 1-2 GB each)
├─ Dismount source ISO
└─ Report completion, enable export options
Invoke-WinUtilISOExport (user chooses output)
├─ Option 1: Save as ISO
│ ├─ Build bootable ISO via oscdimg.exe (BIOS/UEFI dual-boot)
│ └─ Output: Win11_Modified_[date].iso (2.5-3.5 GB)
└─ Option 2: Write to USB
├─ Format USB as GPT
├─ Create 512 MB EFI partition
├─ Copy modified ISO contents
└─ Output: Bootable USB (minimum 8 GB)
Invoke-WinUtilISOCleanAndReset (optional)
└─ Delete temp working directory (~10-15 GB)
└─ Reset UI to initial state
```
### Win11 Creator Validation & Safety
**ISO Validation**:
- Only accepts official Microsoft Windows 11 ISOs
- Validates presence of install.wim or install.esd
- Checks image metadata for "Windows 11" string
- Rejects custom, modified, or non-Windows 11 ISOs
**Work Session Recovery**:
- Auto-detects incomplete work from previous sessions
- Allows resuming Step 4 (export) without re-running Steps 1-3
- Prevents redundant modifications
**Modification Safety**:
- All registry changes are documented in script (reversible)
- Original ISO never modified; only working copy
- Logged to `WinUtil_Win11ISO.log` for debugging
- DISM handles image dismount with automatic cleanup on error
### Win11 Creator Registry Tweaks
The `Invoke-WinUtilISOScript` function applies **50+ offline registry tweaks**:
**Hardware Bypass**:
- TPM 2.0 check bypass
- Secure Boot requirement bypass
- CPU compatibility bypass
- RAM requirement bypass
- Storage check bypass
**Privacy & Telemetry**:
- Disable advertising ID
- Disable tailored experiences
- Disable input personalization
- Disable speech online privacy
- Disable cloud content suggestions
- Disable app suggestion subscriptions
- Remove CEIP, Appraiser, WaaSMedic, etc.
**OOBE & Setup**:
- Enable local account setup
- Skip Microsoft account requirement
- Dark mode by default
- Empty taskbar and Start Menu
**Post-Setup Installations**:
- Prevent DevHome auto-installation
- Prevent new Outlook Mail app installation
- Prevent Teams auto-installation
**System Features**:
- Disable BitLocker and device encryption
- Disable Chat icon from taskbar
- Disable OneDrive folder backup
- Disable Copilot
- Disable Windows Update during OOBE (re-enabled at first login)
### Driver Injection Feature
**Optional Enhancement**: When enabled, exports all drivers from the running system and injects them into both:
- `install.wim` (main OS image)
- `boot.wim` index 2 (Windows Setup PE environment)
**Use Case**: Enables offline installation on systems with missing drivers.
### Disk Space Requirements
- **Temporary working directory**: ~10-15 GB
- **Original ISO**: 4-6 GB
- **Modified ISO**: 2.5-3.5 GB
- **Total needed**: ~25 GB for safe operation
## Data Flow ## Data Flow
### Application Installation Flow ### Application Installation Flow
@@ -514,6 +662,7 @@ Outputs `winutil.ps1` in the root directory.
- [Contributing Guide](../../contributing/) - How to contribute code - [Contributing Guide](../../contributing/) - How to contribute code
- [User Guide](../../userguide/) - End-user documentation - [User Guide](../../userguide/) - End-user documentation
- [Win11 Creator Guide](../../userguide/win11Creator/) - Building customized Windows 11 ISOs
- [FAQ](../../faq/) - Common questions - [FAQ](../../faq/) - Common questions
## Additional Resources ## Additional Resources

View File

@@ -17,7 +17,7 @@ function Invoke-WPFFixesWinget {
try { try {
Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo" Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"
Write-Host "==> Starting Winget Repair" Write-Host "==> Starting Winget Repair"
Install-WinUtilWinget -Force Install-WinUtilWinget
} catch { } catch {
Write-Error "Failed to install winget: $_" Write-Error "Failed to install winget: $_"
Set-WinUtilTaskbaritem -state "Error" -overlay "warning" Set-WinUtilTaskbaritem -state "Error" -overlay "warning"

View File

@@ -31,7 +31,7 @@ Winutil is designed for:
New to Winutil? Start here: New to Winutil? Start here:
1. **[Getting Started Guide](getting-started/)** - Installation and first steps 1. **[Getting Started Guide](getting-started/)** - Installation and first steps
2. **[Application Store](application/)** - Learn to install software easily 2. **[Applications Guide](application/)** - Learn to install, upgrade, and uninstall software
3. **[Tweaks Guide](tweaks/)** - Optimize your system 3. **[Tweaks Guide](tweaks/)** - Optimize your system
4. **[Features & Fixes](features/)** - Troubleshoot common issues 4. **[Features & Fixes](features/)** - Troubleshoot common issues
5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO 5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO
@@ -42,7 +42,7 @@ New to Winutil? Start here:
Browse and install hundreds of popular applications with a single click. No more hunting for download links or dealing with installer bloat. Browse and install hundreds of popular applications with a single click. No more hunting for download links or dealing with installer bloat.
**[Read the Store Guide →](application/)** **[Read the Applications Guide →](application/)**
### ⚙️ System Tweaks ### ⚙️ System Tweaks
@@ -91,7 +91,7 @@ Build a custom Windows 11 ISO with bloatware removed, telemetry disabled, and ha
| I want to... | Go to... | | I want to... | Go to... |
|--------------|----------| |--------------|----------|
| Install Winutil for the first time | [Getting Started](getting-started/) | | Install Winutil for the first time | [Getting Started](getting-started/) |
| Install applications quickly | [Application Store](application/) | | Install, upgrade, or uninstall apps | [Applications Guide](application/) |
| Speed up my computer | [Tweaks Guide](tweaks/) | | Speed up my computer | [Tweaks Guide](tweaks/) |
| Fix Windows Update problems | [Features - Fixes](features/) | | Fix Windows Update problems | [Features - Fixes](features/) |
| Automate setup for multiple PCs | [Automation](automation/) | | Automate setup for multiple PCs | [Automation](automation/) |
@@ -151,7 +151,7 @@ Want to help improve Winutil?
This User Guide covers everything you need to know: This User Guide covers everything you need to know:
1. **[Getting Started](getting-started/)** - Installation, first run, basic usage 1. **[Getting Started](getting-started/)** - Installation, first run, basic usage
2. **[Application Store](application/)** - Installing software, using presets 2. **[Applications](application/)** - Installing, upgrading, and uninstalling software
3. **[Tweaks](tweaks/)** - System optimizations and customizations 3. **[Tweaks](tweaks/)** - System optimizations and customizations
4. **[Features & Fixes](features/)** - Troubleshooting tools and utilities 4. **[Features & Fixes](features/)** - Troubleshooting tools and utilities
5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO 5. **[Win11 Creator](win11Creator/)** - Build a custom debloated Windows 11 ISO

View File

@@ -1,33 +1,33 @@
--- ---
title: Applications title: Applications
weight: 2 weight: 3
--- ---
{{< tabs items="Installation & Updates,Upgrade All,Uninstall,Get Installed,Clear Selection" defaultIndex="0" >}} {{< tabs >}}
{{< tab >}} {{< tab name="Installation & Updates" selected=true >}}
* Choose the programs you want to install or upgrade. * Choose the applications you want to install or upgrade.
* For programs not currently installed, this action will install them. * For programs not currently installed, this action will install them.
* For programs already installed, this action will update them to the latest version. * For programs already installed, this action will update them to the latest version.
* Click the `Install/Upgrade Selected` button to start the installation or upgrade process. * Click the `Install/Upgrade Selected` button to start the installation or upgrade process.
{{< /tab >}} {{< /tab >}}
{{< tab >}} {{< tab name="Upgrade All" >}}
* Simply press the `Upgrade All` button. * Simply press the `Upgrade All` button.
* This will upgrade all applicable programs that are installed without the need for individual selection. * This will upgrade all applicable programs that are installed without the need for individual selection.
{{< /tab >}} {{< /tab >}}
{{< tab >}} {{< tab name="Uninstall" >}}
* Select the programs you wish to uninstall. * Select the programs you wish to uninstall.
* Click the `Uninstall Selected` button to remove the selected programs. * Click the `Uninstall Selected` button to remove the selected programs.
{{< /tab >}} {{< /tab >}}
{{< tab >}} {{< tab name="Get Installed" >}}
* Click the `Show Installed Apps` button. * Click the `Show Installed Apps` button.
* This will scan for and select all installed programs in Winutil that WinGet supports. * This scans for and selects installed applications supported by WinGet.
{{< /tab >}} {{< /tab >}}
{{< tab >}} {{< tab name="Clear Selection" >}}
* Click the `Clear Selection` button. * Click the `Clear Selection` button.
* This will unselect all checked programs. * This will unselect all checked programs.
{{< /tab >}} {{< /tab >}}

View File

@@ -1,7 +1,13 @@
Automation option in winutil allows you to run winutil from a config file, ---
you can get your own config file inside winutil by clicking the gear icon on the top right and clicking export and saving it as a file title: Automation
weight: 7
---
you can automate winutil launch with this command The Automation option in Winutil allows you to run Winutil from an exported config file.
You can create your own config in the app by clicking the gear icon in the top-right corner, then choosing Export and saving the file.
You can automate Winutil launch with this command:
```powershell ```powershell
& ([ScriptBlock]::Create((irm "https://christitus.com/win"))) -Config C:\Path\To\Config -Run & ([ScriptBlock]::Create((irm "https://christitus.com/win"))) -Config "C:\Path\To\Config.json" -Run
``` ```

View File

@@ -1,12 +1,12 @@
--- ---
title: Features title: Features
weight: 4 weight: 5
--- ---
* Install the most used **Windows Features** by checking the checkbox and clicking "Install Features" to install them. Install common **Windows Features** by selecting the feature checkboxes and clicking **Install Features**.
* All .Net Frameworks (2, 3, 4) * All .NET Frameworks (2, 3, 4)
* HyperV Virtualization * Hyper-V Virtualization
* Legacy Media (WMP, DirectPlay) * Legacy Media (WMP, DirectPlay)
* NFS - Network File System * NFS - Network File System
* Enable Daily Registry Backup Task 12:30am * Enable Daily Registry Backup Task 12:30am
@@ -16,7 +16,7 @@ weight: 4
* Windows Sandbox * Windows Sandbox
### Fixes ### Fixes
* Quick fixes for your system if you are having issues. Quick fixes for common system problems.
* Set Up Autologin * Set Up Autologin
* Reset Windows Update * Reset Windows Update
@@ -28,6 +28,7 @@ weight: 4
### Legacy Windows Panels ### Legacy Windows Panels
Open old-school Windows panels directly from Winutil. Following Panels are available: Open old-school Windows panels directly from Winutil. Following Panels are available:
Open classic Windows panels directly from Winutil. Available panels include:
* Control Panel * Control Panel
* Network Connections * Network Connections
@@ -39,4 +40,4 @@ Open old-school Windows panels directly from Winutil. Following Panels are avail
### Remote Access ### Remote Access
Enables OpenSSH server on your windows machine. Enables an OpenSSH server on your Windows machine.

View File

@@ -1,6 +1,6 @@
--- ---
title: Getting Started title: Getting Started
weight: 1 weight: 2
--- ---
## Welcome to Winutil! ## Welcome to Winutil!
@@ -111,7 +111,7 @@ This allows you to undo changes if needed.
1. Navigate to the **Install** tab 1. Navigate to the **Install** tab
2. Browse categories or use the search bar 2. Browse categories or use the search bar
3. Check applications you want to install 3. Check applications you want to install
4. Click "Install Selected" at the bottom 4. Click "Install/Upgrade Selected" at the bottom
### 3. Apply Basic Tweaks ### 3. Apply Basic Tweaks
@@ -131,7 +131,7 @@ For a better Windows experience without risks:
1. Open **Install** tab 1. Open **Install** tab
2. Search for the application name 2. Search for the application name
3. Check the box next to it 3. Check the box next to it
4. Click "Install Selected" 4. Click "Install/Upgrade Selected"
**Multiple Applications**: **Multiple Applications**:
@@ -239,7 +239,7 @@ irm "https://christitus.com/win" | iex
### Download Blocked (India/Certain Regions) ### Download Blocked (India/Certain Regions)
If GitHub is blocked in your region: If downloads are blocked in your region:
1. Use a VPN service 1. Use a VPN service
2. Change DNS to Cloudflare (1.1.1.1) or Google (8.8.8.8) 2. Change DNS to Cloudflare (1.1.1.1) or Google (8.8.8.8)
@@ -258,7 +258,7 @@ If Winutil downloads but doesn't open:
Now that you're set up, explore these guides: Now that you're set up, explore these guides:
- [Application Installation Guide](../application/) - Learn about installing software - [Application Guide](../application/) - Learn about installing, upgrading, and uninstalling software
- [Tweaks Guide](../tweaks/) - Understand system optimizations - [Tweaks Guide](../tweaks/) - Understand system optimizations
- [FAQ](../../faq/) - Common questions and answers - [FAQ](../../faq/) - Common questions and answers
@@ -276,7 +276,8 @@ If you need assistance:
| Task | Location | Action | | Task | Location | Action |
| -------------------- | ----------- | ------------------------------------ | | -------------------- | ----------- | ------------------------------------ |
| Install Apps | Install Tab | Check boxes → Install Selected | | Install or upgrade apps | Install Tab | Check boxes → Install/Upgrade Selected |
| Uninstall apps | Install Tab | Check boxes → Uninstall Selected |
| Apply Tweaks | Tweaks Tab | Select tweaks → Run Tweaks | | Apply Tweaks | Tweaks Tab | Select tweaks → Run Tweaks |
| Undo Tweaks | Tweaks Tab | Select tweaks → Undo Selected Tweaks | | Undo Tweaks | Tweaks Tab | Select tweaks → Undo Selected Tweaks |
| Create Restore Point | Tweaks Tab | Essential Tweaks section | | Create Restore Point | Tweaks Tab | Essential Tweaks section |
@@ -284,4 +285,4 @@ If you need assistance:
| Change DNS | Tweaks Tab | DNS section | | Change DNS | Tweaks Tab | DNS section |
| Open Control Panel | Config Tab | Legacy Windows Panels | | Open Control Panel | Config Tab | Legacy Windows Panels |
Happy optimizing! 🚀 Happy optimizing! 🚀

View File

@@ -1,6 +1,6 @@
--- ---
title: Tweaks title: Tweaks
weight: 3 weight: 4
--- ---
{{< image src="images/Tweaks-Tab" alt="Image of Tweaks Tab" >}} {{< image src="images/Tweaks-Tab" alt="Image of Tweaks Tab" >}}
@@ -21,10 +21,10 @@ Essential Tweaks are modifications and optimizations that are generally safe for
### Advanced Tweaks (CAUTION) ### Advanced Tweaks (CAUTION)
Advanced Tweaks are intended for experienced users who have a solid understanding of their system and the potential implications of making deep-level changes. These tweaks involve more significant alterations to the operating system and can provide substantial customization. However, they also carry a higher risk of causing system instability or unintended side effects if not implemented correctly. Users who choose to apply Advanced Tweaks should proceed with caution, ensuring they have adequate knowledge and backups in place to recover if something goes wrong. These tweaks are not recommended for novice users or those unfamiliar with the inner workings of their operating system. Advanced Tweaks are intended for experienced users who have a solid understanding of their system and the potential implications of making deep-level changes. These tweaks involve more significant alterations to the operating system and can provide substantial customization. However, they also carry a higher risk of causing system instability or unintended side effects if not implemented correctly. Users who choose to apply Advanced Tweaks should proceed with caution, ensuring they have adequate knowledge and backups in place to recover if something goes wrong. These tweaks are not recommended for novice users or those unfamiliar with the inner workings of their operating system.
### O&O Shutup ### O&O ShutUp10++
[O&O ShutUp10++](https://www.oo-software.com/en/shutup10) can be launched from Winutil with only one button click. It is a free privacy tool for Windows that lets users easily manage their privacy settings. It disables telemetry, controls updates, and manages app permissions to enhance security and privacy. The tool offers recommended settings for optimal privacy with just a few clicks. [O&O ShutUp10++](https://www.oo-software.com/en/shutup10) can be launched from Winutil with one click. It is a free privacy tool for Windows that helps users manage telemetry, update behavior, and app permission settings.
{{< youtube id=3HvNr8eMcv0 loading=lazy >}} {{< youtube id=3HvNr8eMcv0 loading=lazy >}}
@@ -46,11 +46,11 @@ The utility provides a convenient DNS selection feature, allowing users to choos
### Customize Preferences ### Customize Preferences
The Customize Preferences section allows users to personalize their Windows experience by toggling various visual and functional features. These preferences are designed to enhance usability and tailor the system to the users specific needs and preferences. The Customize Preferences section allows users to personalize their Windows experience by toggling visual and functional settings.
### Performance Plans ### Performance Plans
The Performance Plans section allows users to manage the Ultimate Performance Profile on their system. This feature is designed to optimize the system for maximum performance. The Performance Plans section allows users to manage the Ultimate Performance Profile for maximum performance.
#### Add and activate the Ultimate Performance Profile: #### Add and activate the Ultimate Performance Profile:
* Enables and activates the Ultimate Performance Profile to enhance system performance by minimizing latency and increasing efficiency. * Enables and activates the Ultimate Performance Profile to enhance system performance by minimizing latency and increasing efficiency.

View File

@@ -1,3 +1,8 @@
---
title: Updates
weight: 6
---
The utility provides three distinct settings for managing Windows updates: Default (Out of Box) Settings, Security (Recommended) Settings, and Disable ALL Updates (NOT RECOMMENDED!). Each setting offers a different approach to handling updates, catering to various user needs and preferences. The utility provides three distinct settings for managing Windows updates: Default (Out of Box) Settings, Security (Recommended) Settings, and Disable ALL Updates (NOT RECOMMENDED!). Each setting offers a different approach to handling updates, catering to various user needs and preferences.
### Default (Out of Box) Settings ### Default (Out of Box) Settings

View File

@@ -1,6 +1,6 @@
--- ---
title: Win 11 Creator title: Win 11 Creator
weight: 5 weight: 8
--- ---
## Using Winutil's Win11 Creator ## Using Winutil's Win11 Creator
@@ -8,14 +8,14 @@ weight: 5
Winutil includes a built-in **Win11 Creator** tool that lets you take any official Windows 11 ISO and produce a customized, debloated version — with telemetry removed, hardware requirement checks bypassed, and local account setup enabled out of the box. You can export the result as a new ISO file or write it directly to a USB drive. Winutil includes a built-in **Win11 Creator** tool that lets you take any official Windows 11 ISO and produce a customized, debloated version — with telemetry removed, hardware requirement checks bypassed, and local account setup enabled out of the box. You can export the result as a new ISO file or write it directly to a USB drive.
> [!IMPORTANT] > [!IMPORTANT]
> You need a valid Windows 11 ISO before starting. Download one from [Microsoft's official site](https://www.microsoft.com/en-us/software-download/windows11) or use [UUP Dump](https://uupdump.net/). The process uses ~1015 GB of temporary disk space, so make sure you have room. > You need an **official Windows 11 ISO** from [Microsoft's website](https://www.microsoft.com/en-us/software-download/windows11) before starting. Custom, modified, or non-official ISOs are not supported. The process uses ~1015 GB of temporary disk space, so make sure you have room.
--- ---
### Step 1 — Select Your ISO ### Step 1 — Select Your Official Windows 11 ISO
1. Open Winutil and go to the **Win11 Creator** tab. 1. Open Winutil and go to the **Win11 Creator** tab.
2. Click **Browse** and select your Windows 11 ISO file (must be 4 GB or larger). 2. Click **Browse** and select your **official Windows 11 ISO file** from Microsoft (must be 4 GB or larger). Custom or modified ISOs are not supported.
3. The file path and size will appear on screen once selected. 3. The file path and size will appear on screen once selected.
--- ---
@@ -35,14 +35,31 @@ Winutil includes a built-in **Win11 Creator** tool that lets you take any offici
Click **Run Windows ISO Modification and Creator** to start the customization process. Winutil will: Click **Run Windows ISO Modification and Creator** to start the customization process. Winutil will:
**App & Component Removal:**
- **Remove 40+ bloat apps** — Clipchamp, Teams, Copilot, Dev Home, new Outlook, Bing apps, Solitaire, and more - **Remove 40+ bloat apps** — Clipchamp, Teams, Copilot, Dev Home, new Outlook, Bing apps, Solitaire, and more
- **Delete OneDrive setup** from the image - **Delete OneDrive setup** from the image
- **Apply registry tweaks** — disables telemetry, advertising ID, tailored experiences, and cloud content features
- **Bypass hardware checks** — removes TPM, Secure Boot, CPU, and RAM requirement enforcement so the ISO installs on unsupported hardware **System Customization:**
- **Bypass hardware checks** — removes TPM, Secure Boot, CPU, RAM, and storage requirement enforcement so the ISO installs on unsupported hardware
- **Enable local account setup** — injects an `autounattend.xml` that skips the Microsoft account screen during OOBE - **Enable local account setup** — injects an `autounattend.xml` that skips the Microsoft account screen during OOBE
- **Disable BitLocker and device encryption** — removes startup overhead
- **Disable Chat icon** — removes chat taskbar button
- **Strip unused editions** — keeps only your selected edition, saving 12 GB per removed edition - **Strip unused editions** — keeps only your selected edition, saving 12 GB per removed edition
- **Clean the component store** — runs DISM cleanup to reclaim another 300800 MB - **Clean the component store** — runs DISM cleanup to reclaim another 300800 MB
**Privacy & Telemetry Tweaks:**
- **Disable telemetry** — advertising ID, tailored experiences, input personalization, speech online privacy
- **Disable cloud content features** — app suggestions, Microsoft Store recommendations
- **Remove telemetry scheduled tasks** — CEIP, Appraiser, WaaSMedic, and others - **Remove telemetry scheduled tasks** — CEIP, Appraiser, WaaSMedic, and others
- **Disable OneDrive folder backup** — prevents automatic backups to cloud
- **Prevent DevHome and Outlook post-setup installation**
- **Prevent Teams installation** — blocks auto-install after OOBE
- **Prevent new Outlook Mail app installation**
- **Disable Windows Update during OOBE** — re-enabled automatically on first login
- **Disable Copilot and search box suggestions**
**Optional: Driver Injection**
- If enabled, injects all drivers from your current system into the install.wim and boot.wim — useful for offline installations on machines with missing drivers. This is an optional checkbox in Step 3.
A live log shows progress as each step completes. This stage takes **1030 minutes** depending on your disk speed — the WIM dismount near the end is the slowest part, so don't close Winutil while it's running. A live log shows progress as each step completes. This stage takes **1030 minutes** depending on your disk speed — the WIM dismount near the end is the slowest part, so don't close Winutil while it's running.
@@ -52,9 +69,9 @@ A live log shows progress as each step completes. This stage takes **1030 min
Once modification is complete, choose how to save your image: Once modification is complete, choose how to save your image:
{{< tabs items="Save as ISO,Write to USB" defaultIndex="0" >}} {{< tabs >}}
{{< tab >}} {{< tab name="Save as ISO" selected=true >}}
1. Click **Save as an ISO File**. 1. Click **Save as an ISO File**.
2. Choose a save location (defaults to your Desktop as `Win11_Modified_yyyyMMdd.iso`). 2. Choose a save location (defaults to your Desktop as `Win11_Modified_yyyyMMdd.iso`).
3. Winutil builds a dual BIOS/UEFI bootable ISO using `oscdimg.exe`. 3. Winutil builds a dual BIOS/UEFI bootable ISO using `oscdimg.exe`.
@@ -65,7 +82,7 @@ Once modification is complete, choose how to save your image:
**Typical output size:** 2.53.5 GB (down from 56 GB original) **Typical output size:** 2.53.5 GB (down from 56 GB original)
{{< /tab >}} {{< /tab >}}
{{< tab >}} {{< tab name="Write to USB" >}}
1. Click **Write Directly to a USB Drive**. 1. Click **Write Directly to a USB Drive**.
2. Select your USB drive from the dropdown (click **Refresh** if it doesn't appear). 2. Select your USB drive from the dropdown (click **Refresh** if it doesn't appear).
3. Click **Erase & Write to USB** and confirm the warning — **all data on the drive will be permanently erased**. 3. Click **Erase & Write to USB** and confirm the warning — **all data on the drive will be permanently erased**.
@@ -94,9 +111,9 @@ When you install Windows 11 from your modified ISO:
- **No Microsoft account required** — create a local account directly during setup - **No Microsoft account required** — create a local account directly during setup
- **No hardware checks** — installs on machines without TPM 2.0, Secure Boot, or supported CPUs - **No hardware checks** — installs on machines without TPM 2.0, Secure Boot, or supported CPUs
- **Dark mode enabled by default** - **Dark mode enabled by default**
- **Empty taskbar and Start Menu** — no pinned apps - **Empty taskbar and Start Menu** — no pinned apps, Chat icon removed
- **Windows Update re-enabled automatically** after first login (it's paused during OOBE to prevent interruption) - **Windows Update disabled during OOBE** — automatically re-enabled on first login to prevent setup interruptions
- **BitLocker disabled**, Recall disabled, desktop shortcuts removed - **BitLocker disabled** — removes startup overhead on first boot
--- ---
@@ -144,10 +161,10 @@ A list of the best free and open source tools for downloading, creating and flas
--- ---
> [!TIP] > [!TIP]
> Already have a Windows 11 ISO? Skip the third-party tools and use Winutil's built-in **[Win11 Creator](#using-winutilss-win11-creator)** at the top of this page. > Already have a Windows 11 ISO? Skip the third-party tools and use Winutil's built-in **[Win11 Creator](#using-winutils-win11-creator)** at the top of this page.
> [!NOTE] > [!NOTE]
> Always download Windows ISOs from official Microsoft sources or trusted tools like Rufus/UUP Dump to avoid tampered images. > Always download Windows ISOs from official Microsoft sources or trusted tools like Rufus/UUP Dump to avoid tampered images.
> [!NOTE] > [!NOTE]
> Newer Windows 11 ISOs may not boot correctly on older versions of Ventoy — make sure Ventoy is up to date before use. If issues persist after updating, this is a Ventoy compatibility limitation outside of Winutil's control. > Newer Windows 11 ISOs may not boot correctly on older versions of Ventoy — make sure Ventoy is up to date before use. If issues persist after updating, this is a Ventoy compatibility limitation outside of Winutil's control.

View File

@@ -1,5 +1,5 @@
module github.com/ChrisTitusTech/WinUtil module github.com/ChrisTitusTech/WinUtil
go 1.23.3 go 1.26
require github.com/imfing/hextra v0.11.1 // indirect require github.com/imfing/hextra v0.12.0 // indirect

View File

@@ -2,3 +2,5 @@ github.com/imfing/hextra v0.9.7 h1:Zg5n24us36Bn/S/5mEUPkRW6uwE6vHHEqWSgN0bPXaM=
github.com/imfing/hextra v0.9.7/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI= github.com/imfing/hextra v0.9.7/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI=
github.com/imfing/hextra v0.11.1 h1:8pTc4ReYbzGTHAnyiebmlT3ijFfIXiGu1r7tM/UGjFI= github.com/imfing/hextra v0.11.1 h1:8pTc4ReYbzGTHAnyiebmlT3ijFfIXiGu1r7tM/UGjFI=
github.com/imfing/hextra v0.11.1/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI= github.com/imfing/hextra v0.11.1/go.mod h1:cEfel3lU/bSx7lTE/+uuR4GJaphyOyiwNR3PTqFTXpI=
github.com/imfing/hextra v0.12.0 h1:f6y35hW/WDJEcx9S0dOmbICOBxYE0PmP6IJFsTUgVyY=
github.com/imfing/hextra v0.12.0/go.mod h1:YAv8XRNSmcqjieFwI7fVQK1AoY2Do+45DO9HGqxSGu4=

View File

@@ -12,29 +12,48 @@ canonifyURLs = true
path = "github.com/imfing/hextra" path = "github.com/imfing/hextra"
[[menu.main]] [[menu.main]]
name = "Developer Documentation" identifier = "userguide"
pageRef = "/dev" name = "User Guides"
pageRef = "/userguide"
weight = 1 weight = 1
[[menu.main]] [[menu.main]]
name = "User Guides" identifier = "documentation"
pageRef = "/userguide" name = "Developer Documentation"
weight = 2 weight = 2
[[menu.main]] [[menu.main]]
identifier = "contribution-guides"
name = "Contribution Guides" name = "Contribution Guides"
pageRef = "CONTRIBUTING.md" pageRef = "CONTRIBUTING.md"
weight = 1
parent = "documentation"
[[menu.main]]
identifier = "developer-documentation"
name = "Developer Docs"
pageRef = "/dev"
weight = 2
parent = "documentation"
[[menu.main]]
identifier = "help"
name = "Help"
weight = 3 weight = 3
[[menu.main]] [[menu.main]]
identifier = "faq"
name = "FAQ" name = "FAQ"
pageRef = "faq.md" pageRef = "faq.md"
weight = 4 weight = 1
parent = "help"
[[menu.main]] [[menu.main]]
identifier = "known-issues"
name = "Known Issues" name = "Known Issues"
pageRef = "KnownIssues.md" pageRef = "KnownIssues.md"
weight = 4 weight = 2
parent = "help"
[[menu.main]] [[menu.main]]
name = "Store" name = "Store"

View File

@@ -1,5 +1,4 @@
copyright: "&copy; <script>document.write(new Date().getFullYear())</script>&nbsp;<a href='https://christitus.com'>Chris Titus Tech</a>. All rights reserved." copyright: "&copy; <script>document.write(new Date().getFullYear())</script>&nbsp;<a href='https://christitus.com'>Chris Titus Tech</a>. All rights reserved."
backToTop: "Scroll to top" backToTop: "Scroll to top"
changeLanguage: "Change language" changeLanguage: "Change language"
changeTheme: "Change theme" changeTheme: "Change theme"

View File

@@ -103,13 +103,24 @@ function Invoke-WinUtilISOWriteUSB {
try { try {
SetProgress "Formatting USB drive..." 10 SetProgress "Formatting USB drive..." 10
# Phase 1: Clean disk via diskpart # Phase 1: Clean disk via diskpart (retry once if the drive is not yet ready)
$dpFile1 = Join-Path $env:TEMP "winutil_diskpart_$(Get-Random).txt" $dpFile1 = Join-Path $env:TEMP "winutil_diskpart_$(Get-Random).txt"
"select disk $diskNum`nclean`nexit" | Set-Content -Path $dpFile1 -Encoding ASCII "select disk $diskNum`nclean`nexit" | Set-Content -Path $dpFile1 -Encoding ASCII
Log "Running diskpart clean on Disk $diskNum..." Log "Running diskpart clean on Disk $diskNum..."
diskpart /s $dpFile1 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" } $dpCleanOut = diskpart /s $dpFile1 2>&1
$dpCleanOut | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
Remove-Item $dpFile1 -Force -ErrorAction SilentlyContinue Remove-Item $dpFile1 -Force -ErrorAction SilentlyContinue
if (($dpCleanOut -join ' ') -match 'device is not ready') {
Log "Disk $diskNum was not ready; waiting 5 seconds and retrying clean..."
Start-Sleep -Seconds 5
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
$dpFile1b = Join-Path $env:TEMP "winutil_diskpart_$(Get-Random).txt"
"select disk $diskNum`nclean`nexit" | Set-Content -Path $dpFile1b -Encoding ASCII
diskpart /s $dpFile1b 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
Remove-Item $dpFile1b -Force -ErrorAction SilentlyContinue
}
# Phase 2: Initialize as GPT # Phase 2: Initialize as GPT
Start-Sleep -Seconds 2 Start-Sleep -Seconds 2
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
@@ -122,7 +133,8 @@ function Invoke-WinUtilISOWriteUSB {
Log "Disk $diskNum converted to GPT (was $($diskObj.PartitionStyle))." Log "Disk $diskNum converted to GPT (was $($diskObj.PartitionStyle))."
} }
# Phase 3: Create FAT32 partition via diskpart # Phase 3: Create FAT32 partition via diskpart, then format with Format-Volume
# (diskpart's 'format' command can fail with "no volume selected" on fresh/never-formatted drives)
$volLabel = "W11-" + (Get-Date).ToString('yyMMdd') $volLabel = "W11-" + (Get-Date).ToString('yyMMdd')
$dpFile2 = Join-Path $env:TEMP "winutil_diskpart2_$(Get-Random).txt" $dpFile2 = Join-Path $env:TEMP "winutil_diskpart2_$(Get-Random).txt"
$maxFat32PartitionMB = 32768 $maxFat32PartitionMB = 32768
@@ -136,28 +148,38 @@ function Invoke-WinUtilISOWriteUSB {
@( @(
"select disk $diskNum" "select disk $diskNum"
$createPartitionCommand $createPartitionCommand
"format quick fs=fat32 label=`"$volLabel`""
"exit" "exit"
) | Set-Content -Path $dpFile2 -Encoding ASCII ) | Set-Content -Path $dpFile2 -Encoding ASCII
Log "Creating partitions on Disk $diskNum..." Log "Creating partitions on Disk $diskNum..."
diskpart /s $dpFile2 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" } diskpart /s $dpFile2 2>&1 | Where-Object { $_ -match '\S' } | ForEach-Object { Log " diskpart: $_" }
Remove-Item $dpFile2 -Force -ErrorAction SilentlyContinue Remove-Item $dpFile2 -Force -ErrorAction SilentlyContinue
SetProgress "Assigning drive letters..." 30 SetProgress "Formatting USB partition..." 25
Start-Sleep -Seconds 3 Start-Sleep -Seconds 3
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
$partitions = Get-Partition -DiskNumber $diskNum -ErrorAction Stop $partitions = Get-Partition -DiskNumber $diskNum -ErrorAction Stop
Log "Partitions on Disk $diskNum after format: $($partitions.Count)" Log "Partitions on Disk $diskNum after creation: $($partitions.Count)"
foreach ($p in $partitions) { foreach ($p in $partitions) {
Log " Partition $($p.PartitionNumber) Type=$($p.Type) Letter=$($p.DriveLetter) Size=$([math]::Round($p.Size/1MB))MB" Log " Partition $($p.PartitionNumber) Type=$($p.Type) Letter=$($p.DriveLetter) Size=$([math]::Round($p.Size/1MB))MB"
} }
$winpePart = $partitions | Where-Object { $_.Type -eq "Basic" } | Select-Object -Last 1 $winpePart = $partitions | Where-Object { $_.Type -eq "Basic" } | Select-Object -Last 1
if (-not $winpePart) { if (-not $winpePart) {
throw "Could not find the WINPE (Basic) partition on Disk $diskNum after format." throw "Could not find the Basic partition on Disk $diskNum after creation."
} }
# Format using Format-Volume (reliable on fresh drives; diskpart format fails
# with 'no volume selected' when the partition has never been formatted before)
Log "Formatting Partition $($winpePart.PartitionNumber) as FAT32 (label: $volLabel)..."
Get-Partition -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber |
Format-Volume -FileSystem FAT32 -NewFileSystemLabel $volLabel -Force -Confirm:$false | Out-Null
Log "Partition $($winpePart.PartitionNumber) formatted as FAT32."
SetProgress "Assigning drive letters..." 30
Start-Sleep -Seconds 2
Update-Disk -Number $diskNum -ErrorAction SilentlyContinue
try { Remove-PartitionAccessPath -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -AccessPath "$($winpePart.DriveLetter):" -ErrorAction SilentlyContinue } catch {} try { Remove-PartitionAccessPath -DiskNumber $diskNum -PartitionNumber $winpePart.PartitionNumber -AccessPath "$($winpePart.DriveLetter):" -ErrorAction SilentlyContinue } catch {}
$usbLetter = Get-FreeDriveLetter $usbLetter = Get-FreeDriveLetter
if (-not $usbLetter) { throw "No free drive letters (D-Z) available to assign to the USB data partition." } if (-not $usbLetter) { throw "No free drive letters (D-Z) available to assign to the USB data partition." }
@@ -166,6 +188,12 @@ function Invoke-WinUtilISOWriteUSB {
Start-Sleep -Seconds 2 Start-Sleep -Seconds 2
$usbDrive = "${usbLetter}:" $usbDrive = "${usbLetter}:"
$retries = 0
while (-not (Test-Path $usbDrive) -and $retries -lt 6) {
$retries++
Log "Waiting for $usbDrive to become accessible (attempt $retries/6)..."
Start-Sleep -Seconds 2
}
if (-not (Test-Path $usbDrive)) { throw "Drive $usbDrive is not accessible after letter assignment." } if (-not (Test-Path $usbDrive)) { throw "Drive $usbDrive is not accessible after letter assignment." }
Log "USB data partition: $usbDrive" Log "USB data partition: $usbDrive"

View File

@@ -1,26 +0,0 @@
function Test-WinUtilInternetConnection {
<#
.SYNOPSIS
Tests if the computer has internet connectivity
.OUTPUTS
Boolean - True if connected, False if offline
#>
try {
# Test multiple reliable endpoints
$testSites = @(
"8.8.8.8", # Google DNS
"1.1.1.1", # Cloudflare DNS
"208.67.222.222" # OpenDNS
)
foreach ($site in $testSites) {
if (Test-Connection -ComputerName $site -Count 1 -Quiet -ErrorAction SilentlyContinue) {
return $true
}
}
return $false
}
catch {
return $false
}
}

View File

@@ -11,7 +11,7 @@ function Invoke-WPFFixesWinget {
try { try {
Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo" Set-WinUtilTaskbaritem -state "Indeterminate" -overlay "logo"
Write-Host "==> Starting Winget Repair" Write-Host "==> Starting Winget Repair"
Install-WinUtilWinget -Force Install-WinUtilWinget
} catch { } catch {
Write-Error "Failed to install winget: $_" Write-Error "Failed to install winget: $_"
Set-WinUtilTaskbaritem -state "Error" -overlay "warning" Set-WinUtilTaskbaritem -state "Error" -overlay "warning"

View File

@@ -15,12 +15,14 @@ $maxthreads = [int]$env:NUMBER_OF_PROCESSORS
$hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null $hashVars = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'sync',$sync,$Null
$debugVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'DebugPreference',$DebugPreference,$Null $debugVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'DebugPreference',$DebugPreference,$Null
$uiVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'PARAM_NOUI',$PARAM_NOUI,$Null $uiVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'PARAM_NOUI',$PARAM_NOUI,$Null
$offlineVar = New-object System.Management.Automation.Runspaces.SessionStateVariableEntry -ArgumentList 'PARAM_OFFLINE',$PARAM_OFFLINE,$Null
$InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault() $InitialSessionState = [System.Management.Automation.Runspaces.InitialSessionState]::CreateDefault()
# Add the variable to the session state # Add the variable to the session state
$InitialSessionState.Variables.Add($hashVars) $InitialSessionState.Variables.Add($hashVars)
$InitialSessionState.Variables.Add($debugVar) $InitialSessionState.Variables.Add($debugVar)
$InitialSessionState.Variables.Add($uiVar) $InitialSessionState.Variables.Add($uiVar)
$InitialSessionState.Variables.Add($offlineVar)
# Get every private function and add them to the session state # Get every private function and add them to the session state
$functions = Get-ChildItem function:\ | Where-Object { $_.Name -imatch 'winutil|WPF' } $functions = Get-ChildItem function:\ | Where-Object { $_.Name -imatch 'winutil|WPF' }
@@ -350,11 +352,10 @@ $sync["Form"].Add_ContentRendered({
Write-Debug "Unable to retrieve information about the primary monitor." Write-Debug "Unable to retrieve information about the primary monitor."
} }
# Check internet connectivity and disable install tab if offline if ($PARAM_OFFLINE) {
#$isOnline = Test-WinUtilInternetConnection # Show offline banner
$isOnline = $true # Temporarily force online mode until we can resolve false negatives $sync.WPFOfflineBanner.Visibility = [System.Windows.Visibility]::Visible
if (-not $isOnline) {
# Disable the install tab # Disable the install tab
$sync.WPFTab1BT.IsEnabled = $false $sync.WPFTab1BT.IsEnabled = $false
$sync.WPFTab1BT.Opacity = 0.5 $sync.WPFTab1BT.Opacity = 0.5
@@ -486,7 +487,7 @@ $sync["AboutMenuItem"].Add_Click({
Invoke-WPFPopup -Action "Hide" -Popups @("Settings") Invoke-WPFPopup -Action "Hide" -Popups @("Settings")
$authorInfo = @" $authorInfo = @"
Author : <a href="https://github.com/ChrisTitusTech">@christitustech</a> Author : <a href="https://github.com/ChrisTitusTech">@ChrisTitusTech</a>
UI : <a href="https://github.com/MyDrift-user">@MyDrift-user</a>, <a href="https://github.com/Marterich">@Marterich</a> UI : <a href="https://github.com/MyDrift-user">@MyDrift-user</a>, <a href="https://github.com/Marterich">@Marterich</a>
Runspace : <a href="https://github.com/DeveloperDurp">@DeveloperDurp</a>, <a href="https://github.com/Marterich">@Marterich</a> Runspace : <a href="https://github.com/DeveloperDurp">@DeveloperDurp</a>, <a href="https://github.com/Marterich">@Marterich</a>
GitHub : <a href="https://github.com/ChrisTitusTech/winutil">ChrisTitusTech/winutil</a> GitHub : <a href="https://github.com/ChrisTitusTech/winutil">ChrisTitusTech/winutil</a>
@@ -494,6 +495,11 @@ Version : <a href="https://github.com/ChrisTitusTech/winutil/releases/tag/$($sy
"@ "@
Show-CustomDialog -Title "About" -Message $authorInfo Show-CustomDialog -Title "About" -Message $authorInfo
}) })
$sync["DocumentationMenuItem"].Add_Click({
Write-Debug "Documentation clicked"
Invoke-WPFPopup -Action "Hide" -Popups @("Settings")
Start-Process "https://winutil.christitus.com/"
})
$sync["SponsorMenuItem"].Add_Click({ $sync["SponsorMenuItem"].Add_Click({
Write-Debug "Sponsors clicked" Write-Debug "Sponsors clicked"
Invoke-WPFPopup -Action "Hide" -Popups @("Settings") Invoke-WPFPopup -Action "Hide" -Popups @("Settings")

View File

@@ -9,7 +9,8 @@
param ( param (
[string]$Config, [string]$Config,
[switch]$Run, [switch]$Run,
[switch]$Noui [switch]$Noui,
[switch]$Offline
) )
if ($Config) { if ($Config) {
@@ -27,25 +28,10 @@ if ($Noui) {
$PARAM_NOUI = $true $PARAM_NOUI = $true
} }
# Load DLLs $PARAM_OFFLINE = $false
Add-Type -AssemblyName PresentationFramework if ($Offline) {
Add-Type -AssemblyName System.Windows.Forms $PARAM_OFFLINE = $true
}
# Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot
$sync.version = "#{replaceme}"
$sync.configs = @{}
$sync.Buttons = [System.Collections.Generic.List[PSObject]]::new()
$sync.preferences = @{}
$sync.ProcessRunning = $false
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()
$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()
$sync.currentTab = "Install"
$sync.selectedAppsStackPanel
$sync.selectedAppsPopup
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
@@ -80,6 +66,26 @@ if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]:
break break
} }
# Load DLLs
Add-Type -AssemblyName PresentationFramework
Add-Type -AssemblyName System.Windows.Forms
# Variable to sync between runspaces
$sync = [Hashtable]::Synchronized(@{})
$sync.PSScriptRoot = $PSScriptRoot
$sync.version = "#{replaceme}"
$sync.configs = @{}
$sync.Buttons = [System.Collections.Generic.List[PSObject]]::new()
$sync.preferences = @{}
$sync.ProcessRunning = $false
$sync.selectedApps = [System.Collections.Generic.List[string]]::new()
$sync.selectedTweaks = [System.Collections.Generic.List[string]]::new()
$sync.selectedToggles = [System.Collections.Generic.List[string]]::new()
$sync.selectedFeatures = [System.Collections.Generic.List[string]]::new()
$sync.currentTab = "Install"
$sync.selectedAppsStackPanel
$sync.selectedAppsPopup
$dateTime = Get-Date -Format "yyyy-MM-dd_HH-mm-ss" $dateTime = Get-Date -Format "yyyy-MM-dd_HH-mm-ss"
# Set the path for the winutil directory # Set the path for the winutil directory

View File

@@ -5,10 +5,6 @@
<settings pass="windowsPE"> <settings pass="windowsPE">
<component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS"> <component name="Microsoft-Windows-Setup" processorArchitecture="amd64" publicKeyToken="31bf3856ad364e35" language="neutral" versionScope="nonSxS">
<UserData> <UserData>
<ProductKey>
<Key>00000-00000-00000-00000-00000</Key>
<WillShowUI>Always</WillShowUI>
</ProductKey>
<AcceptEula>true</AcceptEula> <AcceptEula>true</AcceptEula>
</UserData> </UserData>
<UseConfigurationSet>false</UseConfigurationSet> <UseConfigurationSet>false</UseConfigurationSet>

View File

@@ -943,13 +943,19 @@
</Window.Resources> </Window.Resources>
<Grid Background="{DynamicResource MainBackgroundColor}" ShowGridLines="False" Name="WPFMainGrid" Width="Auto" Height="Auto" HorizontalAlignment="Stretch"> <Grid Background="{DynamicResource MainBackgroundColor}" ShowGridLines="False" Name="WPFMainGrid" Width="Auto" Height="Auto" HorizontalAlignment="Stretch">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/> <RowDefinition Height="Auto"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Grid Grid.Row="0" Background="{DynamicResource MainBackgroundColor}"> <!-- Offline banner -->
<Border Name="WPFOfflineBanner" Grid.Row="0" Background="#8B0000" Visibility="Collapsed" Padding="6,4">
<TextBlock Text="&#x26A0; Offline Mode - No Internet Connection" Foreground="White" FontWeight="Bold"
HorizontalAlignment="Center" FontSize="13" Background="Transparent"/>
</Border>
<Grid Grid.Row="1" Background="{DynamicResource MainBackgroundColor}">
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/> <!-- Navigation buttons --> <ColumnDefinition Width="Auto"/> <!-- Navigation buttons -->
<ColumnDefinition Width="*"/> <!-- Search bar and buttons --> <ColumnDefinition Width="*"/> <!-- Search bar and buttons -->
@@ -1174,6 +1180,7 @@
</MenuItem> </MenuItem>
<Separator/> <Separator/>
<MenuItem FontSize="{DynamicResource ButtonFontSize}" Header="About" Name="AboutMenuItem" Foreground="{DynamicResource MainForegroundColor}"/> <MenuItem FontSize="{DynamicResource ButtonFontSize}" Header="About" Name="AboutMenuItem" Foreground="{DynamicResource MainForegroundColor}"/>
<MenuItem FontSize="{DynamicResource ButtonFontSize}" Header="Documentation" Name="DocumentationMenuItem" Foreground="{DynamicResource MainForegroundColor}"/>
<MenuItem FontSize="{DynamicResource ButtonFontSize}" Header="Sponsors" Name="SponsorMenuItem" Foreground="{DynamicResource MainForegroundColor}"/> <MenuItem FontSize="{DynamicResource ButtonFontSize}" Header="Sponsors" Name="SponsorMenuItem" Foreground="{DynamicResource MainForegroundColor}"/>
</StackPanel> </StackPanel>
</Border> </Border>
@@ -1192,7 +1199,7 @@
</Grid> </Grid>
</Grid> </Grid>
<TabControl Name="WPFTabNav" Background="Transparent" Width="Auto" Height="Auto" BorderBrush="Transparent" BorderThickness="0" Grid.Row="1" Grid.Column="0" Padding="-1"> <TabControl Name="WPFTabNav" Background="Transparent" Width="Auto" Height="Auto" BorderBrush="Transparent" BorderThickness="0" Grid.Row="2" Grid.Column="0" Padding="-1">
<TabItem Header="Install" Visibility="Collapsed" Name="WPFTab1"> <TabItem Header="Install" Visibility="Collapsed" Name="WPFTab1">
<Grid Background="Transparent" > <Grid Background="Transparent" >