Поделиться через


Исполняемые образы

Исполняемые файлы загружаются в адресное пространство процесса с помощью файла сопоставленного в памяти образа. Сам файл не требуется открывать, а также не требуется создавать дескриптор, так как сопоставление выполняется с помощью раздела. Файловые системы должны проверка для применения этой специальной семантики, при условии, что они поддерживают сопоставленные в памяти файлы. Например, код файловой системы 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 );
        }
    }

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