Files
FFU/FFUDevelopment/Docs/BuildFFUVM_flowchart.md
T
rbalsleyMSFT c135ad0fba Captures FFU directly from host-mounted VHDX
By optimizing and mounting the VHDX directly on the host for image capture, the build process no longer needs to boot the VM into WinPE, create SMB network shares, generate temporary local accounts, or rely on complex Hyper-V switch IP configurations. This streamlines the workflow and eliminates multiple networking and permission-related points of failure.

This change also removes the need to generate and attach WinPE capture media. All related parameters (`ShareName`, `Username`, `VMHostIPAddress`, `CreateCaptureMedia`, `CleanupCaptureISO`), UI controls, capture scripts, and documentation references have been removed or updated to reflect the simplified architecture.
2026-03-26 22:31:08 -07:00

4.1 KiB

graph TD
    subgraph "Start & Initialization"
        A[Start] --> B{Load ConfigFile?};
        B --> C[Process Parameters];
        C --> D{Validate Parameters};
        D --> E{"dirty.txt exists?"};
        E -- Yes --> F[Run Cleanup Routine];
        F --> G["Create new dirty.txt"];
        E -- No --> G;
    end

    G --> H{"-InstallDrivers or -CopyDrivers?"};

    subgraph "Pre-Build Preparations"
        H -- Yes --> I{Driver Source?};
        I -- "-DriversJsonPath" --> J[Download Drivers via JSON in Parallel];
        I -- "-Make and -Model" --> K[Download Drivers for specific Make/Model];
        I -- "Local Folder" --> L[Use Existing Drivers in Drivers Folder];
        
        subgraph "ADK & WinPE"
            M[Check for ADK & WinPE Add-on];
            M --> N{Latest Version Installed?};
            N -- No --> O[Uninstall Old & Install Latest ADK/WinPE];
            N -- Yes --> P[Get ADK Path];
            O --> P;
        end

        Q{"-InstallApps?"};
        subgraph "Application & In-VM Content Preparation"
            direction LR
            R[Check for existing downloaded apps];
            R --> S{Download missing WinGet apps};
            S --> T{"-InstallOffice?"};
            T -- Yes --> U[Download ODT & Office content];
            T -- No --> V[Continue];
            U --> V;
            V --> W["Download in-VM updates: Defender, MSRT, etc."];
            W --> X["Create Apps.iso"];
        end
    end

    J --> M;
    K --> M;
    L --> M;
    H -- No --> M;
    P --> Q;
    Q -- Yes --> R;
    X --> Y;
    Q -- No --> Y{"-AllowVHDXCaching?"};

    subgraph "VHDX Management"
        Y -- Yes --> Z[Check for matching cached VHDX];
        Z --> AA{Cache Hit?};
        AA -- Yes --> AB[Use Cached VHDX];
        AA -- No --> AC[Create New VHDX];
        Y -- No --> AC;

        subgraph "VHDX Creation Workflow"
            AC --> AD{ISOPath provided?};
            AD -- No --> AE[Download Windows ESD media];
            AD -- Yes --> AF[Use provided ISO];
            AE --> AG[Create & Partition VHDX];
            AF --> AG;
            AG --> AH[Apply Base Windows Image to VHDX];
            AH --> AI{"Updates specified? (CU, dotNET, etc.)"};
            AI -- Yes --> AJ[Apply Updates to Offline VHDX];
            AJ --> AK[Run Component Cleanup];
            AI -- No --> AK;
            AK --> AL{"Optional Features specified?"};
            AL -- Yes --> AM[Enable Optional Features];
            AL -- No --> AN[Finalize VHDX Setup];
            AM --> AN;
            AN --> AO{"-AllowVHDXCaching?"};
            AO -- Yes --> AP[Optimize and Copy VHDX to Cache];
            AO -- No --> AQ[Continue];
            AP --> AQ;
        end
    end
    
    AB --> BA;
    AQ --> BA{"-InstallApps?"};

    subgraph "FFU Creation"
        subgraph "VM-Based Capture (-InstallApps)"
            direction LR
            BB[Create Hyper-V VM from VHDX];
            BB --> BE["Start VM: Boots to Audit Mode"];
            BE --> BF[Orchestrator runs: Installs apps, syspreps, shuts down];
            BF --> BG[Host optimizes and remounts VHDX];
            BG --> BH["DISM captures FFU directly from host-mounted VHDX"];
        end

        subgraph "Direct VHDX Capture"
            BI[Capture FFU directly from VHDX using DISM];
        end
    end
    
    BA -- Yes --> BB;
    BA -- No --> BI;

    subgraph "Post-Processing & Media Creation"
        BK{"-InstallDrivers?"};
        BK -- Yes --> BL[Mount FFU & Inject Drivers];
        BK -- No --> BM[Continue];
        BL --> BM;
        BM --> BN{"-Optimize?"};
        BN -- Yes --> BO[Optimize FFU using DISM];
        BN -- No --> BP[Continue];
        BO --> BP;
        BP --> BQ{"-BuildUSBDrive?"};
        BQ -- Yes --> BR[Create WinPE Deployment Media];
        BR --> BS["Partition USB Drive(s)"];
        BS --> BT[Copy FFU, Deploy scripts & other assets to USB];
        BQ -- No --> BU[Continue];
        BT --> BU;
    end

    BH --> BK;
    BI --> BK;

    subgraph "Final Cleanup"
        BU --> BV[Cleanup VM, VHDX, temp files];
        BV --> BW["Remove dirty.txt"];
        BW --> BX[End];
    end