次の方法で共有


ストレージ ファームウェア更新 (SFU) ドライバー

NVMe ストレージ ドライブのファームウェアの更新は、ハードウェア ベンダーが作成するファームウェア更新アプリケーション (Windows 10 で導入された特定のファームウェア更新 IOCTL を利用するもの) に依存してきました。 これらのアプリケーションは、通常は Windows Update (WU) パイプラインの外側で配布されます。 エンド ユーザーは、デバイス内のどのストレージ ディスクを更新するのかを判断し、製造元の Web サイトから適切なストレージ ドライブ ファームウェア ユーティリティを入手し、更新プログラムを手動でダウンロードしてインストールする必要があります。

さらに、S モードの Windows 10 を実行しているデバイスでは、ユーザーが Microsoft 検証済みアプリケーションしか実行でない強化されたセキュリティ構成が原因で、ベンダー ユーティリティによるドライブ ファームウェアの更新に失敗する可能性があります。 このような手動のプロセスが敬遠されてファームウェア更新プログラムが導入されにくくなることで、ハードウェア製造元のサポート コストと顧客満足度の問題は増加します。

Note

S モードの Windows 10 では、Windows 内の Microsoft Store から入手したアプリと、S モードの Windows 10 と互換性のあるアクセサリしか動作しません。 S モードの解除は可能ですが、不可逆的です。 詳細については、windows.com/SmodeFAQ を参照してください。

ハードウェア ベンダーは、ドライバーベースのソリューションを使用して Windows Update (WU) サービスからデバイス ファームウェアを更新する方法を選択できますが、その場合は、ファームウェアの更新ロジックとペイロードを既存のファンクション ドライバーに追加するか、別途ファームウェア更新用のドライバーとパッケージを提供する必要があります。 このシナリオによりハードウェア パートナー間で作業が重複し、ストレージ ドライブの全体的なサービス コストが増加します。 ユニバーサル ドライバーの詳細については、「ユニバーサル INF ファイルの使用」を参照してください。

Windows 10 バージョン 2004 (OS ビルド 19041.488 以降) では、Microsoft が提供するドライバーとハードウェア ベンダーが提供するファームウェア更新プログラム パッケージを使用して NVMe ドライブのファームウェアを更新できるようになっています。 このソリューションは、Windows Update を通じて、コンピューター ハードウェア ID (CHID) を使用して対象のドライブとデバイスに配布できます。

警告

ファームウェアの更新は潜在的にリスクを伴うメンテナンス操作なので、必ず新しいファームウェア イメージを徹底的にテストした後で配布するようにしてください。 サポートされないハードウェアの新しいファームウェアは、信頼性と安定性に悪影響を及ぼし、さらにはデータを損失する可能性もあります。

ドライブの互換性

Windows 10 を使用してドライブのファームウェアを更新するには、サポート対象のドライブが必要です。 デバイスの一般的な動作を保証するために、Windows 10 では、NVMe デバイス用にオプションの Hardware Lab Kit (HLK) 要件が指定されています。 これらの要件では、NVMe ストレージ ドライブで新しい Windows Update ベースのソリューションを使用してファームウェアを更新できるようにするためにサポートする必要があるコマンドの概要が規定されています。

お使いのハードウェアが、Windows によるドライブのファームウェア更新をサポートしているかどうかについては、ソリューション ベンダーに問い合わせてください。

NVMe に関する Windows デバイスの COMPAT 要件: Device.Storage.ControllerDrive.NVMe - セクション 5.7 および 5.8

Device.Storage.ControllerDrive.NVMe.BasicFunction

デバイスには、アップグレード可能なファームウェア スロットが少なくとも 1 つ必要です。

5.7 ファームウェアのコミット

  • ファームウェア イメージのアクティブ化は、デバイスの電源サイクルを必要としないかたちで行う必要があります。

  • アクティブ化のプロセスは、仕様バージョン 1.2a のセクション 8.1 で説明されているように、ホストによって開始されるリセットを通じて実現することが想定されています。

  • Windows では、ファームウェア コミット コマンドを発行する際にコミット アクション 001b または 010b が使用されます。

  • 電源サイクルのない正常なアクティブ化で想定される完了値は、00h (一般的な成功)、10h、11h のいずれかです。

  • 完了状態として 0Bh が返されると、Windows はユーザーに、デバイスの電源サイクルを実行するように通知します。 これを実行すると OS 実行時のファームウェア更新を妨げることになり、ワークロードが大幅に中断されるため、まったくお勧めできません。

5.8 ファームウェア イメージのダウンロード

  • ダウンロード フェーズ中にデバイスの I/O に障害が発生しないようにし、I/O の中断が起こらないようにする必要があります。

詳細については、WHCP_Documents_Windows 11, version 24H2.zip ダウンロード ファイルに含まれている Components and Peripherals.pdf のセクション 5.7 および 5.8 で、Device.Storage.ControllerDrive.NVMe の Windows デバイス COMPAT 要件を参照してください。

NVMe ストレージ ディスク ドライブの SCSI 識別子

Windows 10 バージョン 2004 (OS ビルド 19041.488 以降) から、STOR_RICH_DEVICE_DESCRIPTION 構造体をサポートするドライバーを使用して、以下の 2 つの新しい識別子を 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 仕様に沿ったもの) が提供され、この名前 (最大 40 文字の名前と 8 文字のファームウェア リビジョン) に一致する NVME ドライブのファームウェア更新用のソフトウェア コンポーネント (SWC) ノードを作成できるようになります。

