Written in Japanese(Shift-JIS)
2014.10. 2
INASOFT

/トップ/目次/管理人のひとこと(ブログ)/Windows 8.1を導入したけどバージョンチェック(GetVersionEx)がうまくいかなくて…

3129594 (+0056)[+0470]

管理人のふたこと Tweet

Windows 8.1を導入したけどバージョンチェック(GetVersionEx)がうまくいかなくて…




公開日:2013/10/19
更新日:2014/10/02 - Windows 10 Technical Preview版に関する情報を追加

Windows 8.1 導入記念記事。

■Windows 8.1を導入してみた

Windowsボタンは復活するもののスタートメニューは復活しないなど、とても中途半端な対応で、あまり注目を集めていない、Windows 8.1が公開されました。Windows 8からは、Windowsストアから無料でダウンロードできます。

というわけで、さっそくインストールしてみることにしました。


ダウンロード中 なかなか終わりません

5時間くらい経過しているはずなのですが、なかなか終わりません。おそらく、背後でフルバックアップとかバックアップデータを圧縮とか、余計なことを行っているのかもしれません。

結局、いつまで経っても終わらないので、パソコンを放置して出勤し、帰宅後に再び様子を見てみることにしましたところ、無事に終わっておりました。さすがに14時間も経てば終わるか。

■Windows 8.1の内部バージョンを取得してみると…

さて、ここからが本題。


Microsoft Windows ver.6.3.9600

コマンドプロンプトを立ち上げれば分かるとおり、Windows 8.1の内部バージョン番号は 6.3.9600 となっています。

そのため、バージョン番号からWindowsの名前を導くとしたら、GetVersionEx() APIによりメジャーバージョン(6)とマイナーバージョン(3)を得て、判定する仕組みが簡単かと思います。

実際、それを期待しているロジックは既に組み込まれており、「いじくるつくーる」と「すっきり!! デフラグ」は、そこを見て「Windows 8.1なら、動作未確認である旨、警告メッセージを表示する」機能が搭載されています。

いた…はずでした。

それが、動いていないことが判明しました。ためしに、CCPU でバージョン番号を表示させてみると…


Microsoft Windows ver.6.2.9200

なぜだか Windows 8と同じ結果が返ってきています。おかしいなと思い、ググってみると、どうやら、マニフェストファイル(〜.exe.manifest)に、Windows 8.1に対応することの宣言をしないと、GetVersionEx() API が古いバージョン番号を返すような仕様に変わってしまったみたいなんですね。

というわけで、実行ファイルのマニフェストの記載を以下のようにします。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

     :
     : (途中省略)
     :

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
    </application>
  </compatibility>
</assembly>

赤い部分が肝心の記述でして、これが Windows 8.1に対応しているという宣言になります。これがないと、GetVersionEx() は、偽装した結果を返すことになります。

さて、改めて、CCPUを見てみると、


Microsoft Windows ver.6.3.9600

無事に、Windows 8.1であると判別されました。その結果、


Microsoft Windows 8.1 には未対応

Windows 8.1では動作未確認である旨のダイアログを表示できました。

それにしても「Windows 8.1に対応していないことを表示するプログラムは、Windows 8.1への対応を宣言しなければならない」というのは、なんとも面白い話ですね。

というわけで「Windows 8.1では動作未確認である旨を警告する」機能の修正を施した いじくるつくーるすっきり!! デフラグ の公開を行っています。さすがに、対応しているかどうかも分からないOS上で、暴れられては困ってしまいますからね。



Windows 10 Technical Preview版に関する情報 (2014/10/ 2)

Windows 10についても、新しいsupportedOSを追加しないといけないようです。2014/10/2時点のWindows 10 Technical Preview版(内部ver.6.4.9841)では、次のような情報を追加する必要がありました。(もちろん、今後変更されてしまう可能性も否定できませんが、あくまで今のところという情報で)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

     :
     : (途中省略)
     :

  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
    <application>
      <!-- Windows 7 -->
      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
      <!-- Windows 8 -->
      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
      <!-- Windows 8.1 -->
      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
      <!-- Windows 10 -->
      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
    </application>
  </compatibility>
</assembly>

dvtb4rfi1f_1win10tpv_a_s.jpg(1023px x 574px, 60KB)

dvtb4rfi1f_2win10tpv_b.png(623px x 418px, 11KB)

dvtb4rfi1f_3win10tpv_d.png(986px x 593px, 39KB)


その後、Windows 10の内部バージョンは、ver.10.0.10240 になりました。



■参考
 ・2013/11/9 Windows 8.1におけるGetVersionExの挙動の変化に関する話題が注目を集めているみたい
 ・Operating system version changes in Windows 8.1 and Windows Server 2012 R2
 ・自分自身を バージョン偽装する 変な Windows 8.1 - ここに書かれているとおり、RtlGetVersion() という解決策もあります




本ページへは、自己責任の範囲内であれば自由にリンクしていただいて構いません。
本ページに掲載されている内容は、自由にお使いいただいて構いませんが、必ずしも筆者が内容を保証するものではありませんので、ご利用に際しては自己の責任においてお使いいただきますよう、お願いいたします。
このページのURLやアンカーは、サーバ運営・サイト運営・ページ運営・その他の都合により無告知で一時的あるいは永遠に消滅したり、変更したりする可能性がありますので、あらかじめご了承下さい。
本ページは、公開から1年半経過後の任意のタイミングで削除される予定です。本ページの内容は複製・公開していただいて構いません。


/トップ/目次/管理人のひとこと(ブログ)/Windows 8.1を導入したけどバージョンチェック(GetVersionEx)がうまくいかなくて…