我已经根据经验确定,在我的系统中,创build为特定大小的内存映射文件默认情况下始终完全归零。 例如,使用该呼叫
HANDLE hMM = CreateFileMapping (h, NULL, PAGE_READWRITE, 0, 0x01400000,//20MB NULL);
..并写入该文件的映射视图总是导致一个20MB的文件完全归零,除非我写了非零数据。
我想知道如果未初始化的文件的部分可以假设为零。 这种行为一般在Windows上保证?
CreateFileMapping文档( 注释部分)明确指出
如果文件被扩展,则文件的旧的结尾和文件的结尾之间的文件内容不能保证为零; 行为是由文件系统定义的。
所以,如果你的磁盘上的文件开始为空,它不能保证被归零(因为你正在扩大它)。 我不认为文件系统驱动程序会以这种方式泄漏潜在的敏感信息,但是谁知道,也许一些文件系统驱动程序会回收已经用于您的进程的页面(这不应该是安全风险)。
另一方面,我不知道不提供安全性的文件系统(例如FAT)是否会为您提供正好分配给文件新部分的群集的内容。
相反,如果您创建的内存部分不是由磁盘上的文件支持,而是由分页文件创建的,则可以保证您获得的内存全部为零:
由操作系统页面文件支持的文件映射对象中页面的初始内容为0(零)。
这可以保证,因为当创建一个纯内存分页文件时,内存管理器可以完全控制正在发生的事情,并从空白页面池中获取页面。
所有新分配的页面在被用户模式访问之前都被清零,否则敏感信息可能会从内核模式或其他进程中泄露。 这适用于像NtAllocateVirtualMemory
/ VirtualAlloc
和NtCreateSection
/ CreateFileMapping
。
我想,同样的概念延伸到文件,因为任何体面的文件系统不希望以这种方式泄漏信息。
编辑:但是,拿最后一段的盐 – 两个文档的CreateFileMapping和SetEndOfFile声称文件的扩展部分未定义。 我会做更多的调查。
编辑2:好的,Win32 MSDN文档是绝对错误的 。 ZwSetInformationFile的文档指出:
如果将FileInformationClass设置为FileEndOfFileInformation,并且FILE_END_OF_FILE_INFORMATION的EndOfFile成员指定了超出当前文件结束标记的偏移量,则ZwSetInformationFile将扩展文件并用零填充扩展名。
所以你去了 扩展部分保证为零。
是的,正如wj32所指出的那样。 这与新界自出生以来所遇到的C2要求有关。 然而取决于你想要做什么,你应该看看稀疏文件。