This blog will cover the topic on how to deploy drivers using Setupconfig.ini for feature update through SCCM. Deploying Feature update through SCCM is a process equivalent to deploying a patch where feature update will be installed on a system based upon language and OS version check.

Introduction

The downside of this approach is, there will be few failures in your environment and system might get crash after restart (while applying the feature update). You might see blue screen error which is BSOD (Blue screen of death). There could be multiple reason, but one of the dominant reason could be old drivers having issues.

Why we need to get Drivers installed during Feature Update

As discussed previously, to prevent BSOD error which might crash your OS while trying to upgrade the OS, we need to have the latest drivers applied along with the Feature Update patch. Deploying a driver package through task sequence and in-place upgrade task sequence is completely different when compared to deploying drivers to feature update.

When drivers are incorporated along with feature update deployment through SCCM, drivers are injected during upgrade process and will handle the scenario where old driver might cause issue as we upgrading the drivers as well.

What is required for provisioning Drivers

There are 2 requirements for provisioning the Drivers:

  1. SCCM Package with custom SetupConfig.ini and SetupComplete.cmd files

SetupConfig.ini – is the configuration file containing parameters which is then passed to Windows setup.exe. Few of the parameters we can use are: Priority, ShowOOBE, InstallDrivers, DynamicUpdate, Compat etc. For complete list follow Windows setup command-line options

We can customize this file to control OS Upgrade process. If you face any error while deploying SetupConfig.ini, follow Troubleshoot Windows Feature Update issue when SetupConfig.ini in use

SetupComplete.cmd – is custom Windows setup scripts which executes during or after Windows Setup process. We can control post processing steps through this file which will be applying right after OS Upgrade.

2. Prestage of Driver Package (Task Sequence)

We need to create custom Task Sequence with Download Package Content step for each model.

Create SCCM Package with custom SetupConfig.ini and SetupComplete.cmd files

Create SCCM Package with following folder structure:
Folder : WSUS
Folder : FeatureUpdate
File : Provision.ps1

DeployDriverWithFeatureUpdate 01

Create Program with following command line:

powershell -executionpolicy bypass -file Provision.ps1

WSUS folder will contain SetupConfig.ini with following content under this file:

[SetupConfig]
ShowOOBE=None
Priority=Normal
InstallDrivers=C:\windows\Temp\FeatureUpdate\Drivers
PostOOBE=C:\Windows\temp\FeatureUpdate\Script\SetupComplete.cmd
SetupConfig.ini

Parameters explained:

We don’t want to show OOBE after upgrade hence disabling ShowOOBE, keeping Priority as Normal, we can set as Low as well, InstallDrivers pointing to a location where Drivers will be prestaged.

PostOOBE pointing to SetupComplete.cmd, this file will be used to trigger the script / command right after OS Upgrade.

Another folder Script has following folder structure: FeatureUpdate\Script\SetupComplete.cmd:

SetupComplete.cmd contains following command:

Powershell.exe -ExecutionPolicy Bypass -Command "Remove-Item -Path 'C:\Windows\temp\FeatureUpdate' -Recurse -Force"
SetupComplete.cmd

This will remove all the content from the system once OS Upgrade is completed.

We can utilize SetupComplete.cmd for other activities as well such as applying layout, deleting /adding folders/files, installing applications etc.

Root of the folder is having Provision.ps1 file with following content:

Copy-Item -Path .\FeatureUpdate -Destination C:\Windows\temp -Recurse
Copy-Item -Path .\WSUS -Destination C:\Users\Default\AppData\Local\Microsoft\Windows -Recurse

We are copying 2 folders by this command:
1. FeatureUpdate folder to c:\Windows\temp\FeatureUpdate
2. WSUS folder to C:\Users\Default\AppData\Local\Microsoft\Windows\WSUS

Note: SetupConfig.ini file should be there at specific location ie.  C:\Users\Default\AppData\Local\Microsoft\Windows\WSUS\SetupConfig.ini. This folder (WSUS) will be deleted once OS Upgrade is completed successfully.

Prestage of Driver Package (Task Sequence)

Create a custom task sequence and add the step Download Package Content, add the driver package for a specific model, and use custom path as C:\windows\Temp\FeatureUpdate\Drivers. This is the same location we have used in SetupConfig.ini

DeployDriverWithFeatureUpdate 05

Not to forget setting WMI query for that specific model. As I am using VM, I have used:

select * from win32_computersystem where Model = "Virtual Machine"
DeployDriverWithFeatureUpdate 06

Deploy Package, Task Sequence and Feature Update

Deploy Feature Update scripts package and Task Sequence to a collection.

Also, deploy Feature update to Windows 10 (business editions), version 1909, en-us x64 to the same collection by making it available.

DeployDriverWithFeatureUpdate 07

Install Package and Task Sequence on client

Login to the client, we are using Windows 10 1709 version which will be upgrade to 1909. Launch Software Center and initiate install for Feature Update Scripts and Driver Package Prestage.

Once installation is completed, we can verify the folder structure with all required files.

DeployDriverWithFeatureUpdate 08

Initiate Feature Update and monitor the installation

Navigate to Software Center > Updates, select Feature update to Windows 10 (business editions), version 1909, en-us x64, and click on Install. Installation will initiate.

DeployDriverWithFeatureUpdate 09

You can monitor the status through updatesdeployment.log (c:\windows\ccm\logs) and C:\$WINDOWS.~BT\Sources\Panther\setupact.log.

updatesdeployment.log

Wait for a while once installation is showing 100% in updatesdeployment.log and Software Center showing Restart option. Important information to look into updatesdeployment.log is:

