過去ログ

                                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の仕様)なのでしょうか?

 ───────────────────────────────────────  ■題名 : Re:CDI8.8.9 Win7ではCrucial(Micron)製NVMe SSDが検出されない?  ■名前 : G神  ■日付 : 20/11/12(木) 20:13  -------------------------------------------------------------------------
   もし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
----------------------

 ───────────────────────────────────────  ■題名 : Re:CDI8.8.9 Win7ではCrucial(Micron)製NVMe SSDが検出されない?  ■名前 : ひよひよ  ■日付 : 20/11/13(金) 8:08  -------------------------------------------------------------------------
   ▼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.にアクセスできるようになっています。(ベンダーから公式情報を受領)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━    通常モードに戻る  ┃  INDEX  ┃  ≪前へ  │  次へ≫    ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━                                 Page 365