詳細については、「SCSI デバイスの識別子」と「STOR_RICH_DEVICE_DESCRIPTION」を参照してください。

ストレージ ファームウェア更新 (SFU) ソリューションの詳細

次の図では、Windows 10 によってファンクション ドライバー (stornvme.sys) とファームウェア更新プログラム ドライバー (storfwupdate.dll) が両方とも提供されています。 Microsoft が提供するドライバーを利用して NVMe ドライブのファームウェアを更新するには、2 つのドライバーを個別に申請する必要があります。

ストレージ ファームウェア更新の詳細。

パッケージ 1 - ドライブ ファームウェア更新用の ID の作成

通常、このパッケージには以下のアイテムが含まれます。

  • ソフトウェア デバイス ノードを作成し、ファームウェア更新パッケージ用の独立したターゲット ハードウェアとして機能させるための拡張 INF

  • ドライバー カタログ

拡張 INF パッケージは、個別のドライバー申請として提出します。

ただし、デバイスの種類によっては、1 つの物理デバイスで複数のデバイス ノードを列挙できないこともありがちです。 この場合は、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 というハードウェア ID が付けられることを表しています。 この INF をインストールすると、次のデバイス階層が作成されます。

INF デバイス階層。

次に、ドライブ ファームウェア更新のための新しい ID を作成する拡張 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 ソフトウェア ID は、ハードウェア製造元の間で一意ではない可能性があるので、INF は CHID ターゲットを利用して Windows Update の配布対象にする必要があります。

StorFwUpdate コンポーネントで、ファームウェア バイナリ ペイロードの検証 (署名の検証や復号化) は実行されません。 このレベルの機能が必要な場合、ハードウェア パートナーは独自のストレージ ファームウェア更新ドライバーを作成できます。

ストレージ ドライブのファームウェア更新の例

どちらの INF でも Windows Update の配布に CHID が必要なので、ハードウェア パートナーは、以下の要領で PNPUTIL.EXE を使用してソリューションをローカルで検証できます。

要件

  • Windows 10、バージョン 2004 (OS ビルド 19041.488 以降)

  • インボックス stornvme.sys ドライバーを使用する NVMe ストレージ ドライブ搭載デバイス

  • NVMe ドライブ ファームウェア バイナリ

  • 適切に作成された INF ファイル

現在の NVMe ディスク ファームウェア バージョンを表示する

現在の NVMe ディスク ファームウェア バージョンを表示するには、以下の手順に従います。

  1. 管理者として PowerShell ウィンドウを開きます。

  2. Get-PhysicalDisk | Get-StorageFirmwareInformation」と入力すると、現在の NVMe ディスク ファームウェア バージョンが表示されます。

    現在の NVMe ディスク ファームウェアのバージョン。

現在の ActiveSlotNumber の値と FirmwareVersionInSlot の値に注目します。

詳細については、「Get-StorageFirmwareInformation」を参照してください。

拡張 INF をインストールして新しいソフトウェア ハードウェア ID を作成する

  1. ドライバー拡張パッケージ INF ファイルが格納されているシステム上のディレクトリに移動します。 たとえば、cd .\signed-DiskExtnPackage\ と入力します。

  2. 拡張 INF ファイルに、更新するドライブの情報が含まれていることを確認します。 拡張 INF の例については、この記事の「ディスク拡張 INF ファイル」を参照してください。

  3. Microsoft PnP ユーティリティを使用して拡張 INF をインストールします。 たとえば、管理者コマンド プロンプトで、「pnputil /add-driver .\OEMDiskExtnPackage.inf /install」と入力します。 新しいソフトウェア ノードは起動に不可欠なデバイスの子として作成されるので、有効にするには再起動が必要です。

     pnputil コマンドからの出力。

新しいソフトウェア コンポーネント (SWC) のノードを表示する

新しい SWC のノードとハードウェア ID を表示するには、以下の手順に従います。

  1. Windows 10 の [スタート] メニューからコントロール パネルを開き、デバイス マネージャーを開きます。

  2. デバイス マネージャーで、[ディスク ドライブ] を選択したら、ノードを展開し、更新したディスク ドライブを選択します。

  3. 更新したドライブを選択したら、デバイス マネージャー[表示] メニューで [デバイス (接続別)] を選択します。

  4. 選択したドライブのノードをクリックし、もう一度クリックして展開します。 ドライブ ノードの下に、子の汎用ソフトウェア コンポーネントが表示されます。

  5. 汎用ソフトウェア コンポーネントを右クリックし、[プロパティ] を選択します。

  6. [プロパティ] ダイアログ ウィンドウで、[詳細] タブを選択し、[プロパティ] ドロップダウン リストから [ハードウェア ID] を選択すると、ドライブ ノードの汎用ソフトウェア コンポーネントのハードウェア ID が表示されます。

  7. SWC\* ハードウェア ID は、拡張 INF で指定されたものと一致している必要があります。

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 ディスク ファームウェア。

更新された NVMe ディスク ファームウェアの情報を ActiveSlotNumber の値と FirmwareVersionInSlot の値で確認します。

詳細については、「Get-StorageFirmwareInformation」を参照してください。

Windows Update を通じて拡張 INF パッケージとファームウェア パッケージを展開する

まず、テスト配布に関するガイダンスを使用して、Windows Update 経由でのパッケージの展開を検証します。

次に、適切な CHID を使用して Windows Update を通じてパッケージを展開します。

展開の詳細については『Windows 10 Driver Publishing Workflow』 (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