2 台の PC を USB デバッグケーブルで接続してカーネルデバッグする方法 (Windows)
以前、「WinDbg のカーネルデバッグで使える USB 3.0 ケーブルを秋葉原で買った部品で作る」という記事を書きました。今回は、その USB ケーブルで 2 台の PC を接続し、WinDbg でカーネルデバッグを開始するまでの手順を記述します。ただし、詳細は環境によって差異があると思います。一例としてご覧ください。 動作確認環境 Dell Inspiron 13 5390(2019 年購入), Windows 11 Home 24H2 Dell Inspiron 13 7370(2018 […]
x86 アセンブリ命令ランキング ベスト 1000
x86 のよく使われる命令を調べてみました。調査対象は Windows の SysWOW64 ディレクトリに入っている 32bit モジュールです。(x86 版ではなく x64 版の一覧はこちらです。) 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) x86 のよく使われる命令 では早速ランキングです。ベスト 1000 と書きましたが、実際は 1041 個です(最下位タイのため順位としては 865 位まで […]
x64 アセンブリ命令ランキング ベスト 1000
x64 のよく使われる命令を調べてみました。調査対象は Windows の System32 ディレクトリに入っている 64bit モジュールです。(x64 版ではなく x86 版の一覧はこちらです。) 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) x64 のよく使われる命令 では早速ランキングです。ベスト 1000 と書きましたが、1000 個を少し超えています。長いです。 順位 命令 個数 割合 累 […]
割り算の商と余りを同時に計算する(x86, x64, C言語)
「割り算の商と余りを同時に計算する」と書きましたが、特別な方法を使うわけではありません。x86/x64 の割り算命令は商と余り(剰余)の両方を同時に計算してくれます。 動作確認環境 Windows 11 Home 24H2 Visual Studio Community 2022 (Visual C++) x86/x64 の割り算命令 x86/x64 アセンブリ言語の割り算命令は div(符号なし)または idiv(符号付き)です。Intel のドキュメントから div と idiv の表を引用 […]
x64 呼び出し規約のシャドウストアは何に使われるのか (Windows)
x64 呼び出し規約には、呼び出し元が確保した 32 バイトのスタック(シャドウストア、シャドウスペース、シャドウ領域、ホームスペース)を呼び出し先が使うというちょっと変わったルールがあります。このシャドウストアは実際に何に使われるのか、いろいろなサンプルプログラムを作って調べてみます。なお、x64 の呼び出し規約やシャドウストアについては、以前の記事 [1] をご覧ください。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (V […]
レジストリのトランザクション機能を使ってユーザー名とパスワードを同時に書き込む (Windows)
あまり知られていないと思いますが、レジストリはトランザクション処理が可能です。たとえば、レジストリに対してユーザー名とパスワードの書き込みを指示した後、コミットして両方を同時に確定したり、ロールバックして取り消したりできます。実際に試してみましょう。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) トランザクション処理の書き方 トランザクション処理を行うには、まず、CreateTransaction 関数 […]
x64 呼び出し規約をわかりやすく説明してみる (Windows)
マイクロソフトのサイト [1] に Windows の x64 呼び出し規約 (calling convention) の公式説明がありますが、網羅性と正確さを重視したためか、機械翻訳が使われているためか、少々わかりにくいところがあります。そこで、ポイントを絞ってできるだけわかりやすく説明してみたいと思います。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) Rust 1.81.0 ルール 1. 関数呼び […]
WinDbg: 条件付きブレークポイントで「ある関数を経由してきたか」をチェックする方法
条件付きブレークポイント (Conditional Breakpoint) では、よく「引数や変数がある値になっているか」をチェックしますが、「ある関数を経由してきたか」はどうやってチェックすればいいのでしょうか。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 「ある関数を経由してきたか」とは 下図のように、関数 common に至るルートが 4 通りあったとします。 単純に関数 […]
アプリケーションのメモリ使用量を制限する方法(Windows)
Windows には、指定したプロセスに対してメモリ使用量の上限を設定する API があります。これを利用して、既存のアプリケーションに制限をかけたり、開発中のプログラムのストレステストを行ったりできます。実際に試してみましょう。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) メモリの使用量を制限する API メモリの使用量を制限する Windows API の使い方について簡単に説明します。 最初に […]
Windows の例外コード(0xC0000005 など)を発生させてみる
Windows のいろいろな例外コード、たとえば 0xC0000005(アクセス違反)や 0xC00000FD(スタックオーバーフロー)を、簡単なプログラムで意図的に発生させてみます。具体的には、次の例外です。 0xC0000005(アクセス違反・リード) 0xC0000005(アクセス違反・ライト) 0xC0000005(アクセス違反・実行) 0xC0000094(ゼロ除算) 0xC000001D(不正な命令) 0xC0000096(特権命令) 0xC0000374(ヒープ破壊) 0xC000 […]