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. 関数呼び […]
ビット 1 をカウントする popcnt やエンディアンを変換する bswap など x64 の高機能なビット操作命令を C 言語から呼び出す (Windows, Visual C++)
x64 CPU には、64 ビットレジスタ内の ビット 1 の個数を数えたり、右端あるいは左端から最初にビット 1 が現れる位置を探したり、指定した位置のビットの値を一か所に集めたりする、高機能なビット操作命令があります。それらの命令を Visual C++ から呼び出してみます。C++ ではなく C 言語を使います。 動作確認環境 Windows 11 Home 23H2 Visual Studio Community 2022 (Visual C++) Intel Core i5-8265U […]
x64 アセンブリ言語で、Windows API や C 言語のライブラリを呼び出す .exe, .lib, .dll を開発する (Windows, MASM)
前回は簡単な x64 アセンブリ言語プログラムを作りました。今回は次のプログラムを作ります。 C 言語のライブラリや Windows の API を呼び出すプログラム (.exe) 足し算をするだけのスタティックライブラリ (.lib) C 言語のライブラリや Windows の API を呼び出すスタティックライブラリ (.lib) 足し算をするだけの DLL (.dll) C 言語のライブラリや Windows の API を呼び出す DLL (.dll) 使用するアセンブラは Visual […]
このヒープメモリはいったい誰が確保したものなのか、を調べる方法(Windows, C 言語)
メモリリークの故障解析などで、「このアドレスのヒープメモリはいったい誰が確保したものなのか」を知りたくなる場合があると思います。そんなときは Windows の設定を変更しておくと、メモリ確保時の呼び出し履歴が自動的に記録されます。 動作確認環境 Windows 11 Home 22H2 Visual Studio Community 2022 (Visual C++) WinDbg 10.0 GFlags (Global Flags) GFlags で設定変更 まず、WinDbg と一緒にイン […]