存儲設備韌體更新 (SFU) 驅動程式
更新 NVMe 儲存磁碟驅動器的韌體已依賴硬體廠商來建立韌體更新應用程式,以利用 Windows 10 中引進的特定 韌體更新 IOCTL 。 這些應用程式通常會分散在 Windows Update (WU) 管線之外。 用戶必須判斷其裝置中的儲存設備磁碟、從製造商的網站取得正確的儲存磁碟驅動器韌體公用程式,以及手動下載並安裝更新。
此外,在 S 模式中執行 Windows 10 的裝置會處於增強式安全性設定,只允許使用者執行 Microsoft 驗證的應用程式,因此廠商公用程式可能無法更新磁碟驅動器韌體。 此手動程式會導致韌體更新的採用率較低、支援成本增加,以及硬體製造商的滿意度問題。
注意
S 模式中的 Windows 10 僅適用於 Windows 內Microsoft市集的應用程式,以及 S 模式中與 Windows 10 相容的配件。 單向切換出S模式可供使用。 若要深入瞭解,請參閱 windows.com/SmodeFAQ。
使用驅動程式型解決方案使用 Windows Update (WU) 服務更新裝置韌體可供硬體廠商使用,並要求它們將韌體更新邏輯和承載新增至現有的函式驅動程式,或提供個別的韌體更新驅動程式和套件。 此案例會導致硬體合作夥伴之間的重複工作,並增加記憶體磁碟驅動器的整體維護成本。 如需通用驅動程式的詳細資訊,請參閱 使用通用 INF 檔案。
使用 Windows 10 版本 2004(OS 組建 19041.488 或更高版本)可以使用Microsoft提供的驅動程式和硬體廠商提供的韌體更新套件來更新 NVMe 磁碟驅動器韌體。 此解決方案可透過 Windows Update 散發至使用 電腦硬體識別碼 (CHID) 的目標磁碟驅動器和裝置。
警告
韌體更新是潛在的有風險的維護作業,只有在徹底測試新的韌體映射之後才會散發。 不受支援硬體上的新韌體可能會對可靠性和穩定性造成負面影響,甚至導致資料遺失。
磁碟機相容性
若要使用 Windows 10 來更新磁碟驅動器韌體,您必須擁有支援的磁碟驅動器。 為了確保常見的裝置行為,Windows 10 會指定 NVMe 裝置的選用硬體實驗室套件 (HLK) 需求。 這些需求概述 NVMe 儲存磁碟驅動器必須支援的命令,才能使用新的 Windows Update 型解決方案進行韌體更新。
如需硬體是否支援 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。
在沒有電源周期的情況下成功啟用的預期完成值是 00h(一般成功)、10h 或 11h。
如果傳回 0Bh 做為完成狀態,Windows 會通知使用者執行裝置的電源週期。 這強烈建議您不要這樣做,因為它可防止在OS運行時間更新韌體,並導致大量工作負載中斷。
5.8 韌體映射下載
- 裝置在下載階段不得失敗 I/O,且應繼續提供 I/O。
如需詳細資訊,請參閱 Device.Storage.ControllerDrive.NVMe 的 Windows 裝置 COMPAT 需求 - 第 5.7 和 5.8 節,位於 WHCP_Documents_Windows 11 版本24H2.zip下載檔中提供的元件和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 規格一致),並允許針對符合此名稱的 NVME 磁碟驅動器的韌體更新建立軟體元件 (SWC) 節點(最多 40 個字元和 8 個字元韌體修訂)。
如需詳細資訊,請參閱 SCSI 裝置 和 STOR_RICH_DEVICE_DESCRIPTION標識碼
記憶體韌體更新 (SFU) 解決方案詳細數據
在下圖中,Windows 10 提供函式驅動程式 (stornvme.sys) 和韌體更新驅動程式 (storfwupdate.dll)。 若要利用提供的Microsoft驅動程式來更新 NVMe 磁碟驅動器韌體,則需要兩個不同的驅動程式提交。
套件 1 - 建立磁碟驅動器韌體更新的身分識別
此套件通常包含下列專案:
擴充功能 INF 可建立軟體裝置節點,作為韌體更新套件的獨立目標硬體
驅動程式類別目錄
將您的擴充功能 INF 套件提交為個別的驅動程式提交。
不過,許多裝置類型不允許單一實體裝置列舉多個裝置節點。 在此情況下,請使用指定 AddComponent 指示詞的擴充功能 INF,建立以 Windows Update 為目標的裝置節點,並在其上安裝韌體更新驅動程式。 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 的硬體標識碼。 安裝時,此 INF 會建立下列裝置階層:
以下提供範例擴充功能 INF 來建立磁碟驅動器韌體更新的新身分識別。 由於 SCSI\DiskNVMe____StorageIHVabcd硬體在硬體製造商之間可能並不是唯一的,因此擴充功能 INF 必須使用 CHID 目標進行散發。
套件 2 - 磁碟驅動器韌體更新套件
此套件通常包含下列專案:
類別韌體通用驅動程式 INF
韌體更新承載二進位檔
驅動程式類別目錄
將您的韌體套件提交為個別的驅動程式提交。
磁碟驅動器韌體更新套件 INF 以新的節點 SWC\StorageIHVabcd-firmwareupdate 為目標,並叫用 Windows 10 記憶體韌體更新驅動程式。 若要讓軟體列舉元件裝置運作,其父系必須啟動。 為了使用 StorFwUpdate 磁碟驅動器,開發人員應該使用 DDInstall 區段中每個可能[DDInstall.*]
區段的 Include/Needs INF 指示詞至對應的[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 Update 散發。
StorFwUpdate 元件不會執行韌體二進位承載的任何驗證(簽章驗證或解密)。 如果需要此層級的功能,則硬體合作夥伴可以撰寫自己的記憶體韌體更新驅動程式。
存儲設備磁碟驅動器韌體更新範例
由於這兩個 INF 都需要 WINDOWS Update 散發套件的 CHID,因此硬體合作夥伴可以使用 PNPUTIL.EXE 在本機驗證解決方案,如下所示。
需求
Windows 10 版本 2004 (OS 組建 19041.488 或更高版本)
使用收件匣stornvme.sys驅動程式搭配 NVMe 儲存磁碟驅動器的裝置
NVMe 磁碟驅動器韌體二進位檔
正確撰寫的 INF 檔案
檢視目前的 NVMe 磁碟韌體版本
若要檢視目前的NVMe磁碟韌體版本:
以管理員身分開啟 PowerShell 視窗。
輸入
Get-PhysicalDisk | Get-StorageFirmwareInformation
以檢視目前的NVMe磁碟韌體版本。
請注意目前的 ActiveSlotNumber 和 FirmwareVersionInSlot 值。
如需詳細資訊,請參閱 Get-StorageFirmwareInformation。
安裝擴充功能 INF 以建立新的軟體硬體身分識別
移至系統上包含驅動程式擴充套件 INF 檔案的目錄。 例如,輸入
cd .\signed-DiskExtnPackage\
。確認擴充功能 INF 檔案包含您要更新之磁碟驅動器的資訊。 如需範例擴充功能 INF,請參閱 本文中的磁碟擴充功能 INF 檔案 。
使用 Microsoft PnP 公用程式安裝擴充功能 INF。 例如,在系統管理員命令提示字元中,輸入
pnputil /add-driver .\OEMDiskExtnPackage.inf /install
。 當新的軟體節點建立為開機關鍵裝置的子系時,需要重新啟動才能生效。
檢視新的軟體元件 (SWC) 節點
若要檢視新的 SWC 節點和硬體識別碼:
從 Windows 10 [開始] 功能表 開啟 控制台,然後開啟 裝置管理員。
在 裝置管理員 中,選取 [磁碟驅動器],然後展開節點,然後選取您已更新的磁碟驅動器。
選取您已更新的磁碟驅動器之後,請在 [裝置管理員 檢視] 功能表中,依聯機選取 [裝置]。
按兩下選取的磁碟驅動器節點,然後按兩下以展開。 您會在磁碟驅動器節點下看到子 泛型軟體元件 。
以滑鼠右鍵按兩下 [一般軟體] 元件 ,然後選取 [ 屬性]。
在 [屬性] 對話框視窗中,選取 [詳細數據] 索引卷標,然後從 [屬性] 下拉式清單中選取 [硬體標識符],以檢視磁碟驅動器節點上泛型軟體元件的硬體標識符。
SWC\* 硬體識別碼應該符合擴充功能 INF 中指定的標識碼。
檢視並安裝NVMe磁碟韌體更新
以管理員身分開啟 PowerShell 視窗。
移至系統上包含 NVMe 磁碟韌體更新 INF 檔案的目錄。 例如,輸入
cd .\signed-ihv-firmware\
。確認磁碟韌體更新 INF 包含您要更新之磁碟驅動器的資訊。 如需磁碟韌體更新 INF 的範例,請參閱本文中的磁碟韌體 INF 檔案。
使用 Microsoft PnP 公用程式安裝磁碟韌體更新 INF。 例如,在系統管理員命令提示字元中,輸入
pnputil /add-driver .\StorFwUpdateIHV.inf /install
。以管理員身分開啟 PowerShell 視窗。
輸入
Get-PhysicalDisk | Get-StorageFirmwareInformation
以檢視更新的NVMe磁碟韌體資訊。
在 ActiveSlotNumber 和 FirmwareVersionInSlot 值中檢視更新的 NVMe 磁碟韌體資訊。
如需詳細資訊,請參閱 Get-StorageFirmwareInformation。
透過 Windows Update 部署擴充功能 INF 和韌體套件
首先,使用 發行來驗證透過 Windows Update 的套件部署,以取得測試發佈 指引。
接下來,使用適當的 CHID 透過 Windows Update 部署套件。
如需部署的相關信息,請參閱 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"