BSOD Stop Code FAT_FILE_SYSTEM with failure in volmgr.sys when working w/thumb drives


hsehestedt

Well-known member
Guru
VIP
Local time
11:35 PM
Posts
3,306
Location
Texas, USA
OS
Win11 Pro 24H2
BSOD Info Follows. Attached is V2 Log Collector Output.

NOTE: V2 Log Collector output could not be uploaded (size too large). Below is a link to the output placed on OneDrive.

V2 Log Collector Output

I am experiencing a Windows crash dump rather freqently - today it happened probably about 5 times or more. Note that this only happens under a very specific set of circumstances. Outside of that particular circumstance it NEVER happens.

Detailed Information:

The stop code I am receiving is precisely the same thing every time...

Stop Code: FAT_FILE_SYSTEM
What failed: volmgr.sys

Here is what I am doing when the fault occurs...

I have written a program that prepares a thumb drive and makes it bootable. The program first runs diskpart to perform a "clean" operation on the drive, then, depending upon what operation I choose, performs either a "convert gpt" or "convert mbr", creates several partitions both FAT32 and NTFS, and then copies Windows install media to the drive to make a bootable disk.

I cannot see at exactly what point the failure is occurring, but it seems that it is likely when the partitions are being created on the flash drive.

Please note I at first suspected my program as potentially being faulty, however, I have created a batch file that performs many of the same operations and the problem happens there as well.

I cannot say yet with 100% certainty, but I think that the issue only happens if the flash drive is currently GPT and I then perform a "clean" followed by a "convert mbr" on that drive. I believe that it does not happen if the drive is already using an MBR.

What I have tried:

Tried multiple different flash drives of various brands and capacities ranging from 16GB to 256GB in size.
Tried multiple USB ports, both on a hub and direct connection to PC.
Tested with all overclocking disabled.
Tested on 2 laptop running same Windows 11. Interestingly, even though both laptops are slightly out of spec for Win 11 (7th gen and 6th gen i7 CPUs), I could not get the problem to occur on those systems.

Detailed System Specs:

ASUS Prime Z590-A motherboard (FW is at latest version)
Intel Core i7-11700K CPU (11th Gen Rocket Lake / LGA 1200 Socket)
SPI TPM 2.0 module
128GB Crucial Ballistix RGB DDR4 3200 MHz DRAM (4 x 32GB)
Corsair iCUE RGB 5000X mid tower case
Noctua NH-D15 chromax.black CPU cooler
Noctua NF-S12A chromax.black.swap case fans (Qty. 7)
Corsair SP RGB Elite case fans (Qty. 3)
Corsair HX850i PSU
Seagate FireCuda 1TB NVMe Gen 4 x 4 SSD
Crucial P5 2TB NVMe Gen 3 x 4 SSD
Western Digital WD80EFAX 8TB NAS HDD (Qty. 2)
Corsair MX200 512GB 2.5” SSD
Corsair MX500 512GB 2.5” SSD
HP Envy 32 monitor featuring 32 inch 2560 x 1440 display
Edifier R1280DB powered speakers

Installed Expansion Cards:

Fenvi WiFi 6E / Bluetooth 5.2 PCIe adapter (uses Intel AX210 WiFi module) (PCIe Slot 3)
ASUS ThunderboltEX 4 PCIe adapter (PCIe Slot 4)

NOTE: No GPU installed at this time, currently using Intel Graphics on-board the CPU.

Operating System:

Windows 11 with updates through October 2021 Patch Tuesday (Oct 12, 2021).
 

My Computers

