レイモンド
月19日, 2017
ベースアドレスの競合が原因でDLLを再配置する必要がある場合は、イメージが再配置され、再配置されたDLL全体がページファイルによってバックアップさ
説明をより慎重に読むと、ページファイルによってバックアップされるのは、再配置されたDLL全体ではないことがわかります。 より正確には、フィックスアップを含むすべてのページがページファイルに配置されます。 運が良く、フィックスアップのないページがある場合、カーネルはフィックスアップを適用しなかったため、そのページにはコピーオンライトが発生しなかったため、そのページは引き続きファイルシステムイメージによってバックアップされます。
私が意図的にベースアドレスの衝突を引き起こすために見た引数の1つは、再配置されたDLLがページファイルにコピーされるようにすることです。 例えば、ページファイルは、SSDまたは(gasp)RAMドライブ上にあり得る。
そのロジックは、フィックスアップのないページの場合を考慮に入れられません。 これらのページは元のファイルから直接ページインされますが、元のファイルが非常に遅いメディア上にある場合や、CD-ROMドライブやネットワークドライブなど、失われる可能性のあるメディア上にある場合は問題になります。
幸いなことに、DLL全体をページファイルにロードするために、ベースアドレスの競合で面白いゲームをプレイする必要はありません。 代わりに、/SWAPRUNリンカーフラグを使用して、ローダーがイメージをスワップファイルにコピーすることをモジュールヘッダーで指定できます。
Raymond Chen
フォロー