Update (Site_84B69E3C-60D9-4A47-9633-DA7640BB4459/SUM_0af47e05-17cb-4756-8610-09ce486df1ba) Progress: Status = ciStateInstalling, PercentComplete = 100, DownloadSize = 3449692, Result = 0x0
Update (Site_84B69E3C-60D9-4A47-9633-DA7640BB4459/SUM_0af47e05-17cb-4756-8610-09ce486df1ba) Progress: Status = ciStatePendingSoftReboot, PercentComplete = 0, DownloadSize = 3449692, Result = 0x0
CTargetedUpdatesManager::AdjustCompletedState - complete install OS upgrade with pending commit

We can see installation is done and ready to restart to apply new OS. At this moment we are still on old OS.

DeployDriverWithFeatureUpdate 11

Analyse setupact.log for injecting of driver and OS Upgrade status

Open setupact.log  (Location: C:\$WINDOWS.~BT\Sources\Panther)

Providing you most important information what I can see in the logs:

2020-06-12 14:10:29, Info                  MOUPG  SetupHost::Initialize: CmdLine                = [/PreDownload /Update /Quiet  /progressCLSID ce2e48fb-98c7-40f4-b7dc-019c44834789 /ReportId {EF94D1FB-CCBF-498A-93CB-1034AC95C2E6}.202 "/ClientId" "da12d64f-5f56-4482-804c-b0b7659dddaf" "/CorrelationVector" "1Nk1F48oMUeKNfvm.9.0.2"   /ShowOOBE None /Priority Normal /InstallDrivers C:\windows\Temp\FeatureUpdate\Drivers /PostOOBE C:\Windows\temp\FeatureUpdate\Script\SetupComplete.cmd]
DeployDriverWithFeatureUpdate 12
Parameter InstallDrivers pointing to desired location what we used in SetupConfig.ini
Parameter PostOOBE pointing to desired SetupComplete.cmd

Copying Drivers folder to C:\$WINDOWS.~BT\Drivers\User

Drivers placed at C:\$WINDOWS.~BT\Drivers\User location will be injected during OS Upgrade process. Hence, we can see drivers are automatically getting copied from our specified location to C:\$WINDOWS.~BT\Drivers\User location.

DeployDriverWithFeatureUpdate 13
2020-06-12 14:13:06, Info                  MOUPG  SetupManager: Copying user-provided driver install package files from [C:\windows\Temp\FeatureUpdate\Drivers] -> [C:\$WINDOWS.~BT\Drivers\User]...
DeployDriverWithFeatureUpdate 14

Injecting driver into NewOS Upgrade process

As I have used a Driver package containing 2 drivers only, it would be easy for me to demonstrate what is happening behind the scenes. 2 drivers which I have used is tpt100x.inf & tp2p100x.inf.

DeployDriverWithFeatureUpdate 15

Setupact.log will show the successful injection of drivers, which can be seen as:

DRVINST: Successfully injected driver package in the new OS:
'C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\Temp\{9833398B-DBE6-4926-9B96-F36353B45A75}\0811fd6a-69cd-47be-9a5d-feea0f35baed\tp2p100x.inf'. - CDriverPackage::InstallEx2
DRVINST: Successfully injected driver package in the new OS: C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\Temp\{9833398B-DBE6-4926-9B96-F36353B45A75}\0811fd6a-69cd-47be-9a5d-feea0f35baed\tbt100x.inf
DISM Driver Manager: PID=916 TID=1076 Successfully proccessed driver package 'C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\Temp\{9833398B-DBE6-4926-9B96-F36353B45A75}\0811fd6a-69cd-47be-9a5d-feea0f35baed\tbt100x.inf'. - CDriverPackage::InstallEx2
DeployDriverWithFeatureUpdate 16

Injecting driver process gets copied to drivers repository to be applied during next restart phase

Once the injecting driver process is completed, it doesn’t mean drivers are injecting right now. Injection process means, drivers will be copied to the new OS Driverstore’s filerepository folder ie C:\$WINDOWS.~BT\NewOS\Windows\System32\DriverStore\FileRepository

We can see the all drivers which will be injected during OS Upgrade process, this shows all previous drivers which is part of the OS + new drivers which we are injecting. I can see my 2 drivers copied at this location:

DeployDriverWithFeatureUpdate 17a

We can see total count is 658 folders (or we can say drivers), which consists of 656 old drivers part of the OS and 2 new folders (drivers) which we are going to inject during this process.

DeployDriverWithFeatureUpdate 17b

I compared the same with other Feature Update process where I haven’t used any driver package and I can see 656 folders only, hence a good comparison that this system is having additional drivers to apply during upgrade process.

System ready to restart

We can see in Setupact.log showing :

MIG    Received request to restart the explorer process from context: SYSTEM
DeployDriverWithFeatureUpdate 18

Launch Software Center and click on Restart

OS Upgrade completes successfully with drivers installed

After going through restart process, system will be configured and new OS will be applied along with the drivers.

DeployDriverWithFeatureUpdate 19
DeployDriverWithFeatureUpdate 20

Once you login page you can login to the system and check setupapi.offline.log (Location: setupapi.offline.log):

idb:      Activating driver package 'tbt100x.inf_amd64_e0ed85d16d58f139'.
idb:      Activating driver package 'tp2p100x.inf_amd64_070af6fe5cdea36a'.
set: Driver package tbt100x.inf_amd64_e0ed85d16d58f139 (oem0.inf):
set: Driver package tp2p100x.inf_amd64_070af6fe5cdea36a (oem1.inf):
DeployDriverWithFeatureUpdate 21

We can see new drivers located at C:\Windows\System32\DriverStore\FileRepository

DeployDriverWithFeatureUpdate 22

I hope this would have given you enought insight about what is happening behind the scenes. Let me know if you have any queries.