The Deployment Guys

Helping to deploy your world automagically...

Deploying Drivers and Firmware to Surface Pro

Deploying Drivers and Firmware to Surface Pro

  • Comments 39
  • Likes

Important Update - December 9th 2014 - Please do not use the methods outlined in this post to update touch firmware drivers. To exclude the Touch drivers simply remove them from the package of drivers/firmware.

In the last month the Surface Pro team have started releasing driver and firmware packs that include all on the drivers and firmware required for Surface Pro. This pack is a simple zip file that contains all of the drivers as INF files that can be installed with out requiring an executable, which for those of you that have followed my previous posts will know is the way I like to see drivers provided.

Firmware Deployment

Perhaps the coolest thing about this pack is the fact that it includes firmware that is delivered in the form of a driver package. This is possible due to a UEFI feature called capsule packages. These capsule packages can be installed several ways:

  • Published via Windows Update
  • Injected into an offline Windows image
  • Installed into Windows 8 online

Note - They cannot be installed via Windows Software Update Service (WSUS).

The firmware is exposed to the machine as a device under the firmware node in device manager.


To update the firmware manually simply install the driver package on the machine then Windows will then seamlessly take care of the update process for you, ensuring that the correct firmware is applied. Once installed a flag is set for the loader and on restart all available firmware updates are applied. During the boot process a dialog will appear that states “installing system updates”. If you are deploying the drivers as part of an OS deployment, perhaps with the Microsoft Deployment Toolkit or System Center Configuration Manager 2012 you simply add these firmware drivers to your existing driver deployment methodology and the Windows will handle handle the update process for you.

Driver Deployment

Deploying these drivers as part of your existing OS deployment process is simple, however what happens if you want to update drivers on a Surface Pro that has already been deployed. This is definitely something you will want to do as the Surface team has already delivered a number of significant performance improvements as driver and firmware updates. One option would be to manually right clicking on the device in device manager, and select the appropriate driver to install. However this is a laborious process. It is possible to automate this process using a PowerShell script that calls the PnPUtil utility.

The following script iterates recursively through the pack and installs all of the drivers that it finds:

$ScriptPath = Split-Path -parent $MyInvocation.MyCommand.Definition

$files = get-childitem -path $Scriptpath -recurse -filter *.inf

foreach ($file in $files)


    Write-host "Injecting driver $file"

    pnputil -i -a $file.FullName


To use this script extract the driver pack and place the script in top level folder of the extracted zip file. Then execute the script, it will install all drivers (including firmware). This could also be packaged into a System Center Configuration Manager package and deployed to existing machines.


For further details on Surface Pro deployment please refer to the Surface Pro - Enterprise Deployment Quick Start Guide within the Surface Pro firmware and driver pack that I worked with the Surface Team create.

This post was contributed by Ben Hunter, a Solution Architect with Microsoft Consulting Services.

Disclaimer: The information on this site is provided "AS IS" with no warranties, confers no rights, and is not supported by the authors or Microsoft Corporation. Use of included script samples are subject to the terms specified in the Terms of Use.

  • I am attempting to install the drivers manually after doing a clean install of Windows 8 Enterprise x64.  I created and ran the PowerShell script.  The only device I can't find a driver for is the 'PCI Simple Communications Controller'.  Any ideas?

  • Disregard my previous post.  After running through the first set of Windows Updates, the unknown device was installed.

  • Great write up Ben!

  • Hi Ryan,

    There was an issue with the pack, this has now been updated and you will find all of the drivers are available from within the pack itself.



  • What about importing the Firmware updates through SCUP? Does that work for enterprise?

  • You cannot deploy firmware updates through SCUP or from WSUS.



  • We are deploying Surface Pro using MDT TS, Will deployment take care of updating firmware if included as drivers in MDT?

    I have added the drivers in MDT and created selection profile to include the firware update as part of driver.



  • Hi,

    How can I deploy Firmware through Wise package studio or VB script? is there any way we can perform silent deployment?



  • Nice post, it worked perfectly on a surface pro 2 with a fresh install of enterprise 8.1

  • I understand you stated that these drivers will not be available through WSUS even though they are delivered to systems by Windows Update (so the technology is there).

    In our SCCM 2012 R2 environment there is a Windows 8.1 Drivers classification in the WSUS download options. We have this selected but I haven't noticed any drivers showing up in our list of patches. Are there any plans to release these driver and firmware updates for Enterprise Customers?

  • Hi James,

    I do not know of any plans around adding the Surface drivers to the WSUS catalog.



  • I am attempting to deploy Windows 8.1 Enterprise 64 bit to a Surface Pro 2. I have tried adding the drivers from both and to SCCM but both sets of drivers fail with error 31 during windows setup. From what I have read error 31 means that setup found an unsigned driver. I checked and both driver packs have unsigned drivers (Display and WLAN). I can deploy the same task sequence to a Lenovo T430 after removing the unsigned drivers but the install still fails on the Surface. I have also set the OSDAllowUnsignedDriver variable to False in my task sequence because it was defaulting to true. Do you have any ideas as to what I can do to get this to work? Thank you.

  • I was also having a problem whereby I would attempt to boot a Surface Pro 2 and it would sit on trying to Start the PXE process on ipv4. After about 40-45 seconds, it would flip over to ipv6, then finally flash a message before immediately booting the Surface back into Windows.

    I finally managed to make out the message and it had something about "timeout" in the error. I deduced there was something on the network causing it to take too long to acquire an IP address, both while PXE booting and while pulling from DHCP in Windows. After working with our Network administrator, we realized it was port trunking. We had PortFast enabled on the switch as well, but port trunking mode was causing the Surface ethernet adapter to acquire an IP address incredibly slowly. No other UEFI enabled desktop I tried on that same port had this issue, so I assume it's a problem with the Surface firmware or ethernet adapter.

    As to why we had trunking mode enabled, we have a very specific scenario where we're using a separate vlan for PXE boot along with a Hyper-V server on that port to allow multiple VMs the ability to PXE boot for testing on that port.

    Hopefully this help someone else.

  • Has anyone figured out a way to add the Surface Pro drivers to WDS? They all fail...

  • Cormang, no, I'm having the same issue. You cannot install the Surface network drivers in 2008R2 WDS.
    Typical of Microsoft. This product is garbage as is Microsoft's support for it in enterprise.

Your comment has been posted.   Close
Thank you, your comment requires moderation so it may take a while to appear.   Close
Leave a Comment