PCをピカピカ光らせる「ゲーミングPC」が流行る一方で、「作業に集中したいからPCは真っ暗(ステルス)にしておきたい」という需要も根強くあります。
しかし、多くのグラフィックボードは、メーカー公式の重い制御ソフト(例:Palit ThunderMaster など)を常駐させておかないと、LEDを消灯状態に維持できません。
今回は、公式ソフトの常駐を避け、Windowsログオン時に管理者権限のダイアログ(UAC)を出さずにGPUのLEDを消灯する方法をご紹介します。初心者の方にもわかりやすく解説しつつ、技術的に詳しい方向けに「どうやって公式ソフトなしでハードウェアを制御しているのか」というコードレベルの裏側もお届けします。
公式ソフトを常駐させるデメリット
通常、Palit製のグラフィックボード(今回は GeForce RTX 3080 Ti)のLEDを消すには、公式ユーティリティ「ThunderMaster」を使用します。
しかし、これをWindows起動時に毎回自動起動させる設定にすると、以下のようなデメリットがあります。
- バックグラウンドで常にメモリやCPUリソースを消費してしまう
- 起動時に管理者権限(UAC)を求めるポップアップが表示され、操作がワンテンポ遅れる
- 他のオーバークロックツール(MSI Afterburner等)と競合するリスクがある
そこで、「ソフトを常駐させずに、ハードウェア(GPU)へ直接『消灯しろ』という命令だけを送り込む」というアプローチをとります。
【技術深掘り】静的解析でLED制御の仕組みを解析する
どうすれば公式ソフトなしでLEDを消せるのでしょうか。
実は、LEDの点灯状態はGPU内部の「I²C(アイ・スクエア・シー)」と呼ばれる通信バスを介して制御されています。
今回、公式ソフトの実行ファイル(ThPanel.exe v4.16)をリバースエンジニアリング(静的解析)した結果、以下の興味深い事実が判明しました。
# ThPanel.exe の LED OFF シーケンス解析結果
- nvapi64.dll を動的ロードし、プライベートAPI NvAPI_I2CWriteEx を解決
- ターゲット: I²C 7-bit アドレス x49 (wire address x92)
- 手順1: レジスタ xE0 にデータ x00 を書き込む
- 手順2: レジスタ x60 にデータ x00 を書き込む
つまり、重いGUIソフト全体を動かさなくても、WindowsのAPIを通じて「アドレス0x49のレジスタに0を2回書き込む」という処理だけを行えば、LEDは即座に消灯するのです。
C#による「直接制御プログラム」の作成
上記の解析結果をもとに、LED消灯機能だけに特化した超軽量なコマンドラインプログラム GpuLedOff.exe をC#で実装しました。
安全性を担保するため、プログラム内では以下の厳格なチェック(安全境界)を設けています。
if (gpu.DeviceId == 0x220810DE && gpu.SubsystemId == 0x22081569) {
// Palit RTX 3080 Ti と完全に一致した場合のみI2C書き込みを実行
nvapi.WriteI2cByte(target.Handle, 0x49, 0xE0, 0x00);
nvapi.WriteI2cByte(target.Handle, 0x49, 0x60, 0x00);
}
対象外のグラフィックボードでは処理がスキップされるため、他のデバイスを破損させる心配はありません。この処理はAPIの呼び出しのみで完結するため、わずか 58〜70ミリ秒 という一瞬で完了し、即座にプログラムは終了します。
タスクスケジューラで「完全自動・サイレント消灯」を実現
最後に、この GpuLedOff.exe をWindows起動時に自動で実行させます。
通常、ハードウェアにアクセスするプログラムをスタートアップに登録すると「このアプリがデバイスに変更を加えることを許可しますか?」というUAC警告が出ます。
これを回避するために、Windows タスクスケジューラ を活用します。
PowerShellスクリプトを用いて、以下のようなタスクを登録します。
- トリガー: ユーザーログオン時(起動直後の負荷を避けるため15秒遅延させる)
- 実行権限: Limited(通常ユーザー権限)
特徴的な点として、NVIDIAのI²C通信APIは通常権限(Limited)でも呼び出しが可能なため、タスクを「最上位の特権(管理者権限)」で実行する必要がありません。
これにより、PCを起動してログインするだけで、UACの警告も一切出ずに約15秒後にLEDが消灯する環境を構築できました。
まとめ
公式の制御ソフトウェアを常駐させずとも、静的解析とC#によるAPIの直接制御を利用することで、効率的なハードウェア制御が可能になります。
「光らないゲーミングPC」を実現したい方は、ぜひこうした直接制御の方法を試してみてはいかがでしょうか。