WinRing0 を使ってみる

WinRing0 とは

OpenLibSys.org で配布されているハードウェアアクセスライブラリ。
I/O ポート, MSR, PCIバスにアクセスする機能があるらしい。

高度なことが色々とできるのだろうけど、ハード周りの知識は皆無なので、ここでは I/O ポートを扱う中でも比較的簡単そうなものを試してみます。

WinRing0 の導入

OpenLibSys - Manual に書いてある通り。難しいことは何もないので省略。

Beep 音を鳴らすサンプル

システム情報 - ハードウェアリソース - I/O を確認したところ、システムスピーカを発見。調べてみたところ以下のサイトが見つかり、簡単そうだったので試してみました。

// Beepでドレミファソラシドを鳴らす

#include <windows.h>
#include "OlsApi.h"

int main()
{
    InitializeDll();

    WORD base = 523;

    int d[] = {0, 2, 4, 5, 7, 9, 11, 12};

    for(int i=0;i<8;i++) {
        WORD hz = base * pow(2.0, d[i]/12.0);
        WORD value = 1193180/hz;
        
        WriteIoPortByte(0x43, 0xB6);
        WriteIoPortByte(0x42, value & 0xFF);
        WriteIoPortByte(0x42, (value >> 8) & 0xFF);
        WriteIoPortByte(0x61, ReadIoPortByte(0x61) | 0x03);

        Sleep(500);
    }
    
    WriteIoPortByte(0x61, ReadIoPortByte(0x61) & (~0x03));

    DeinitializeDll();
    
    return 0;
}

	

0x43 に 0xB6 を設定する意味や、0x42 へ二回連続で書き込むと二つ目の値で上書きされてしまわないの?などの知識不足による疑問点はありますが、音は鳴りました。

CPU 温度の取得

汎用的な方法はないとみて良い。マザーボードに依存するらしい。 手近なマシンで、wbemtest.exe を使って以下の WMI 関連の情報を調べてみたが、 まともな情報は得られなかった。

自分が使用しているマザーボードのI/Oコントローラ(?)は W83627HF というものらしい。
W83627HF/F WINBOND I/O
↑からデータシートを手に入れて眺めたところ、温度取得等のハードウェアモニタについて以下のようなことがわかった。

C# と .NET framework にも初挑戦しつつ書いたサンプル→ cputm.zip (NYSL ライセンス)
実行時のスクリーンショット

※ W83627HF, IT8726F 互換コントローラ専用なので、対応していないマザーをお使いの方は実行しないようにしてください。

本当はコントローラの自動認識もしたいのだけど、どうやって情報を取得したらよいのかわからないので保留。