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 関連の情報を調べてみたが、 まともな情報は得られなかった。
- Win32_TemperatureProbe
- MSAcpi_ThermalZoneTemperature
自分が使用しているマザーボードのI/Oコントローラ(?)は W83627HF というものらしい。
W83627HF/F WINBOND I/O
↑からデータシートを手に入れて眺めたところ、温度取得等のハードウェアモニタについて以下のようなことがわかった。
- 0x0295, 0x0296、がそれぞれ index register, data register
- 温度センサを3つ搭載
- センサ2, 3はバンクを指定してから取得する必要がある
C# と .NET framework にも初挑戦しつつ書いたサンプル→ cputm.zip (NYSL ライセンス)

※ W83627HF, IT8726F 互換コントローラ専用なので、対応していないマザーをお使いの方は実行しないようにしてください。
本当はコントローラの自動認識もしたいのだけど、どうやって情報を取得したらよいのかわからないので保留。