Windowsメモリマップされたファイルの内容は、デフォルトで常にゼロになっていますか?
-
26-10-2019 - |
質問
私のシステムでは、特定のサイズになるように作成されたメモリマップファイルがデフォルトで常に完全にゼロになっていることを経験的に決定しました。たとえば、通話を使用します
HANDLE hMM =
CreateFileMapping (h,
NULL,
PAGE_READWRITE,
0,
0x01400000,//20MB
NULL);
..そして、そのファイルのマッピングされたビューに書き込むと、常にゼロデータを書いた場合を除き、完全にゼロになっている20MBファイルが常になります。
ファイルの初期化された部分がゼロであると想定できるのではないかと思います。この動作は一般的にWindowsで保証されていますか?
解決
createfilemapping ドキュメンテーション (備考 セクション)は明示的に述べています
ファイルが拡張されている場合、ファイルの古い端とファイルの新しい端の間のファイルの内容はゼロであることが保証されていません。動作はファイルシステムによって定義されます。
したがって、ディスク上のファイルが空に起動すると、 いいえ ゼロになることが保証されています(拡張しているので);ファイルシステムドライバーがそのように潜在的に機密情報を漏らすリスクを冒すとは思わないが、おそらくあなたのプロセスに使用されているファイルシステムドライバーが既に使用されているページをリサイクルするかもしれない(そして、これはセキュリティリスクではないはずです)。
一方、セキュリティをまったく提供していないファイルシステム(脂肪など)が、ファイルの新しい部分に配分されたクラスターのコンテンツを提供することに非常に懸念があるかどうかはわかりません。
代わりに、ディスク上のファイルではなく、ページングファイルに裏付けられていないメモリセクションを作成している場合、取得したメモリがすべてゼロになっていることが保証されています。
オペレーティングシステムのページングファイルに裏打ちされたファイルマッピングオブジェクト内のページの初期内容は0(ゼロ)です。
これはおそらく、メモリのみのページングファイルを作成するときに、メモリマネージャーが何が起こっているのかを完全に制御し、空白のページプールからページを取得するためです。
他のヒント
新しく割り当てられたすべてのページは、ユーザーモードにアクセスできるようになる前にゼロになります。これは、繊細な情報をカーネルモードまたは他のプロセスから漏洩する可能性があるためです。これはようなものに当てはまります NtAllocateVirtualMemory
/VirtualAlloc
と NtCreateSection
/CreateFileMapping
.
まともなファイルシステムはこのように情報を漏らしたくないので、同じ概念がファイルに拡張されると思います。
編集:ただし、その最後の段落を一粒の塩で取ります - createfilemappingのドキュメントと setendoffile ファイルの拡張部分が定義されていないと主張しています。もう少し調査します。
編集2:OK、Win32 MSDNドキュメント 間違いなく間違っています. 。のドキュメント ZwSetInFormationFile 州:
FileInformationClassをFileEndOffileInformationに設定し、file_end_of_file_informationのendoffileメンバーが現在のファイルの終了マークを超えてオフセットを指定すると、ZwsetInformationFileはファイルを拡張し、ゼロで拡張機能をパディングします。
だからあなたはそこに行きます。拡張部分 は ゼロであることが保証されています。
はい、WJ32が指摘したように。これは、NTが生まれてから満たしてきたC2要件に関連しています。ただし、何をしようとしているのかに応じて、おそらくスパースファイルを調べる必要があります。