Do not make assumptions about the operating system version based on a LoadLibrary call that searches for a DLL. If the application is running in an environment where the DLL is legitimately not present but a malicious copy of the DLL is in the search path, the malicious copy of the DLL may be loaded. Instead, use the recommended techniques described in Getting the System Version [microsoft.com].
VerifyVersionInfoが嘘をつくようになってるんだけど (スコア:2, 興味深い)
やっぱりMSの言うことを真に受けるとバカを見る。if (majorVersion >= 6 && minorVersion >= 3) { /* ok */ } else { /* バージョンが古い */ }みたいなバグがあるアプリに対して偽装の必要があるのは理解できるが、そのためのVerifyVersionInfoじゃなかったのか?
VerifyVersionInfoは6.2であると嘘をつくので、マニフェストでWindows 8.1対応を宣言せず、VerifyVersionInfo(またはそのラッパーのIsWindows8Point1OrGreater)を使ってWindows 8.1に対応したアプリは、Windows 10で誤動作することになる。もし「宣言していないアプリが悪い」で済ませるんだったら、そもそもバージョン偽装の必要がない(「変なバージョンチェックをしているアプリが悪い」)。VerifyVersionInfoはWindows 8.1では嘘をついていなかったのだから、たとえ嘘をつくとしても6.3であると偽装しなければ互換性に問題が出る。こういうことをするから「まだ存在しない将来のバージョンでの考慮など絶対不可能」とか言われてますますバージョンをガチガチにチェックされるんだろ。
マニフェストでWindows 10対応を宣言していない状態だと、今のところGetVersion、GetVersionEx、VerifyVersionInfoは嘘をついて、RtlGetVersion(ドライバ用でWin32アプリに対しては非公開)、RtlGetNtVersionNumbers(非公開)、NetWkstaGetInfo(ビルド番号やサービスパック番号が取れない)、WMIのWin32_OperatingSystem(初回がちょー遅い)、IADsComputer::OperatingSystemVersion(コンピューター名が必要)、ntdll.dllやkernel32.dllのファイルバージョン(VS_FIXEDFILEINFOからはビルド番号やサービスパック番号が取れない、StringFileInfoからバージョン番号を抽出するにはロケール依存の文字列のパースが必要)からは、正しいバージョン番号が得られるようだ。レジストリからはWindows 10対応を宣言していても6.3になった。なんじゃこりゃ(ちなみに方法を列挙しているのは単に前回「少しは調べろ」とか煽ってきたやつがいたからであって、使うとは言っていない)。
まあVerifyVersionInfoの「互換モードにだまされない」という特徴はWindows 10でも残っているようなので、乗り換えがまったく無意味になったわけではないようだ(ちなみにRtlGetVersionとレジストリからの取得は互換モードにだまされる)。
あ、前回「DLLインジェクションがあるから機能検出は推奨されていない」と言ったらGetVersionEx関数 [microsoft.com]の解説からの引用で反論されたから、これも貼っておこう。
Dynamic-Link Library Security [microsoft.com]
要するにページによって言っていることが違う。まあいつものことだけど。あと代わりに推奨している方法はWindows 10で嘘をつくようになったわけだが。
Re:VerifyVersionInfoが嘘をつくようになってるんだけど (スコア:3)
という方針になったんだと理解してる。アプリ開発者が憤る理由もわかるが、MSにも事情があるようだし。
> たとえ嘘をつくとしても6.3であると偽装しなければ
6.3 (Windows 8.1) のふりをするなら確かに一貫性はあるし、そうでない現状はよくないと思う。けど
> 互換性に問題が出る。
アプリの動作に実際にどんな問題が出るのかはわからない。なにかBreaking Changesでもあったのだったらいまのうちにフィードバックレポートしたほうがいいのでは。
Re: (スコア:0)
TPが何なのか理解できないアホです。
まで、読んだ。
Re: (スコア:0)
言いたいことはわかりますが、推測を交えるならもっと簡潔にまとめないと相手にされないと思います。
Re: (スコア:0)
覚えてる覚えてる、あおられてたなあ。javaのバージョンナンバかなんかだったかな?
まあなんでもいいけど、その後顔を真っ赤にして逆襲してみたわけだな?
そんなもん、はっきり言ってどうでもいいんだよ。もっというと、そんなもんきっちり正確に判定する必要はない。
未来永劫に使われることなどないのだからな。
そんなもんに正確性を求めて血道を上げるお前さんは好感度高いぞ。技術者を名乗るならそうありたいものだ。
ただ、windowsが舞台ならそんなもん必要ないけどな。
これだから人間活動ってのは目を離せないな。
Re: (スコア:0)
そうそう
MSのやる事が場当たり的なんてのはよくある事
開発者の為とか真面目に受け取る奴が馬鹿なんですよ
Re: (スコア:0)
Windows 10 は Win 8.1 までしか知らないと宣言しているアプリにとって
Win8.1 であるかのように振る舞っているわけでしょ?
互換性を考えるとこれが最善の挙動だよなぁ。
Re: (スコア:0)
試したら確かにVerifyVersionInfoの反応が変わってますね。
これ予定された動作なのかな……次のバージョン待ち。