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」を実現したい方は、ぜひこうした直接制御の方法を試してみてはいかがでしょうか。