tclock-080427-analog

追記 09/02/28

TClock2ch付属サイト…では最新版を含めて、散在する各バージョンの収集が行われています。より新しい情報はこちらを参照してください。


以下は古い記事です。

追記 08/06/08

このサイトでTClockの更新は行いません。ここでは080602のバグ対応のみ行います。気が向いたら名無しで付属サイトさんのアップローダに展開するかもしれません。*1


追記 08/06/03

TClock2ch付属サイト…に更新版をあげておきました。Vista SP1でスリープからの復旧時にexplorer.exeが固まる問題を修正しています。

以下本来の記事

2つ以上CPUコアのある場合、Vista環境で書式 <%CC%> が正常に動作しない問題を修正しました(tclock-080427-analog.cab)。

.履歴
080427
    exe         :時刻合わせの設定画面でログを読み込むように変更
    dll         :Vista環境でCCがでたらめな値を表示する問題を修正
                :CPUコアごとのクロック数取得書式 CC[0-7] を追加


この問題は本家が <%CC%> を実装した段階で潜在的にもっていたものですが、XPからVistaになる際に CallNtPowerInformation に仕様変更があったことで表面化しました。


この関数は、XPでは複数のコアがある場合でも、 PROCESSOR_POWER_INFORMATION 構造体1つ分のバッファを渡せば CPU #0 の情報を取得することができました。しかしVistaでは、コア数と同じ数の PROCESSOR_POWER_INFORMATION 構造体をバッファとして要求し、バッファサイズが足りない場合は STATUS_BUFFER_TOO_SMALL を返して情報は取得できません。よって正しくは次のコードのように使用する必要があります。

SYSTEM_INFO si;
GetSystemInfo(&si);
SIZE_T sz = si.dwNumberOfProcessors * sizeof(PROCESSOR_POWER_INFORMATION);
PROCESSOR_POWER_INFORMATION* info = new PROCESSOR_POWER_INFORMATION [si.dwNumberOfProcessors];
if (CallNtPowerInformation(ProcessorInformation, 0, 0, info, sz) == STATUS_SUCCESS)
{
  for (DWORD i=0; i<si.dwNumberOfProcessors; ++i)
    std::cout << info[i].CurrentMhz << std::endl;
}
delete [] info;

従来TClockでは構造体1つ分のみのバッファを渡していたため <%CC%> は CPU #0 の情報のみを取得していました(あるいは取得に失敗しながらも、エラーチェックをしていないがためにでたらめな値を表示していました)。
今回の <%CC[0-7]%> の追加により CPU #0-7 の情報を取得できるようになり*2、従来の <%CC%> も <%CC0%> とみなすことによって変更なく使用することができるようになりました。

*1:名無しならキーローガーを実装できる。興味あったしちょっとがんばってみようかな。期待しないで待っててくださいです。

*2:意味があるかは知らない。