Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Latest commit

 

History

9 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Pure Assembly Windows Kernel-Mode Driver (MSR R/W)

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

内部では以下を行っています。

  1. 既存の同名サービスを停止・削除(sc stop / sc delete
  2. NASMで .asm.obj にアセンブル
  3. lld-link でカーネルドライバ(.sys)としてリンク
  4. 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アドレス検証)の重要性を身をもって実感しました。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages