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

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

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

注意

S 模式下的 Windows 10 仅适用于 Windows 中 Microsoft Store 中的应用,以及与 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 更新驱动器固件的信息,请联系你的解决方案供应商。

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

Device.Storage.ControllerDrive.NVMe.BasicFunction

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

5.7 固件提交

  • 固件映像的激活在不需要设备断电的情况下即可完成。

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

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

  • 在不断电的情况下,成功激活的预期完成值为 00h(通用成功)、10h 或 11h。

  • 如果返回 0Bh 作为完成状态,Windows 将通知用户执行设备的电源重启。 强烈建议不要这样做,因为这会阻止在操作系统运行时更新固件,并导致严重的工作负载中断。

5.8 固件映像下载

  • 设备在下载阶段不得出现 I/O 故障,并应继续提供 I/O 服务。

有关详细信息,请参阅“Windows 设备对 Device.Storage.ControllerDrive.NVMe 的 COMPAT 要求 - 第 5.7 节和 5.8 节”,位于 WHCP_Documents_Windows 11, version 24H2.zip 下载文件中提供的 Components and Peripherals.pdf 中。

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

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

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 规范一致),并允许创建软件组件 (SWC) 节点,用于匹配此名称的 NVME 驱动器的固件更新(最多 40 个字符和 8 个字符的固件修订)。

有关详细信息,请参阅 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 指示子设备的硬件 ID 将为 SWC\StorageIHVabcd-firmware-update。 安装后,此 INF 将创建以下设备层次结构:

INF 设备层次结构。

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

包 2 - 驱动器固件更新包

通常,此包包含以下内容:

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

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

  • 驱动程序目录

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

驱动器固件更新包 INF 针对新节点 SWC\StorageIHVabcd-firmwareupdate,并调用 Windows 10 存储固件更新驱动程序。 若要使软件枚举组件设备正常运行,必须启动其父设备。 为了使用 StorFwUpdate 驱动器,开发人员应使用 DDInstall 节中的 Include/Needs INF 指令,将每个可能的 [DDInstall.*] 部分对应到相应的 [StorFwUpdate.*] 节,如图所示,无论 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 或更高版本)

  • 带有 NVMe 存储驱动器的设备使用系统自带的 stornvme.sys 驱动程序

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

  • 正确编写的 INF 文件

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

若要查看当前的 NVMe 磁盘固件版本,请执行以下操作:

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

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

    当前 NVMe 磁盘固件版本。

请注意当前的 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 磁盘固件信息。

    更新了 NVMe 磁盘固件。

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