DWORD baseAddress = (DWORD) GetModuleHandle(NULL);
そのコードを DLL に入れてプロセスに注入すると、注入されたプロセスのベース アドレスと同じように見えます。
それはどのように正確に機能しますか?HMODULE から DWORD へのキャストはどのように機能しますか? DWORD の代わりに void* にキャストすると機能しますか?
これは、32 ビットおよび 64 ビット バージョンの Windows の実装の詳細です。HMODULE はそれよりも古いもので、Windows の 16 ビット バージョンでは真のハンドルでした。これは win32 では不要になりました。モジュールがロードされる仮想メモリ アドレスは、モジュールを一意に識別します。したがって、VM アドレスを使用することが望ましいため、ハンドル テーブルに保持する必要はありません。
これは、DWORD にキャストできないことを意味し、64 ビット バージョンで仮想メモリ アドレスを格納するのに十分ではありません。DWORD_PTR を使用する必要があります。
これが機能するのは、Windows がたまたまベース アドレスを識別ハンドルとして使用したためであり、32 ビット システムではアドレスが DWORD に適合するためです。Windows はこれを行う必要がないため、Windows に頼るべきではありません。