一:開啟和驅動程式的溝通: open_LPC()
其中1行
bond = new Guid("781EF630-72B2-11d2-B852-00C04FAD5171");
就是驅動程式的 GUID_DEVINTERFACE_Thermal
if (IntPtr.Size == 8) detail3.Size = 8;//AMD64
else detail3.Size = 5;//x86
detail3.Size 在C語言是 sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA) . 在c#用 Marshal.SizeOf(SP_DEVICE_INTERFACE_DETAIL_DATA) 得到的值和C語言是不同的. 所以這裡採用直接指定的方式. 在 64bit 作業系統 size 是 8, 在 32bit 作業系統 size 是 5.

二: 讀取溫度
W83627EHF共可監測3個溫度: CPU溫度, System溫度, Aux溫度. System溫度要讀取 bank 0 暫存器Index[27h]. CPU溫度要讀取 bank 1 暫存器Index[50h] 和 Index[51h]. Aux溫度要讀取 bank 2 暫存器Index[50h] 和 Index[51h]. Index[50h] 為溫度的整數部分. Index[51h]的 bit7 如果為 1, 代表溫度要加上 0.5 .

三: 讀取風扇轉速
W83627EHF共可監測5個風扇轉速. datasheet記載的 RPM 公式為:
  1350000
Count x Divisor
先求出 Divisor
/* CPU fan 0 divisor */
num = index47h >> 6 | (index5Dh & 0x40) >> 4;
monitor1.divisorCPUfan0 = (byte)num;
/* CPU fan 1 divisor */
num = (index4Ch & 0x80) >> 5 | index59h & 3;
monitor1.divisorCPUfan1 = (byte)num;
/* system fan 0 divisor */
num = (index47h & 0x30) >> 4 | (index5Dh & 0x20) >> 3;
monitor1.divisorSystemFan = (byte)num;
/* AUX fan 0 divisor */
num = index4Bh >> 6 | (index5Dh & 0x80) >> 5;
monitor1.divisorFanAux0 = (byte)num;
/* AUX fan 1 divisor */
num = (index59h & 0xC) >> 2 | (index59h & 0x80) >> 5;
monitor1.divisorFanAux1 = (byte)num;
再讀取 Count 即可算出風扇轉速.
public string roundPerMinute(byte index,byte divisor)
{
 byte val, ans;
 double num;
 float floa3;
 val = 0;
 num = Math.Pow(2, divisor);
 ans = monitor1.read_monitor(index, ref val);
 if (ans > 0) return Monitor.wordFail;
 if (val == 0) return val.ToString();
 floa3 = (float)(1350000 / (val * num));
 return floa3.ToString();
}

四: 讀取電壓
根據 datasheet 的公式, CPU 核心電壓(V) = index20h x 0.008
3.3V 使用內部的2個 34KΩ 電阻來降壓. 所以電壓(V) = 讀值 x 8mV x 2 = 讀值 x 0.016
其他電壓監測需依靠連接的電阻來決定, 有興趣的讀者請自行測量主機板的電阻, 再根據 datasheet 的公式計算.