Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Исполняемые файлы загружаются в адресное пространство процесса с помощью сопоставленного с памятью файла образа. Сам файл не требуется ни открывать, ни создавать дескриптор, так как сопоставление выполняется через раздел. Файловые системы должны проверять и обеспечивать соблюдение этих специальных семантик, предполагая, что они поддерживают файлы с отображением в памяти. Например, код файловой системы FASTFAT для проверки этого случая можно найти в функции FatOpenExistingFCB в исходном файле Create.c из примеров fastfat, содержащихся в WDK:
//
// If the user wants write access to the file, make sure there
// is not a process mapping this file as an image. Any attempt to
// delete the file will be stopped in fileinfo.c
//
// If the user wants to delete on close, check at this
// point though.
//
if (FlagOn(*DesiredAccess, FILE_WRITE_DATA) || DeleteOnClose) {
Fcb->OpenCount += 1;
DecrementFcbOpenCount = TRUE;
if (!MmFlushImageSection( &Fcb->NonPaged->SectionObjectPointers,
MmFlushForWrite )) {
Iosb.Status = DeleteOnClose ? STATUS_CANNOT_DELETE :STATUS_SHARING_VIOLATION;
try_return( Iosb );
}
}
Таким образом, файловая система гарантирует, что сопоставленный с памятью файл, включая исполняемый образ, не может быть удален, даже если файл не открыт.