System One System Two

  • OS
    Win11 Pro 24H2
    Computer type
    PC/Desktop
    Manufacturer/Model
    Kamrui Mini PC, Model CK10
    CPU
    Intel i5-12450H
    Memory
    32GB
    Graphics Card(s)
    No GPU - Built-in Intel Graphics
    Sound Card
    Integrated
    Monitor(s) Displays
    HP Envy 32
    Screen Resolution
    2560 x 1440
    Hard Drives
    1 x 2TB NVMe SSD
    1 x 4TB NVMe SSD
    1 x 4TB 2.5" SSD
    PSU
    120W "Brick"
    Keyboard
    Corsair K70 Mechanical Keyboard
    Mouse
    Logitech MX Master 3
    Internet Speed
    1Gb Up / 1 Gb Down
    Browser
    Edge
    Antivirus
    Windows Defender
  • Operating System
    Win11 Pro 23H2
    Computer type
    Laptop
    Manufacturer/Model
    Lenovo ThinkBook 13x Gen 2
    CPU
    Intel i7-1255U
    Memory
    16 GB
    Graphics card(s)
    Intel Iris Xe Graphics
    Sound Card
    Realtek® ALC3306-CG codec
    Monitor(s) Displays
    13.3-inch IPS Display
    Screen Resolution
    WQXGA (2560 x 1600)
    Hard Drives
    2 TB 4 x 4 NVMe SSD
    PSU
    USB-C / Thunderbolt 4 Power / Charging
    Mouse
    Buttonless Glass Precision Touchpad
    Keyboard
    Backlit, spill resistant keyboard
    Internet Speed
    1Gb Up / 1Gb Down
    Browser
    Edge
    Antivirus
    Windows Defender
    Other Info
    WiFi 6e / Bluetooth 5.1 / Facial Recognition / Fingerprint Sensor / ToF (Time of Flight) Human Presence Sensor
