ThinkPad X230にmSATAのCrucial M550 256GBを入れた。
開発環境を色々入れて手狭になってきていたところに、Windows 10 TPをどうやって動かそうか考えて、元からmSATAに増設する予定だったので丁度よく。
Windows 10 TPのインストールはISOファイルからインストール用USBメモリを作って行ったが、X230をUEFIブートにしているので、USBメモリもUEFIブータブルにするためにFAT32でフォーマットする必要があった以外は従来と変わりない。
とりあえずインストールしたままの状態ではM550の温度は常に50度台前半で、かつてないペースで雫ちゃんの声を聞くことになった。
さすがに気になったので、IntelのChipset SupportとRapid Storageのドライバーを古いインボックスのものからLenovoの新しいものに代えたら、30度台後半で落ち着くようになった。
速度はmSATAの制限があるので、このぐらい。実用上は十分以上。
これでまたX230のスロットが一つ埋まった。
2014/10/05
2014/10/04
Windows 10 TPのバージョン判定
Windows 10 TP(Technical Preview)のバージョン判定について一応確認してみた。
内部バージョンが6.4というのは分かっているので、これをC#のコードから判定する方法として以下を試してみた。
なお、GetVersion/GetVersionExについては、Windows 8.1と同様にマニフェストファイルでcompatibilityの記述が必要となる。
それぞれのコードは以下のとおり。
GetVersionEx
IntPtrをNetApiBufferFreeで解放するよう修正した。
WMI
引数majorとminorでバージョン番号を指定し、それとの比較をする形。
実機にインストールしたWindows 10 TP上でのテスト結果は予想通りで、どの方法でもバージョン判定はできている。
マニフェストファイル中のOSのIDをコメントアウトして変えてみると、
GetVersionExはサポートしている上限のOSのバージョン番号を返しているのが分かる。以上で確認終了。
MSDNのGetVersion/GetVersionExの説明にはWindows 8.1後のOSでは変更されるか利用できなくなる可能性があるのでVersion Helper APIを使うように書かれている。一方、C#の観点から言えば、Version Helper APIは要はC++のマクロだから使えないし、GetVersion/GetVersionExを使っているSystem.Environment.OSVersionはどうなるのかということになって、先行き不透明な状態にある。まあ様子を見て使える手の中から対応を考えるしかないと思う。
参考までに、Version Helper APIと同じ機能を.NET Framework用に書いた例。
1. 判定方法
内部バージョンが6.4というのは分かっているので、これをC#のコードから判定する方法として以下を試してみた。
- Win32のGetVersionExで取得
- Win32のRtlGetVersionで取得
- Win32のNetWkstaGetInfoで取得
- WMIのWin32_OperatingSystemで取得
- Win32のVerifyVersionInfoで比較
なお、GetVersion/GetVersionExについては、Windows 8.1と同様にマニフェストファイルでcompatibilityの記述が必要となる。
2. コード
それぞれのコードは以下のとおり。
GetVersionEx
public static Version GetOsVersionByGetVersionEx() { var info = new OSVERSIONINFOEX(); info.dwOSVersionInfoSize = (uint)Marshal.SizeOf(info); var result = GetVersionEx(ref info); return result ? new Version((int)info.dwMajorVersion, (int)info.dwMinorVersion) : null; }マニフェストファイルのcompatibilityにWindows 10のIDを含めている。
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1"> <application> <!-- The ID below indicates application support for Windows 7 --> <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/> <!-- The ID below indicates application support for Windows 8 --> <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/> <!-- The ID below indicates application support for Windows 8.1 --> <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/> <!-- The ID below indicates application support for Windows 10 --> <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/> </application> </compatibility>RtlGetVersion
public static Version GetOsVersionByRtlGetVersion() { var info = new OSVERSIONINFOEX(); info.dwOSVersionInfoSize = (uint)Marshal.SizeOf(info); var result = RtlGetVersion(ref info); return (result == 0) // STATUS_SUCCESS ? new Version((int)info.dwMajorVersion, (int)info.dwMinorVersion) : null; }NetWkstaGetInfo
public static Version GetOsVersionByNetWkstaGetInfo() { IntPtr buff = IntPtr.Zero; try { var result = NetWkstaGetInfo(null, 100, out buff); if (result == 0) // NERR_Success { var info = (WKSTA_INFO_100)Marshal.PtrToStructure(buff, typeof(WKSTA_INFO_100)); if (info.platform_id == 500) // PLATFORM_ID_NT return new Version((int)info.ver_major, (int)info.ver_minor); } } finally { if (buff != IntPtr.Zero) NetApiBufferFree(buff); } return null; }[修正]
IntPtrをNetApiBufferFreeで解放するよう修正した。
WMI
public static Version GetOsVersionByWmi() { var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_OperatingSystem"); var os = searcher.Get().Cast<ManagementObject>().FirstOrDefault(); if ((os != null) && (os["OsType"] != null) && (os["Version"] != null)) { if (os["OsType"].ToString() == "18") // WINNT return new Version(os["Version"].ToString()); } return null; }VerifyVersionInfo
引数majorとminorでバージョン番号を指定し、それとの比較をする形。
public static bool? IsOsEqualOrNewerByVerifyVersionInfo(int major, int minor) { var info = new OSVERSIONINFOEX(); info.dwMajorVersion = (uint)major; info.dwMinorVersion = (uint)minor; info.dwOSVersionInfoSize = (uint)Marshal.SizeOf(info); ulong cm = 0; cm = VerSetConditionMask(cm, VER_MAJORVERSION, VER_GREATER_EQUAL); cm = VerSetConditionMask(cm, VER_MINORVERSION, VER_GREATER_EQUAL); var result = VerifyVersionInfoW(ref info, VER_MAJORVERSION | VER_MINORVERSION, cm); if (result) return true; return (Marshal.GetLastWin32Error() == 1150) // ERROR_OLD_WIN_VERSION ? false : (bool?)null; }Win32の宣言を含むコード全体はレポジトリに置いた。
3. テスト結果
実機にインストールしたWindows 10 TP上でのテスト結果は予想通りで、どの方法でもバージョン判定はできている。
マニフェストファイル中のOSのIDをコメントアウトして変えてみると、
GetVersionExはサポートしている上限のOSのバージョン番号を返しているのが分かる。以上で確認終了。
4. 備考
MSDNのGetVersion/GetVersionExの説明にはWindows 8.1後のOSでは変更されるか利用できなくなる可能性があるのでVersion Helper APIを使うように書かれている。一方、C#の観点から言えば、Version Helper APIは要はC++のマクロだから使えないし、GetVersion/GetVersionExを使っているSystem.Environment.OSVersionはどうなるのかということになって、先行き不透明な状態にある。まあ様子を見て使える手の中から対応を考えるしかないと思う。
参考までに、Version Helper APIと同じ機能を.NET Framework用に書いた例。