C言語を一切介さず、x64 NASMアセンブリのみで実装したWindowsカーネルモードドライバです。 AMD RyzenのMSR(Model Specific Register)を直接読み書きし、動作クロック(P-state FID/DID)を ユーザー空間から制御するための最小プロトタイプとして開発しました。
自作PC・オーバークロック検証を行う中で、「既存ツールに頼らず、仕組みを一から理解して 自分の手で作る」ことを目標に、通常はC言語+WDKで書かれるカーネルドライバを あえてアセンブリのみで構築するチャレンジとして着手しました。 DriverEntryのエントリポイントからIRP処理、WDM APIの呼び出し規約まで、 OSがドライバに要求する契約をすべて自分でハンドリングする必要があり、 低レイヤーのWindows内部構造とx64呼び出し規約への理解を深める題材になっています。
AMD Ryzen 9 9950Xでオーバークロックを行う際、実行される命令セット (SSE / AVX2 / AVX-512等)によって安全に維持できるクロック上限が異なります。 重い命令が混じった瞬間にクロックが追いつかずフリーズする、という問題を 根本的に解決するには、ワークロードに応じてクロックを動的に調整する仕組みが必要です。 本リポジトリは、その自動オーバークロック機構を実現するための第一歩として、 MSR経由でP-state情報を安全に読み書きできる最小構成のカーネルドライバを実装したものです。
- C言語ゼロ: DriverEntry / DriverUnload / Dispatchルーチンをすべて生のアセンブリで記述しています。 スタックフレームの確保(shadow space込み)やレジスタ退避も手動で管理しています。
- 構造体オフセットの直接操作:
ntddk.hに頼らず、IRPやIO_STACK_LOCATIONのメモリレイアウトを リバースエンジニアリング/ドキュメントから割り出し、オフセットアクセスで直接読み書きしています。 - WDM APIの直接呼び出し:
IoCreateDevice/IoCreateSymbolicLink/IoCompleteRequest等を__imp_シンボル経由でインポートし、x64 Windows呼び出し規約(レジスタ引数・shadow space)に 忠実に従って呼び出しています。 - 独自IOCTL設計:
IOCTL_READ_MSR/IOCTL_WRITE_MSRを定義し、入出力バッファの サイズ検証・MSRアドレスのホワイトリストチェックを行った上でRDMSR/WRMSR命令を発行しています。 - ユーザー空間検証: PythonのDeviceIoControl経由でテストクライアントを実装し、
実機のRyzen P-state MSR(
0xC0010064〜)に対する読み書きを確認済みです。 - WinRing0 (OpenLibSys) を参照仕様としつつ非依存で再構築: 既存実装のロジックを参考にしながらも、 C実装やヘッダに一切依存しないゼロからのビルドにこだわりました。
| ファイル | 役割 |
|---|---|
aoc.asm |
ドライバ本体(NASM x64アセンブリ) |
db.ps1 |
ビルド〜ドライバの登録・起動を行うPowerShellスクリプト |
aoctest.py |
MSR読み書きの動作確認用テストクライアント |
aoctest2.py |
デバイスへの接続可否のみを確認する簡易疎通テスト |
- NASM 3.01
- LLVM 22.0.1 (lld-link)
- WDK 10.0.26100.6584
管理者権限のPowerShellで実行してください(カーネルドライバのロードには管理者権限が必要です)。
.\db.ps1 aoc内部では以下を行っています。
- 既存の同名サービスを停止・削除(
sc stop/sc delete) - NASMで
.asmを.objにアセンブル lld-linkでカーネルドライバ(.sys)としてリンクsc create/sc startでサービス登録・起動
動作確認は Python クライアントから行います。
python aoctest2.py # デバイスへの接続確認
python aoctest.py # MSR (0xC0010064) の読み書き確認Caution
テスト署名モードが有効な環境(bcdedit /set testsigning on)でのみ動作します。
MSR操作はシステムの安定性に直結するため、実行は自己責任で行ってください。
プロトタイプ段階として、MSR経由の基本的なR/Wは実機で動作確認済みです。
現状はMSRアドレスを 0xC0010064 一件にのみ許可するホワイトリスト方式で、
安全側に倒した最小実装になっています。
今後の展望:
- SIMD命令セット(SSE/AVX2/AVX-512)検出ロジックの実装
- 検出結果に応じたP-state自動調整ロジック
- 複数MSRアドレス・複数コアへの対応
- ドライバ署名/WHQL相当の検証フローの検討
- Windows x64呼び出し規約(レジスタ渡し引数・shadow space・スタックアライメント)を C言語のヘルプなしで正確に守ることの難しさと重要性を学びました。
- IRP / IO_STACK_LOCATIONなど、普段はヘッダファイルの向こう側にある構造体を 自分でオフセット計算しながら扱う経験を積むことができました。
- カーネル空間でのバグは即ブルースクリーンに直結するため、 境界値チェック(バッファサイズ、MSRアドレス検証)の重要性を身をもって実感しました。