Содержимое сопоставленного файла памяти Windows по умолчанию всегда обнуляется? - PullRequest
3 голосов
/ 28 января 2011

Я определил эмпирически, что в моей системе файл с отображением в памяти, созданный с определенным размером, по умолчанию всегда полностью обнуляется.Например, при использовании вызова

HANDLE hMM = 
    CreateFileMapping (h,
                        NULL,
                        PAGE_READWRITE,
                        0,
                        0x01400000,//20MB
                        NULL);

.. и записи в отображенный вид этого файла всегда получается файл размером 20 МБ, который полностью обнуляется, кроме случаев, когда я записал ненулевые данные.

Мне интересно, можно ли считать неинициализированные части файла нулями.Это поведение гарантируется в Windows в целом?

Ответы [ 3 ]

7 голосов
/ 28 января 2011

Документация CreateFileMapping ( Замечания раздел) явно заявляет, что

Если файл расширен, содержимое файла между старым концом файла и новым концом файла не гарантируется равным нулю; поведение определяется файловой системой.

Итак, если ваш файл на диске начинается пустым, он не гарантированно обнуляется (поскольку вы его расширяете); Я не думаю, что драйверы файловой системы будут рисковать утечкой потенциально конфиденциальной информации таким образом, но кто знает, может быть, некоторые драйверы файловой системы перерабатывают страницы, уже используемые для вашего процесса (и это не должно быть угрозой безопасности). 1013 *

С другой стороны, я не знаю, были бы файловые системы, которые вообще не обеспечивают безопасность (например, FAT), настолько обеспокоены, чтобы предоставить вам содержимое кластеров, которое они случайно выделили для новой части файла .

Если вместо этого вы создаете раздел памяти, не поддерживаемый файлом на диске, а файлом подкачки, это гарантирует, что вся полученная память обнуляется:

Исходное содержимое страниц в объекте сопоставления файлов, поддерживаемых файлом подкачки операционной системы, равно 0 (ноль).

Это гарантировано, вероятно, потому что при создании файла подкачки только для памяти менеджер памяти полностью контролирует происходящее и отбирает страницы из пула пустых страниц.

6 голосов
/ 28 января 2011

Все вновь выделенные страницы обнуляются, прежде чем они становятся доступными для пользовательского режима, потому что в противном случае конфиденциальная информация могла бы вытекать из режима ядра или других процессов. Это относится к таким вещам, как NtAllocateVirtualMemory / VirtualAlloc и NtCreateSection / CreateFileMapping.

Я полагаю, что та же концепция распространяется и на файлы, потому что любая приличная файловая система не захочет утекать информацию таким образом.

РЕДАКТИРОВАТЬ: Тем не менее, возьмите этот последний абзац с частичкой соли - и документация для CreateFileMapping и SetEndOfFile утверждают, что расширенная часть файла не определена. Я сделаю еще расследование.

РЕДАКТИРОВАТЬ 2: ОК, документация Win32 MSDN определенно неправильно . Документация для ZwSetInformationFile гласит:

Если вы установите FileInformationClass в FileEndOfFileInformation и Член EndOfFile из FILE_END_OF_FILE_INFORMATION указывает смещение за пределы текущего отметка конца файла, ZwSetInformationFile расширяет файл и дополняет расширение с нулями.

Итак, поехали. Расширенная часть равна гарантированно равной нулю.

1 голос
/ 07 февраля 2011

Да, как указано в wj32. Это связано с требованиями c2, которым NT соответствует с момента своего рождения. Однако, в зависимости от того, что вы пытаетесь сделать, вам, вероятно, следует поискать редкие файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...