A very specific problem and you already did a great job in narrowing down the issue.
Now, why don't you share the batch script here so others can try it out too? I'd be willing to give it a shot on my W11 Test PC.
(Haven't had a BSOD for long, already miss it :D )
 

My Computers

System One System Two

  • OS
    W10 Enterprise LTSC
    Computer type
    PC/Desktop
    Manufacturer/Model
    custom
    CPU
    i7-2700K
    Motherboard
    Gigabyte GA-P67A-D3-B3
    Memory
    24GB
    Graphics Card(s)
    MSI GeForce RTX2060 Super
    Sound Card
    onboard
    Monitor(s) Displays
    Samsung curved
    Screen Resolution
    FHD
    Hard Drives
    Samsung EVO870 SSD 1TB
    Seagate Barracuda HDD 8TB
    PSU
    be quiet 550W
    Case
    CoolerMaster
    Cooling
    be quiet PURE ROCK SLIM BK008
    Keyboard
    KLIM Domination k852
    Mouse
    Logitech standard cordless
    Internet Speed
    10/1 DSL (the fastest line speed available here...)
    Browser
    Mozilla FF 91.2.0esr
    Antivirus
    Defender
    Other Info
    W10 GUI heavily modified with Stardock Blinds "7 for 10" skin and Startmenu.
    No MS Account and no MS apps.
    I upgraded to W10 only for gaming purposes, otherwise I'd kept my beloved W7 Ultimate x64
  • Operating System
    W11 Pro
    Computer type
    PC/Desktop
    Manufacturer/Model
    custom
    CPU
    Intel Core i5-2500
    Motherboard
    Gigabyte PH67A-D3-B3
    Memory
    4GB
    Graphics card(s)
    MSI Geforce 1050Ti
    Sound Card
    onboard
    Monitor(s) Displays
    FujitsuSiemens 19"
    Screen Resolution
    1280x1024 (oldschool 4:3)
    Hard Drives
    Samsung EVO850 SSD 250GB + Samsung 1TB HDD
    PSU
    be quiet 550W
    Case
    Mars MCNW ATX Gaming
    Cooling
    be quiet PURE ROCK SLIM BK008
    Mouse
    oldschool Dell optical wired
    Keyboard
    Dell German 102
    Internet Speed
    slow DSL, 10/1Mbps, but thats the best offer here
    Browser
    Mozilla 91.2.0esr
    Antivirus
    Defender
    Other Info
    This is an older PC for testing new OS,
    Furthermore: 4 Dell/HP laptops on Win7 Ultimate x64, used for NAS, Media server, browsing, workshop and sound studio
Here is a copy of the batch file. Please read the introductory comments in the batch file. The purpose is to create Windows bootable media that can be run on any system (x86 and x64, both BIOS and UEFI based systems) and work with files larger than 4GB. Naturally, some of this no longer applies to Win 11, but it works fine for Win 11 images as well.

NOTE: It's much harder to reproduce with this batch file. My program has a lot more functionality than does this simple batch file and I get the problem to occur far more often with it.

Code:
@echo off

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: This batch file will allow you to create a Windows installation disk. This can be a flash drive or a HD.  ::
:: It is designed to create a drive that will boot on either a BIOS or UEFI based system and it is perfectly ::
:: fine for any files in the installation media to be larger than 4 GB.                                      ::
::                                                                                                           ::
:: Note that Windows 11 is only available in 64-bit editions, while Windows 10 is available in both 32-bit   ::
:: and 64-bit editions. Since this batch file is perfectly capable of creating dual architecture media it is ::
:: perfectly suitable for the creation of both Windows 10 and Windows 11 boot media.                         ::
::                                                                                                           ::
:: Originally created December 2020 by HSehestedt and ZTrucker                                               ::
:: Updates created and maintaned by HSehestedt                                                               ::
:: Last updated September 9, 2021                                                                            ::
::                                                                                                           ::
:: Version 1.09.00                                                                                           ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Explanation of User Customizable Settings ::                                                                   ::
:::::::::::::::::::::::::::::::::::::::::::::::                                                                   ::
:: Set the variables below to customize the behavior of the batch file.                                           ::
::                                                                                                                ::
:: Important: Values are case sensitive.                                                                          ::
::                                                                                                                ::
:: HideDetails - Set to "Y" to hide the details of every file being copied. Set to "N" or anything other than     ::
::    "Y" to show the detailed copy status. May be helpful for troubleshooting.                                   ::
::                                                                                                                ::
:: Partition1Size - This specifies the size in MB to create the first FAT32 partition. Suggestion: 2000 MB        ::
::    (equal to 2GB) should be a good value for almost any situation. Use a number only (no MB after the number). ::
::                                                                                                                ::
:: Part2SizeLimit - Set to either "N" or a numerical value. If you set this to "N", the size of the 2nd           ::
::    partition will be unlimited and will be created with all the remaining space not used by partition 1. If    ::
::    you would like to limit the size of the partition, specify a size in MB to create this partition.           ::
::    Note: 1 GB would be 1000 and 1 TB would be 1000000 (DON'T USE A COMMA IN VALUE!). Limiting the size is      ::
::    useful if you want to add other partitions to the drive. For example, I have a flash drive that I can       ::
::    install Windows from, but it also has another partition that is BitLocker protected with all my software    ::
::    applications, personal documents, etc.                                                                      ::
::                                                                                                                ::
:: Part2FS - This sets the filesystem type to use on the 2nd partition. Either exFAT or NTFS can be specified.    ::
::    Set this value to either "NTFS" or "exFAT". CAUTION: This IS case sensitive.                                ::
::                                                                                                                ::
:: Partition1Name - This is the volume label to give the first partition. Since this is a FAT32 partition, the    ::
::    volume label is limited to 11 characters.                                                                   ::
::                                                                                                                ::
:: Partition2Name - This is the volume label to give the second partition. If you choose to use exFAT you are     ::
::    limited to 11 characters. With NTFS you have up to 32 characters.                                           ::
::                                                                                                                ::
:: PartType - Set to either MBR or GPT. Normally, leave this set to MBR. An MBR partition type will allow for the ::
::    greatest compatibility with both BIOS and UEFI based systems. However, it is limited to disks with up to    ::
::    2TB in size. If you plan to use a disk larger than 2TB you must specify a GPT partition type. Please be     ::
::    aware that doing this will limit compatibility so that it will not work on BIOS based systems.              ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

set HideDetails=N
set Partition1Size=2000
set Part2SizeLimit=N
set Part2FS=NTFS
set Partition1Name=PAR-1-FAT32
set Partition2Name=PAR-2-%Part2FS%
set PartType=MBR

:start

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: If the user wants to hide the details of files being copied, we append a "/nfl /ndl" to the end     ::
:: of robocopy commands. By setting a flag to either nothing or to "/nfl /ndl" we can use the same     ::
:: commands and the variable "flag" at the end of each command will determine how the command behaves. ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if %HideDetails%==Y (
set flag=/nfl /ndl
) ELSE (
set flag=
)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Enable Delayed Expansion and Extensions, and change to the directory where the batch file is located. ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

setlocal enabledelayedexpansion
setlocal enableextensions
cd /d %~dp0

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Check to see if this batch file is being run as Administrator. If it is not, then rerun the batch file ::
:: automatically as admin and terminate the intial instance of the batch file.                            ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

(Fsutil Dirty Query %SystemDrive%>Nul)||(PowerShell start """%~f0""" -verb RunAs & Exit /B)

::::::::::::::::::::::::::::::::::::::::::::::::
:: End Routine to check if being run as Admin ::
::::::::::::::::::::::::::::::::::::::::::::::::

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: We reach this point once the batch file is run as admin ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Change the console mode to 120 columns wide by 25 lines high ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

mode con: cols=120 lines=25

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Ask user for location of mounted ISO image or the directory containing the Windows files ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

cls
echo Introduction
echo ============
echo.
echo This batch file will create a bootable flash drive from a mounted Windows ISO image or an image extracted to disk.
echo If you are using an ISO image, mount it before you continue by double-clicking the ISO image and note the drive
echo letter to which it is mounted.
echo.
echo You will be asked if you want to wipe the destination disk or perform a refresh operation. If this is the first
echo time preparing the disk, use the WIPE option. Be aware that this will destroy ALL data currently on the disk^^!
echo.
echo If you choose the REFRESH option, you will be asked for the drive letter of the two partitions previously
echo created on the disk. We will then replace the files on these partitions with those from the source that you
echo specify. This is especially helpful if you create additional partitions on the disk because it will leave
echo those partitions intact.
echo.
pause
cls
echo Do you want to perform a WIPE operation or a REFRESH operation?
echo.
choice /C WR /N /M "Press W or R to respond:"
if errorlevel 2 set WipeRefresh=REFRESH & goto GetSourcePath
if errorlevel 1 set WipeRefresh=WIPE & goto GetSourcePath

:GetSourcePath

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Get the path to the Windows source files.                           ::
:: Tip: The path can end with or without a backslash (\). For example, ::
:: either D:, D:\, D:\ISO_Files, D:\ISO_Files\ are all valid paths.    ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

cls
echo Enter the path to the SOURCE where your Windows files are located below. Example: E:\
echo.
:GetSourcePath
set /p SourcePath="Enter source path: "

:: Add a trailing backslash (\) if one does not exist

IF NOT "%SourcePath:~-1%"=="\" (
set SourcePath=%SourcePath%\
)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Any valid Windows boot media will have a file called "boot\bootfix.bin" on the drive. This is true for both ::
:: single architecture images (x64 or x86) or for images with dual architectures. We will do a simple check to ::
:: see if such a file exists as a basic test for a valid source image location.                                ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if NOT EXIST %SourcePath%boot\bootfix.bin (
cls
echo The location that you specified does not contain a valid Windows image. Please try another location.
echo If you are specifying a location on disk, please be sure to specify the location to the root of the
echo Windows image. If you are using an ISO image, you should double-click the ISO image to mount it and
echo note the drive letter to which it was mounted.
echo.
goto GetSourcePath
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: The directory structure for a dual architecture image (one that has BOTH x64 and x86 images) will include    ::
:: \x64 and \x86 folders. In order for us to properly handle this, we need to determine if the source specified ::
:: is a single of dual architecture image. To do so, we will simply check for the existance on a \x64 folder.   ::
:: The variable Architecture will be set to either SINGLE or DUAL.                                              ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if exist %SourcePath%\x64 (
set Architecture=DUAL
) ELSE (
set Architecture=SINGLE
)

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: If a refresh operation was selected, then we need to ask the user for the drive letter associated ::
:: with the partitions. Otherwise, we need to identify what disk will be wiped.                      ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

If %WipeRefresh%==WIPE goto GetDiskNum

:GetPar1Letter

cls
echo Please enter the drive letter of the FIRST partition (the FAT32 partition) on the disk that we will refresh. Please
echo enter a drive letter only with no colon (:).
echo.
set /P Partition1="Drive letter of FIRST partition: "

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: As a safety check, verify that the first partition has a file \boot\bootfix.bin ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if exist %Partition1%:\boot\bootfix.bin goto GetPar2Letter
cls
echo ERROR! Either the drive letter you specified does not exist or it does not seem to contain a previously
echo created partition with suitable Windows installation files.
echo.
echo Please verify that you have specified the correct drive letter.
echo.
pause
goto GetPar1Letter

:GetPar2Letter

cls
echo Please enter the drive letter of the SECOND partition (the exFAT or NTFS partition) on the disk that we will
echo refresh. Please enter a drive letter only with no colon (:).
echo.
set /P Partition2="Drive letter of SECOND partition: "

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: As a safety check, verify that the second partition has either a \Sources or a \x64 folder ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if exist %Partition2%:\Sources goto Par2Valid
if exist %Partition2%:\x64 goto Par2Valid

cls
echo ERROR! Either the drive letter you specified does not exist or it does not seem to contain a previously
echo created partition with suitable Windows installation files.
echo.
echo Please verify that you have specified the correct drive letter.
echo.
pause
goto GetPar2Letter

:Par2Valid

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Since we are performing a refresh operation, there is no need for us to get a disk number. We will ::
:: skip that and proceed to the summary screen.                                                       ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

goto Summary

:GetDiskNum

:::::::::::::::::::::::::::::::::::::::::::::::::
:: Display a list of disks seen by the system. ::
:::::::::::::::::::::::::::::::::::::::::::::::::

cls
(echo list disk
echo exit
) | diskpart

echo.
echo Above is a list of disks connected to your system. Scroll up if the list is too long.
echo CAUTION: *MAKE SURE* that you specify the correct disk because it will be erased. Press CTRL-C to abort.
echo.
set /p DiskID="Enter the disk number for the DESTINATION disk (Enter only the number and press ENTER): "

if [%DiskID%] EQU [] Goto GetDiskNum

:Summary

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Display a summary of options that will be used and get confirmation ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

cls
echo Summary of options you have selected:
echo.

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: These summary items apply to both WIPE and REFRESH operations ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

echo Path for the source files: %SourcePath%

if %HideDetails%==Y (
echo File copy status details WILL NOT be displayed
) ELSE (
echo File copy status details WILL be displayed
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: The summary items below apply only to WIPE operations, so if a ::
:: REFRESH is being performed, skip this section                  ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if %WipeRefresh%==REFRESH goto RefreshSummary

echo Drive number to make bootable: %DiskID%
echo Partition type: %PartType%
echo Partition 1 size: %Partition1Size% MB
echo Partition 2 filesystem type: %Part2FS%

if NOT %Part2SizeLimit%==N (
echo Partition 2 size: %Part2SizeLimit% MB
) ELSE (
echo Partition 2 size: Use all remaining space
)

echo Partition 1 volume label: %Partition1Name%
echo Partition 2 volume label: %Partition2Name%

goto GetConfirmation

:RefreshSummary

::::::::::::::::::::::::::::::::::::::::::::::::::::
:: These items apply only to a REFRESH operation. ::
::::::::::::::::::::::::::::::::::::::::::::::::::::

echo Drive letter of FIRST partition to refresh: %Partition1%:
echo Drive letter of SECOND partition to refresh: %Partition2%:

:GetConfirmation

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Time to get final confirmation from user. If the user does not confirm ::
:: that everything is correct, show some possible resolutions.            ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

echo.
choice /C YN /N /M "Is this correct? (Press Y or N to respond):"
if errorlevel 2 (
cls
echo.
echo        Symptom                                            Corrective Action
echo        =======                                            =================
echo Source path is wrong:                 Run the program again and respond with the correct path
echo Wrong drive number for a WIPE:        Run the program again and respond with the correct drive number
echo Wrong drive letters for a REFRESH:    Run the program again and respond with the correct drive letters
echo File copy status display incorrect:   Change the setting of "HideDetails" at start of program
echo Wrong partition sizes:                Change the setting of "Partition1Size" or "Part2SizeLimit" at start of program
echo Wrong volume labels for a WIPE:       Change the setting of "Partition1Name" or "Partition2Name" at start of program
echo Wrong partition type:                 Change the setting of "PartType" at start of program
echo.
pause
exit
)

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: We are creating 2 partions. A FAT32 partition and an exFAT or NTFS partition. We only need the sources   ::
:: folder on the exFAT or NTFS partition. On the FAT32 partition, we want everything else. We also want the ::
:: single file called BOOT.WIM in the sources folder on the FAT32 partition.                                ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

cls
if %WipeRefresh%==WIPE echo We are partitioning the destination drive and copying files.
if %WipeRefresh%==REFRESH echo We are formatting drives %Partition1%: and %Partition2%:    and copying files. Other partitions will be left alone.
echo Please be patient^^! This can take a while especially if your drive is slow.
echo.

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: If we are performing a REFRESH, then there are a lot of steps that we can skip. ::
:: As a result, we will skip to the CopyOperations section.                     ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if %WipeRefresh%==REFRESH goto CopyOperations

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: We will first wipe the selected disk. This will free up any drive letters currently used by that disk. ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

(echo select disk %DiskID%
echo clean
echo convert %PartType%
echo rescan
echo exit
) | diskpart > nul

::::::::::::::::::::::::::::::::::::::::::::::::
:: Determine the first available drive letter ::
::::::::::::::::::::::::::::::::::::::::::::::::

for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if not exist %%a:\nul (
set Partition1=%%a
goto DriveLetter1Found
)
:DriveLetter1Found

echo The first partition will be assigned drive letter %Partition1%: and will be formatted with FAT32.

(echo select disk %DiskID%
echo create partition primary size=%Partition1Size%
echo select partition 1
echo format fs=fat32 quick
echo assign letter=%Partition1%
echo active
echo rescan
echo exit
) | diskpart > nul

:::::::::::::::::::::::::::::::::::::::::::::::
:: Determine the next available drive letter ::
:::::::::::::::::::::::::::::::::::::::::::::::

for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if not exist %%a:\nul (
set Partition2=%%a
goto DriveLetter2Found
)
:DriveLetter2Found
echo The second partition will be assigned drive letter %Partition2%: and will be formatted with %Part2FS%.
echo.

if %Part2SizeLimit%=="N" goto NoSizeLimit

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: User has elected to create the second partition with a specific size ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

(echo select disk %DiskID%
echo create partition primary size=%Part2SizeLimit%
echo format fs=%Part2FS% quick
echo assign letter=%Partition2%
echo rescan
echo exit
) | diskpart > nul

:NoSizeLimit

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: User has elected create the second partition with all remaining space ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

(echo select disk %DiskID%
echo create partition primary
echo format fs=%Part2FS% quick
echo assign letter=%Partition2%
echo rescan
echo exit
) | diskpart > nul

:PartitionsCreated

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Set volume labels on the two partitions that we just created. ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

label %Partition1%:%Partition1Name%
label %Partition2%:%Partition2Name%

:CopyOperations

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: This section is for the copy operations from SOURCE to DESTINATION ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Technical Notes:                                                                                                 ::
::                                                                                                                  ::
:: Some flash drives present themselves as a fixed disk and as a result they my have a recyle bin folder on them.   ::
:: We are excluding the system folders which includes the recycle bin from the following operation. The /njh and    ::
:: /njs switches prevent robocopy from displaying the header and summary information. If you want to stop robocopy  ::
:: from displaying file copy progress just add a /nfl /ndl (No File Listing and No Directory Listing) to each       ::
:: robocopy command. Note that if the user elected to hide details of the copy operation, then the variable "flag"  ::
:: will be set to "/nfl /ndl" which will hide the directory and file listings.                                      ::
::                                                                                                                  ::
:: For reasons unknown to me, sometimes a path enclosed in quotes does not work in robocopy unless you add a        ::
:: trailing space. In the below commands I found this to be true only on the first robocopy command but I've added  ::
:: the space to all commands for consistency. We need the quotes just in case a path with spaces in the name is     ::
:: specified.                                                                                                       ::
::                                                                                                                  ::
:: It was previously necessary to create a file named ei.cfg in the \Sources foler. Technically, this file is only  ::
:: needed if you are NOT using an AUTOUNATTEND.XML answer file, but it won't hurt to have it there anyway. However, ::
:: in my testing, it seems that this file is no longer necessary. As a result, the code to create that file is      ::
:: commented out below but I have not removed it just in case it is needed again.                                   ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

if %Architecture%==DUAL goto DualArchitecture

:: Copying files to the FAT32 partition

robocopy "%SourcePath% " %Partition1%:\ /mir /xd sources "system volume information" $recycle.bin /njh /njs %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler1
robocopy "%SourcePath%sources " %Partition1%:\sources boot.wim /njh /njs %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler1

:: Copying files to the exFAT or NTFS partition

robocopy "%SourcePath%sources " %Partition2%:\sources /mir /njh /njs /xf boot.wim %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler2
robocopy %Partition1%:\ %Partition2%:\ /mov autounattend*.xml %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler2

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Technical note: It was previously necessary to create a file named ei.cfg in the \Sources foler. Technically,  ::
:: this file is only needed if you are NOT using an AUTOUNATTEND.XML answer file, but it won't hurt to have it    ::
:: there anyway. However, in my testing, it seems that this file is no longer necessary. As a result, the code to ::
:: create that file is commented out below but I have not removed it just in case it is needed again.             ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: echo [CHANNEL] > %Partition2%:\sources\ei.cfg
:: echo Retail >> %Partition2%:\sources\ei.cfg

goto DoneCopying

:DualArchitecture

:: Copying files to the FAT32 partition

robocopy "%SourcePath% " %Partition1%:\ /mir /xd sources x64 x86 "system volume information" $recycle.bin /njh /njs %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler1
robocopy "%SourcePath%x64\sources " %Partition1%:\x64\sources boot.wim /njh /njs %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler1
robocopy "%SourcePath%x86\sources " %Partition1%:\x86\sources boot.wim /njh /njs %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler1

:: Copying files to the exFAT or NTFS partition

robocopy "%SourcePath%x64\sources " %Partition2%:\x64\sources /mir /njh /njs /xf boot.wim %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler2
robocopy "%SourcePath%x86\sources " %Partition2%:\x86\sources /mir /njh /njs /xf boot.wim %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler2
robocopy %Partition1%:\ %Partition2%:\ /mov autounattend*.xml %flag%
if %ERRORLEVEL% gtr 3 goto ErrorHandler2

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Technical note: It was previously necessary to create a file named ei.cfg in the \Sources foler. Technically,  ::
:: this file is only needed if you are NOT using an AUTOUNATTEND.XML answer file, but it won't hurt to have it    ::
:: there anyway. However, in my testing, it seems that this file is no longer necessary. As a result, the code to ::
:: create that file is commented out below but I have not removed it just in case it is needed again.             ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: echo [CHANNEL] > %Partition2%:\x64\sources\ei.cfg
:: echo Retail >> %Partition2%:\x64\sources\ei.cfg

:: echo [CHANNEL] > %Partition2%:\x86\sources\ei.cfg
:: echo Retail >> %Partition2%:\x86\sources\ei.cfg

:DoneCopying

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Inform the user that we are done. Also, as a precaution, check to see if an ::
:: unattended setupanswer file is present and warn the user if it is.          ::
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

cls
echo All operations have been completed.
echo.

if exist %Partition2%:\autounattend.xml (
echo ^^!CAUTION^^! An unattended setup file ^(autounattend.xml^) is present on the 2nd partition.
echo As a result, if you boot from this disk, an unattended installation will begin. This has
echo the potential to wipe out the contents of disks attached to your system without warning.
echo.
echo It might be a wise idea to carefully label the bootable media to reflect this situation.
echo As an alternative, consider temporarily renaming the autounattend.xml to something else.
echo.
)
pause

:END

exit


:::::::::::::::::::::::::::::
:: Error Handling Routines ::
:::::::::::::::::::::::::::::

:ErrorHandler1
cls
echo There was an error copying files to partition #1. Please verify that partition #1 has sufficient space available.
echo Please correct the situation and run the script again. If you are changing the partition sizes, then you will
echo need to use the WIPE operation to create new partitions with the newly specified sizes.
echo.
pause
goto END

:ErrorHandler2
cls
echo There was an error copying files to partition #2. Please verify that partition #2 has sufficient space available.
echo Please correct the situation and run the script again. If you are changing the partition sizes, then you will
echo need to use the WIPE operation to create new partitions with the newly specified sizes.
echo.
pause
goto END
 

My Computers

System One System Two

  • OS
    Win11 Pro 24H2
    Computer type
    PC/Desktop
    Manufacturer/Model
    Kamrui Mini PC, Model CK10
    CPU
    Intel i5-12450H
    Memory
    32GB
    Graphics Card(s)
    No GPU - Built-in Intel Graphics
    Sound Card
    Integrated
    Monitor(s) Displays
    HP Envy 32
    Screen Resolution
    2560 x 1440
    Hard Drives
    1 x 2TB NVMe SSD
    1 x 4TB NVMe SSD
    1 x 4TB 2.5" SSD
    PSU
    120W "Brick"
    Keyboard
    Corsair K70 Mechanical Keyboard
    Mouse
    Logitech MX Master 3
    Internet Speed
    1Gb Up / 1 Gb Down
    Browser
    Edge
    Antivirus
    Windows Defender
  • Operating System
    Win11 Pro 23H2
    Computer type
    Laptop
    Manufacturer/Model
    Lenovo ThinkBook 13x Gen 2
    CPU
    Intel i7-1255U
    Memory
    16 GB
    Graphics card(s)
    Intel Iris Xe Graphics
    Sound Card
    Realtek® ALC3306-CG codec
    Monitor(s) Displays
    13.3-inch IPS Display
    Screen Resolution
    WQXGA (2560 x 1600)
    Hard Drives
    2 TB 4 x 4 NVMe SSD
    PSU
    USB-C / Thunderbolt 4 Power / Charging
    Mouse
    Buttonless Glass Precision Touchpad
    Keyboard
    Backlit, spill resistant keyboard
    Internet Speed
    1Gb Up / 1Gb Down
    Browser
    Edge
    Antivirus
    Windows Defender
    Other Info
    WiFi 6e / Bluetooth 5.1 / Facial Recognition / Fingerprint Sensor / ToF (Time of Flight) Human Presence Sensor
Update:

I believe that I may have solved the problem or more accurately, I may have worked around the problem.

I don't know what the underlying issue is, but I've made some adjustments to my code. For example, after I partition a drive in DISKPART, I perform a RESCAN operation. This forces diskpart to update its info and introduces a little bit of a delay before we move on. Since making that change, I've tried quite a few trial runs and have not yet had another crash.

It's possible that I've merely gotten lucky so far, but I thought that this might be worth mentioning.
 

My Computers

System One System Two

  • OS
    Win11 Pro 24H2
    Computer type
    PC/Desktop
    Manufacturer/Model
    Kamrui Mini PC, Model CK10
    CPU
    Intel i5-12450H
    Memory
    32GB
    Graphics Card(s)
    No GPU - Built-in Intel Graphics
    Sound Card
    Integrated
    Monitor(s) Displays
    HP Envy 32
    Screen Resolution
    2560 x 1440
    Hard Drives
    1 x 2TB NVMe SSD
    1 x 4TB NVMe SSD
    1 x 4TB 2.5" SSD
    PSU
    120W "Brick"
    Keyboard
    Corsair K70 Mechanical Keyboard
    Mouse
    Logitech MX Master 3
    Internet Speed
    1Gb Up / 1 Gb Down
    Browser
    Edge
    Antivirus
    Windows Defender
  • Operating System
    Win11 Pro 23H2
    Computer type
    Laptop
    Manufacturer/Model
    Lenovo ThinkBook 13x Gen 2
    CPU
    Intel i7-1255U
    Memory
    16 GB
    Graphics card(s)
    Intel Iris Xe Graphics
    Sound Card
    Realtek® ALC3306-CG codec
    Monitor(s) Displays
    13.3-inch IPS Display
    Screen Resolution
    WQXGA (2560 x 1600)
    Hard Drives
    2 TB 4 x 4 NVMe SSD
    PSU
    USB-C / Thunderbolt 4 Power / Charging
    Mouse
    Buttonless Glass Precision Touchpad
    Keyboard
    Backlit, spill resistant keyboard
    Internet Speed
    1Gb Up / 1Gb Down
    Browser
    Edge
    Antivirus
    Windows Defender
    Other Info
    WiFi 6e / Bluetooth 5.1 / Facial Recognition / Fingerprint Sensor / ToF (Time of Flight) Human Presence Sensor
Back
Top Bottom