WinRing0::Cpuid()

index として EAX しか設定できないという問題があります。

Visual C++ が提供している __cpuid() 自体の問題ではあるのですが・・・。CPUID 命令実行時の ECX レジスタの値は本質的に不定となります。

32bit だけならインラインアセンブラを使って

__asm {mov ecx, XXX}
__cpuid()

で ECX レジスタの値を設定可能ですが、x64 ではインラインアセンブラが使えないためこのような簡単な方法は存在しません。CrystalCPUID4 が使用している SysInfo.dll では、師匠であるぬじぬじ氏に制作していただいた CPUID 命令発行用アセンブラから生成したオブジェクトコードをリンクしています。

ECX 入力に対応するとなると API 変更が必要になるのでまたしてもマイナーバージョンが変更となります。

ホント、新機能の(ほとんど無い)ライブラリのバージョンアップって迷惑ですよねぇ~開発者からみると。でもやるっきゃない。WinRing0 のユーザーはまだそんなに多くないのでやるなら早い方が良いですね。

最初っからわかってはいたことなのですが・・・。忘れてたけどw

おすすめ

4件のフィードバック

  1. Km より:

    はじめまして。
    WinRing0_1_3_0のsourceにあるOlsApi.hのHltPxが、HltTxとなっていました。
    既知でしたらすみません。

  2. hiyohiyo より:

    >Km さん
    ご指摘ありがとうございます。
    何度も確認したはずだったのですが・・・
    近日リリース予定の 1.3.1 では修正させていただきます。

  3. ななし より:

    そしてMSは__cpuidexを用意することとなった

  4. hiyohiyo より:

    http://msdn.microsoft.com/en-us/library/hskdteyh.aspx

    ホントだ・・・。VC2008では __cpuidex がまさに!!な用途で存在していました。
    x64 版は VC2008以降の対応とすれば良さそうですね。

    情報ありがとうございます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です