存储固件更新 (SFU) 驱动程序

更新 NVMe 存储驱动器的固件依赖于硬件供应商来创建使用 Windows 10 中引入的特定 固件更新 IOCTL 的固件更新应用程序。 这些应用程序通常分布在Windows 更新(WU)管道之外。 最终用户需要确定哪些存储磁盘位于其设备中,从制造商的网站获取正确的存储驱动器固件实用工具,并手动下载并安装更新。

此外,在 S 模式下运行 Windows 10 的设备处于增强的安全配置中,仅允许用户运行Microsoft验证的应用程序,因此供应商实用程序可能无法更新驱动器固件。 此手动过程导致固件更新的采用率低,增加了硬件制造商的支持成本和客户满意度问题。

注意

S 模式下的 Windows 10 专用于 Windows 中Microsoft应用商店中的应用,以及 S 模式下与 Windows 10 兼容的附件。 单向切换出 S 模式可用。 在 windows.com/SmodeFAQ 中了解详细信息。

使用基于驱动程序的解决方案使用 Windows 更新 (WU) 服务更新设备固件可供硬件供应商使用,并要求它们向现有功能驱动程序添加固件更新逻辑和有效负载,或提供单独的固件更新驱动程序和包。 这会导致跨硬件合作伙伴进行重复工作,并增加存储驱动器的整体维护成本。 有关通用驱动程序的详细信息,请参阅 使用通用 INF 文件

利用 Windows 10 版本 2004(OS 内部版本 19041.488 或更高版本),可以使用Microsoft提供的驱动程序和硬件供应商提供的固件更新包更新 NVMe 驱动器固件。 此解决方案可以通过Windows 更新分发到使用计算机硬件 ID(CHID)的目标驱动器和设备。

警告

固件更新是一种潜在的风险维护操作,仅在对新固件映像进行彻底测试后才应分发。 不受支持的硬件上的新固件可能对可靠性和稳定性产生负面影响,或者甚至会导致数据丢失。

驱动器兼容性

若要使用 Windows 10 更新驱动器固件,必须具有受支持的驱动器。 为了确保常见的设备行为,Windows 10 指定 NVMe 设备的可选硬件实验室工具包(HLK)要求。 这些要求概述了 NVMe 存储驱动器必须支持哪些命令才能使用基于Windows 更新的新解决方案进行固件更新。

请联系解决方案供应商,了解有关硬件是否支持 Windows 更新驱动器固件的信息。

NVMe 的 Windows 设备 COMPAT 要求:Device.Storage.ControllerDrive.NVMe - 第 5.7 节和 5.8 节

Device.Storage.ControllerDrive.NVMe.BasicFunction

设备必须至少有一个可升级的固件槽。

5.7 固件提交

  • 无需设备的电源周期即可激活固件映像。

  • 激活过程预计将通过主机发起的重置来实现,如规范版本 1.2a 的第 8.1 节中所述。

  • 发出固件提交命令时,Windows 将利用提交操作 001b 或 010b。

  • 在没有电源周期的情况下成功激活的预期完成值为 00 小时(通用成功)、10 小时或 11 小时。

  • 如果返回 0Bh 作为完成状态,Windows 将通知用户执行设备的电源周期。 强烈建议不要这样做,因为它可防止在 OS 运行时更新固件,并导致严重的工作负荷中断。

5.8 固件映像下载

  • 设备在下载阶段不得失败 I/O,并且将继续为 I/O 提供服务。

有关更多详细信息,请参阅 NVMe 的 Windows 设备 COMPAT 要求: Device.Storage.ControllerDrive.NVMe - 第 5.7 节和 5.8 节。

注意

上述链接需要在 Microsoft Collaborate 门户上使用有效的帐户。

NVMe 存储磁盘驱动器的 SCSI 标识符

从 Windows 10 版本 2004(OS 内部版本 19041.488 或更高版本)开始,两个新标识符可用于 NVMe 存储磁盘驱动器,这些驱动程序支持 STOR_RICH_DEVICE_DESCRIPTION 结构:

SCSI\t*v(8)p(40)

其中:

  • t* 是可变长度的设备类型代码。
  • v(8) 是一个 8 个字符的供应商标识符。
  • p(40) 是 40 个字符的产品标识符

SCSI\t*v(8)p(40)r(8)

其中:

  • t* 是可变长度的设备类型代码。
  • v(8) 是一个 8 个字符的供应商标识符。
  • p(40) 是 40 个字符的产品标识符
  • r(8) 是一个 8 个字符的修订级别值。

