2009-10-31

Windows 95のFirstInstallDateTimeのフォーマット

The Old New Thing : What is the format for FirstInstallDateTime on Windows 95?

Windows95のFirstInstallDateTimeのフォーマットはどうなっているのだろうか。

広報:今週末で、サマータイムは、全米のほとんどの州で終了します。

Windows 98/98/Meは、セットアップが実行された日時を、HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion下に、FirstInstallDateTimeという名前のバイナリ値で記録している。このデータのフォーマットとは何か。

バイナリ値を、32ビットのリトルエンディアンの値とする。値のフォーマットは、基本的には、DOS date/time formatである。ただし、プログラミングの間違いにより、秒数は、常に0か1である。(大抵は1である)

問題:秒数が0か1(大抵は1である)になってしまう間違いとは何か。

追記:Falconが最初に正しい答えを出した

その答え。

まずは、DOS date/timeの値を計算する、正しいコードから。

dwDosTime = ((dwYear & 0x7F) << 25) | ((dwMonth & 0x0F) << 21) | ((dwDay & 0x1F) << 16) | ((dwHours & 0x1F) << 11) | ((dwMinutes & 0x3F) << 5) | ((dwSeconds >> 1) & 0x1F);

dwSecondsは、1ビット右にシフトすることによって、2で割っている。もし、「>>」の代わりに、「>」と書いてしまったら、dwSecondsが、1より大きいかどうかを比較するということになる。その結果は、dwSecondsのほとんどの値に対して、trueであるので、1と評価される。

No comments: