Page 365 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 通常モードに戻る ┃ INDEX ┃ ≪前へ │ 次へ≫ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ▼CDI8.8.9 Win7ではCrucial(Micron)製NVMe SSDが検出されない? G神 20/11/12(木) 20:09 ┣Re:CDI8.8.9 Win7ではCrucial(Micron)製NVMe SSDが検出されない? G神 20/11/12(木) 20:13 ┗Re:CDI8.8.9 Win7ではCrucial(Micron)製NVMe SSDが検出されない? ひよひよ 20/11/13(金) 8:08 ─────────────────────────────────────── ■題名 : CDI8.8.9 Win7ではCrucial(Micron)製NVMe SSDが検出されない? ■名前 : G神 ■日付 : 20/11/12(木) 20:09 -------------------------------------------------------------------------
Windows 7環境で、Crucial(Micron)製NVMe SSDが検出されないようです。 確認に使用したNVMe SSDは「P1シリーズ」(CT1000P1SSSD8)で、WindowsのNVMeドライバは、Windows 7/Windows10ともに、最新の「Micron NVMe Storage Controller Ver. 2.1.15.56」です。 ちなみに、「P1シリーズ」は製造時期によって仕様が異なるのか、適用可能な最新ファームウェアが異なるらしく... シリアル番号が「20」で始まる(2020年製造?)の最新ファームウェアは「P3CR021」なのに対して、 シリアル番号が「19」で始まる(2019年製造?)の最新ファームウェアは「P3CR013」止まりです。 ※ 「Crucial Storage Exclusive」で確認。 当初は、これが原因なのかと思っていましたが、調べたところWindows のバージョンによって、CrystalDiskInfo側の挙動が異なることが原因でした。 ログを頼りにソースを調べたところ、NVMe(interfaceType == INTERFACE_TYPE_NVME)の場合、「AtaSmart.cpp」ファイルの5217行〜5259行で、SMRT情報の読み出しを行っていますが、Windows 10(以降)の場合、5217行目のif()内で、DoIdentifyDeviceNVMeStorageQuery()が呼び出されているのに対して、Windows 7(Windows 10より古い)環境の場合は、メンバ変数「m_bNVMeStorageQuery」の値がFALSEのため、DoIdentifyDeviceNVMeStorageQuery()が呼び出されず、その後、なぜかUSB外付けHDD判定処理(5466行〜)が呼び出されています。 メンバ変数「m_bNVMeStorageQuery」を決定している箇所を調べると、CAtaSmartのコンストラクタ「CAtaSmart::CAtaSmart()」内で、Windows 10(以降)の場合のみ「m_bNVMeStorageQuery」をTRUEにセットしていることを確認しました。 このため、現在の実装は、古いWindows環境下では、NVMe SSD判定処理(「AtaSmart.cpp」ファイルの5217行〜5259行)のうち、 DoIdentifyDeviceNVMeIntelRst() DoIdentifyDeviceNVMeSamsung() DoIdentifyDeviceNVMeIntel() のいずれかがTRUEを返すNVMe SSDしか検出できないように思えます。 Windows 10より古いWindows環境で検出可能なNVMe SSDは、Samsung製とIntel製のみ(CrystalDiskInfoの仕様)なのでしょうか? |
もしOS依存の問題で、DoIdentifyDeviceNVMeStorageQuery()がWindows 10(以降)でしか使えないのであれば、Windows 10より古い環境でCrucial(Micron)製NVMe SSDを検出するには、 ---------------------- > debug.Format(_T("DoIdentifyDeviceNVMeJMicron")); > DebugPrint(debug); > if (DoIdentifyDeviceNVMeJMicron(physicalDriveId, scsiPort, scsiTargetId, &identify)) > { > debug.Format(_T("AddDiskNVMe - CMD_TYPE_NVME_JMICRON")); > DebugPrint(debug); > if (AddDiskNVMe(physicalDriveId, scsiPort, scsiTargetId, scsiBus, scsiTargetId, CMD_TYPE_NVME_JMICRON, &identify)){return TRUE; } > } ---------------------- といった追加処理が必要に思えるのですが、いかがでしょうか? ただ、CAtaSmart::GetDiskInfo()メンバ関数内から、CAtaSmart::AddDiskNVMe()を呼び出した際、CAtaSmart::GetDiskInfo()メンバ関数を呼び出す際の3番目の引数「INTERFACE_TYPE interfaceType」 を引き継ぐことなく、CAtaSmart::AddDiskNVMe()メンバ関数内で、 ---------------------- > if (commandType == CMD_TYPE_NVME_JMICRON || commandType == CMD_TYPE_NVME_ASMEDIA || commandType == CMD_TYPE_NVME_REALTEK) > { > asi.InterfaceType = INTERFACE_TYPE_USB; > } > else > { > asi.InterfaceType = INTERFACE_TYPE_NVME; > } ---------------------- と、コマンドタイプが「JMICRON, ASMEDIA, REALTEK」の場合、インターフェースを「USB」に決め打ちしています。 これは、意図された正しい実装なのでしょうか? 試しに、DoIdentifyDeviceNVMeJMicron()の呼び出して、成功した場合はAddDiskNVMe()を呼び出す処理を追加してみましたが、以下に抜粋したログのとおり、AddDiskNVMe()内でvars[index-1]を削除しているようです。 ---------------------- > 00020218 AddDiskNVMe - CMD_TYPE_NVME_JMICRON > 00020311 int index = (int)vars.GetCount() - 1; > 00020342 WmiModel: CT1000P1SSD8 > 00020358 SerialNumber: > 00020389 vars.RemoveAt(index) - 1 > 00020405 OK:Check Model Name > 00020420 uReturned != 1 ---------------------- |
▼G神さん: >Windows 7環境で、Crucial(Micron)製NVMe SSDが検出されないようです。 > >確認に使用したNVMe SSDは「P1シリーズ」(CT1000P1SSSD8)で、WindowsのNVMeドライバは、Windows 7/Windows10ともに、最新の「Micron NVMe Storage Controller Ver. 2.1.15.56」です。 ちなみに、「P1シリーズ」は製造時期によって仕様が異なるのか、適用可能な最新ファームウェアが異なるらしく... > >シリアル番号が「20」で始まる(2020年製造?)の最新ファームウェアは「P3CR021」なのに対して、 >シリアル番号が「19」で始まる(2019年製造?)の最新ファームウェアは「P3CR013」止まりです。 > >※ 「Crucial Storage Exclusive」で確認。 > >当初は、これが原因なのかと思っていましたが、調べたところWindows のバージョンによって、CrystalDiskInfo側の挙動が異なることが原因でした。 > >ログを頼りにソースを調べたところ、NVMe(interfaceType == INTERFACE_TYPE_NVME)の場合、「AtaSmart.cpp」ファイルの5217行〜5259行で、SMRT情報の読み出しを行っていますが、Windows 10(以降)の場合、5217行目のif()内で、DoIdentifyDeviceNVMeStorageQuery()が呼び出されているのに対して、Windows 7(Windows 10より古い)環境の場合は、メンバ変数「m_bNVMeStorageQuery」の値がFALSEのため、DoIdentifyDeviceNVMeStorageQuery()が呼び出されず、その後、なぜかUSB外付けHDD判定処理(5466行〜)が呼び出されています。 > >メンバ変数「m_bNVMeStorageQuery」を決定している箇所を調べると、CAtaSmartのコンストラクタ「CAtaSmart::CAtaSmart()」内で、Windows 10(以降)の場合のみ「m_bNVMeStorageQuery」をTRUEにセットしていることを確認しました。 > >このため、現在の実装は、古いWindows環境下では、NVMe SSD判定処理(「AtaSmart.cpp」ファイルの5217行〜5259行)のうち、 > >DoIdentifyDeviceNVMeIntelRst() >DoIdentifyDeviceNVMeSamsung() >DoIdentifyDeviceNVMeIntel() > >のいずれかがTRUEを返すNVMe SSDしか検出できないように思えます。 > >Windows 10より古いWindows環境で検出可能なNVMe SSDは、Samsung製とIntel製のみ(CrystalDiskInfoの仕様)なのでしょうか? Windows 10以前のOSでは、MS製NVMeドライバはS.M.A.R.T.非対応となっています。 CrystalDiskInfoは、例外的にIntelのNVMe DriverやSamsung SSDの裏口コマンドに個別対応している状況です。 USB-NVMeブリッジチップの3ベンダーについてはOSの制約なくNVMe S.M.A.R.T.にアクセスできるようになっています。(ベンダーから公式情報を受領) |