SCSI\t*v(8)p(40)r(80 标识符提供完整的产品名称(与 NVME 1.4 规范一致),并允许为符合此名称的 NVME 驱动器(最多 40 个字符和 8 个字符固件修订)创建软件组件 (SWC) 节点。

有关详细信息,请参阅 SCSI 设备和STOR_RICH_DEVICE_DESCRIPTION的标识符

存储固件更新(SFU)解决方案详细信息

在下图中,Windows 10 提供函数驱动程序(stornvme.sys)和固件更新驱动程序(storfwupdate.dll)。 若要利用提供的Microsoft驱动程序更新 NVMe 驱动器固件,需要两个单独的驱动程序提交。

存储固件更新详细信息。

包 1 - 为驱动器固件更新创建标识

通常,此包包含以下项:

  • 用于创建软件设备节点以充当固件更新包的独立目标硬件的扩展 INF

  • 驱动程序目录

将扩展 INF 包作为单独的驱动程序提交提交。

但是,许多设备类型不允许单个物理设备枚举多个设备节点。 在这种情况下,请使用指定 AddComponent 指令的扩展 INF 来创建设备节点,该节点可由Windows 更新并安装固件更新驱动程序。 INF 文件中的以下代码片段演示如何执行此操作:

[Manufacturer]
%Contoso%=Standard,NTamd64
[Standard.NTamd64]
%DeviceName%=Device_Install, SCSI\DiskNVMe____StorageIHVabcd
[StorageIHVabcd.Components]
AddComponent= StorageIHVabcd_component,,StorageIHVabcd_ComponentInstall
[StorageIHVabcd_ComponentInstall]
ComponentIDs = StorageIHVabcd-firmware-update

在上面的 INF 示例中,ComponentIDs = StorageIHVabcd-firmware-update指示子设备具有 SWC\StorageIHVabcd-firmware-update 的硬件 ID。 安装后,此 INF 将创建以下设备层次结构:

I N F 设备层次结构。

下面提供了用于为驱动器固件更新创建新标识的示例扩展 INF。 由于 SCSI\DiskNVMe____StorageIHVabcd 硬件在硬件制造商中可能并不唯一,因此扩展 INF 必须使用 CHID 目标进行分发。

包 2 - 驱动器固件更新包

通常,此包包含以下项:

  • 类固件的通用驱动程序 INF

  • 固件更新有效负载二进制文件

  • 驱动程序目录

将固件包作为单独的驱动程序提交提交。

驱动器固件更新包 INF 面向新的节点 SWC\StorageIHVabcd-firmwareupdate ,并调用 Windows 10 存储固件更新驱动程序。 若要使软件枚举组件设备正常运行,必须启动其父设备。 为了使用 StorFwUpdate 驱动器,开发人员应在 DDInstall 节中为每个可能的[DDInstall.*]节使用 DDInstall 指令中的 [StorFwUpdate.*] Include/Needs INF 指令,如下所示,无论 INF 是否为该节指定任何指令:

[StorFwUpdateOem.NT]
Include            = StorFwUpdate.inf
Needs              = StorFwUpdate.NT
CopyFiles          = StorFwUpdateOem.CopyFiles

[StorFwUpdateOem.NT.Wdf]
Include            = StorFwUpdate.inf
Needs              = StorFwUpdate.NT.Wdf

[StorFwUpdateOem.NT.Services]
Include            = StorFwUpdate.inf
Needs              = StorFwUpdate.NT.Services

有关详细信息,请参阅 使用组件 INF 文件。 下面提供了一个示例 NVMe 驱动器固件更新 INF 文件。 由于 SWC\StorageIHVabcd-firmwareupdate 软件标识在硬件制造商中可能并不唯一,因此 INF 必须使用 CHID 目标进行Windows 更新分发。

StorFwUpdate 组件不执行固件二进制有效负载的任何验证(签名验证或解密)。 如果需要此级别的功能,则硬件合作伙伴可以编写自己的存储固件更新驱动程序。

存储驱动器固件更新示例

由于这两个 INF 都需要使用 CHID 进行Windows 更新分发,因此硬件合作伙伴可以使用PNPUTIL.EXE在本地验证解决方案,如下所示。

要求

  • Windows 10 版本 2004(OS 内部版本 19041.488 或更高版本)

  • 使用收件箱stornvme.sys驱动程序使用 NVMe 存储驱动器的设备

  • NVMe 驱动器固件二进制文件

  • 正确创作的 INF 文件

查看当前的 NVMe 磁盘固件版本

若要查看当前的 NVMe 磁盘固件版本:

  1. 以管理员身份打开 PowerShell 窗口。

  2. 键入 Get-PhysicalDisk | Get-StorageFirmwareInformation 以查看当前 NVMe 磁盘固件版本。

    当前 N V M e 磁盘固件版本。

请注意当前的 ActiveSlotNumberFirmwareVersionInSlot 值。

有关详细信息,请参阅 Get-StorageFirmwareInformation

安装扩展 INF 以创建新的软件硬件标识

  1. 移动到系统上包含驱动程序扩展包 INF 文件的目录。 例如,键入 cd .\signed-DiskExtnPackage\

  2. 验证扩展 INF 文件是否包含要更新的驱动器的信息。 有关示例扩展 INF,请参阅 本主题中的磁盘扩展 INF 文件

  3. 使用 Microsoft PnP 实用工具安装扩展 INF。 例如,在管理员命令提示符中,键入 pnputil /add-driver .\OEMDiskExtnPackage.inf /install。 由于新软件节点作为启动关键设备的子级创建,因此需要重新启动才能生效。

     p n p util 命令输出。

查看新软件组件 (SWC) 节点

若要查看新的 SWC 节点和硬件 ID,请执行以下操作:

  1. 在 Windows 10 开始菜单中,打开控制面板,然后打开设备管理器

  2. 在设备管理器中,选择“磁盘驱动器,然后展开节点,然后选择已更新的磁盘驱动器。

  3. 选择已更新的驱动器后,在“设备管理器视图”菜单中,按连接选择“设备”。

  4. 单击所选驱动器节点,然后单击以展开。 驱动器节点下会显示一个子 通用软件组件

  5. 右键单击 通用软件组件 ,然后单击“ 属性”。

  6. “属性”对话框窗口中,选择“详细信息”选项卡,然后从“属性”下拉列表中选择“硬件 ID”,查看驱动器节点上通用软件组件的硬件 ID

  7. SWC\* 硬件 ID 应与扩展 INF 中指定的 ID 匹配。

查看并安装 NVMe 磁盘固件更新

  1. 以管理员身份打开 PowerShell 窗口。

  2. 移动到系统上包含 NVMe 磁盘固件更新 INF 文件的目录。 例如,键入 cd .\signed-ihv-firmware\

  3. 验证磁盘固件更新 INF 是否包含要更新的驱动器的信息。 有关磁盘固件更新 INF 的示例,请参阅本主题中的磁盘固件 INF 文件

  4. 使用 Microsoft PnP 实用工具安装磁盘固件更新 INF。 例如,在管理员命令提示符中,键入 pnputil /add-driver .\StorFwUpdateIHV.inf /install

  5. 以管理员身份打开 PowerShell 窗口。

  6. 键入 Get-PhysicalDisk | Get-StorageFirmwareInformation 以查看更新后的 NVMe 磁盘固件信息。

    更新了 N V M e 磁盘固件。

在 ActiveSlotNumberFirmwareVersionInSlot 值中查看更新的 NVMe 磁盘固件信息。

有关详细信息,请参阅 Get-StorageFirmwareInformation

通过Windows 更新部署扩展 INF 和固件包

首先,使用发布测试分发指南通过Windows 更新验证包部署

接下来,使用适当的 CHID 通过Windows 更新部署包。

有关部署的信息,请参阅 Windows 10 驱动程序发布工作流(DOCX 下载)

磁盘扩展 INF 示例

下面是扩展 INF 文件的示例:

;/*++
;
;  Copyright (c) Microsoft Corporation.  All rights reserved.
;
;      THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;      KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;      IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;      PURPOSE.
;
;  File:
;
;      OEMDiskExtnPackage.inx
;
;  Description:
;
;      INF file for installing the OEMDiskExtnPackage. This will create a SWC\ DevNode
;      which will service as the target HWID for the Disk storage firmware package.
;
;--*/

[Version]
Signature="$Windows NT$"
Class = Extension
ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider = %ManufacturerName%
ExtensionId = {D91908BD-43FA-411B-92A1-C378AE5AF9FA}
CatalogFile = delta.cat
DriverVer = 08/26/2019,1.0.0.0
PnpLockdown = 1

[SourceDisksNames]
1 = %DiskName%

[Manufacturer]
%ManufacturerName%=Standard,NTamd64

[Standard.NTamd64]
%OEMDiskExtnPackage.DeviceDesc%=StorageIHV1-87B, SCSI\DiskNVMe____StorageIHV1-87B
%OEMDiskExtnPackage.DeviceDesc%=StorageIHV1-87A, SCSI\DiskNVMe____StorageIHV1-87A
%OEMDiskExtnPackage.DeviceDesc%=StorageIHV2_KUS02020, SCSI\DiskNVMe____StorageIHV2_KUS02020
%OEMDiskExtnPackage.DeviceDesc%=StorageIHV3_KBG40ZPZ512G, SCSI\DiskNVMe____KBG40ZPZ512G_IHV300Y9
%OEMDiskExtnPackage.DeviceDesc%=StorageIHV3_KBG40ZPZ512G, SCSI\DiskNVMe____KBG40ZPZ512G_IHV30015

[StorageIHV1-87B.NT]
[StorageIHV1-87B.NT.Components]
AddComponent = StorageIHV1-87B_component,,StorageIHV1-87B_ComponentInstall

[StorageIHV1-87B_ComponentInstall]
ComponentIds=StorageIHV1-87B

[StorageIHV1-87A.NT]
[StorageIHV1-87A.NT.Components]
AddComponent = StorageIHV1-87A_component,,StorageIHV1-87A_ComponentInstall

[StorageIHV1-87A_ComponentInstall]
ComponentIds=StorageIHV1-87A

[StorageIHV2_KUS02020.NT]
[StorageIHV2_KUS02020.NT.Components]
AddComponent = StorageIHV2_KUS02020_component,,StorageIHV2_KUS02020_ComponentInstall

[StorageIHV2_KUS02020_ComponentInstall]
ComponentIds=StorageIHV2_KUS02020

[StorageIHV3_KBG40ZPZ512G.NT]
[StorageIHV3_KBG40ZPZ512G.NT.Components]
AddComponent = StorageIHV3_KBG40ZPZ512G_component,,StorageIHV3_KBG40ZPZ512G_ComponentInstall

[StorageIHV3_KBG40ZPZ512G_ComponentInstall]
ComponentIds=StorageIHV3_KBG40ZPZ512G

;*****************************************
; Strings section
;*****************************************

[Strings]
ManufacturerName = "OEM"
DiskName = "OEM Disk Extn package Installation Disk"
OEMDiskExtnPackage.DeviceDesc = "Disk Extn Package"
OEMDiskExtnPackage.SVCDESC = "Disk Extn Package"

;Non-Localizable
REG_EXPAND_SZ          = 0x00020000
REG_DWORD              = 0x00010001
REG_MULTI_SZ           = 0x00010000
REG_BINARY             = 0x00000001
REG_SZ                 = 0x00000000

SERVICE_KERNEL_DRIVER  = 0x1
SERVICE_ERROR_IGNORE   = 0x0
SERVICE_ERROR_NORMAL   = 0x1
SERVICE_ERROR_SEVERE   = 0x2
SERVICE_ERROR_CRITICAL = 0x3

磁盘固件 INF 示例

下面是磁盘固件 INF 文件的示例:

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;  Copyright (c) Microsoft Corporation.  All rights reserved.
;
;      THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;      KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;      IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;      PURPOSE.
;
;   File:
;
;      StorageIHV3-Firmware-Update.inx
;
;   Description:
;
;      Driver installation file for firmware update.
;
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

[Version]
Signature="$Windows NT$"
Class=Firmware
ClassGuid={f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Provider=%ManufacturerName%
CatalogFile=delta.cat
DriverVer=08/26/2019,11.37.9.948
PnPLockDown=1

[SourceDisksNames]
1= %DiskName%

[DestinationDirs]
StorFwUpdateOem.CopyFiles=13

[Manufacturer]
%ManufacturerName%=Standard,NTamd64

[Standard.NTamd64]
%StorFwUpdateOem.DeviceDesc%=StorFwUpdateOem, SWC\StorageIHV3_KBG40ZPZ512G

[StorFwUpdateOem.NT]
Include            = StorFwUpdate.inf
Needs              = StorFwUpdate.NT
CopyFiles          = StorFwUpdateOem.CopyFiles

[StorFwUpdateOem.NT.Wdf]
Include            = StorFwUpdate.inf
Needs              = StorFwUpdate.NT.Wdf

[StorFwUpdateOem.NT.HW]
AddReg = StorFwUpdateOem_HWAddReg

[StorFwUpdateOem_HWAddReg]
HKR,,FriendlyName,,%FwUpdateFriendlyName%

; Specify the location of the firmware offer and payload file in the registry.
; The files are kept in driver store. When deployed, %13% would be expanded to the actual path
; in driver store.
;
HKR,0D9EB3D6-6F14-4E8A-811B-F3B19F7ED98A\0,FirmwareImageVersion, 0x00000000, "AEMS0102"
HKR,0D9EB3D6-6F14-4E8A-811B-F3B19F7ED98A\0,FirmwareFileName, 0x00000000, %13%\AEMS0102.sig

[SourceDisksFiles]
AEMS0102.sig=1

[StorFwUpdateOem.CopyFiles]
AEMS0102.sig

[StorFwUpdateOem.NT.Services]
Include            = StorFwUpdate.inf
Needs              = StorFwUpdate.NT.Services

; =================== Generic ==================================

[Strings]
ManufacturerName="{Your Manufacturer Name}"
StorFwUpdateOem.DeviceDesc = "Storage Firmware Update (StorageIHV3) 1"
DiskName = "Storage Firmware Update Installation Disk"
FwUpdateFriendlyName= "StorageIHV3 Firmware Update"

其他资源

SCSI 设备的标识符

STOR_RICH_DEVICE_DESCRIPTION