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 […]

Windows ではカタカナ語の語尾を伸ばして「コンピューター」と書く

Windows では、通常、「-er」で終わる英単語をカタカナで表す際、末尾に「ー」(長音符号)を付加します。参考文献 [1] に多くの例が挙げられていますが、実際に画面で見てみましょう。 動作確認環境 Windows 11 Home 23H2 「-er」は原則「アー」 「computer」は、「コンピュータ」ではなく「コンピューター」です。 「explorer」は、「エクスプローラ」ではなく「エクスプローラー」です。 「server」は、「サーバ」ではなく「サーバー」です。 「user」は、「 […]

WinDbg: プログラムの実行時にメモリにパッチを当てて動作を変える方法

WinDbg を使ってプログラムの起動直後や実行中にメモリの内容を書き換えプログラムの動作を変える方法について説明します。例として、(1) メッセージを書き換える、(2) ロジックを書き換える、(3) 特定の関数の呼び出しを検出する、を行ってみます。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 メッセージを書き換える プログラムが表示するメッセージを変えてみます。以下は、「He […]

Microsoft Learn の機械翻訳で意味が反対になっている例 2 つ

Microsoft Learn (旧 Microsoft Docs, MSDN)のサイトの技術解説は、機械翻訳のせいで意味が反対になっていることがあるので注意が必要です。 リンカーのオプションの説明が逆 たとえば以下は、リンカーのオプション「/BASE」についての説明ページです。 「セキュリティ上の理由から、実行可能ファイルのベース アドレスを /DYNAMICBASE 指定する代わりに、このオプションを使用することをお勧めします。」とあります。日本語として少し不自然ですが、/DYNAMICBA […]

Windows エラー報告の .wer ファイルの読み方

アプリケーションの異常終了時に Windows エラー報告 (Windows Error Reporting; WER) が生成する「Report.wer」ファイルの読み方について簡単に説明します。生成される場所は「%ProgramData%\Microsoft\Windows\WER\ReportArchive」フォルダ内で、中身は単なるテキストファイルです。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 EventType […]