lapka-admin
@lapka-admin

Что такое расширение файла на системном уровне?

Винда довольно жёстко привязывается к всевозможным расширениям и ассоциирует с ними различный софт, в linux расширений файла как таковых нет на сколько я понимаю, это просто часть имени.
Чем обусловлена такая разница подходов и где про это можно почитать что бы разобраться (подробности не до уровня байт-кода конечно))))
  • Вопрос задан
  • 389 просмотров
Решения вопроса 5
saboteur_kiev
@saboteur_kiev
software engineer
Это просто исторически сложилось, и связано не столько с операционной системой, сколько с файловой системой.

В FAT16 расширение хранилось отдельно от имени, а операционная система распознавала расширение исполняемых файлов, чтобы запускать их.
В Windows пошли дальше - добавили ассоции для других файлов, к которым привязали запуск софта, ассоциации хранились в реестре и соответсвенно что запускать определялось системой, вне зависимости от вызывающей программы.
В современной NTFS расширение это уже тоже просто часть имени.

В Линукс изначально файловая система не хранила расширения отдельно, а запуск программы разбирался по заголовку файла. Вдобавок графический интерфейс появился гораздо позже, и запуск документов и других не-исполняемых программ по ассоциации делали именно в графическом интерфейсе, а не на уровне системы - сама система работает только с исполняемыми файлами, для чего есть аттрибут execute.

Вот собственно и все - то есть исторически возникло от организации файлов и файловой системы.
Оба подхода по-своему удобны.
Ответ написан
Stalker_RED
@Stalker_RED
Да, это и в винде просто часть имени. Можно переименовать любой файл как вам угодно, с другим расширением, или вообще без него, и все равно в большинстве случаев его можно будет открыть через "открыть с помощью", или через меню "файл-открыть", или просто перетащив на иконку программы, или еще как-нибудь.

Но в винде "из коробки" гораздо больше "магии" завязано на расширение. И началось это еще во времена DOS, если не раньше. Какие именно подробности вас интересуют? Начать можно отсюда.
Ответ написан
Комментировать
CityCat4
@CityCat4
//COPY01 EXEC PGM=IEBGENER
На системном уровне "расширение" имени - от одной до (PATH_MAX - длина текста до последней точки) символов. В нем нет никакой магии и к функционированию ОС оно не имеет никакого отношения. Как в винде, так и в линухе можно заводить файлы без расширения вообще и ничего за это не будет. "Расширение" имени - это просто удобный способ договориться о том, что это за файл и как его следует открывать.
В линуховом гуе точно так же как в винде "расширение" имеет большое значение - потому что определяет - что будет запущено при клике на файле.
"Расширение" не является единственным способом идентификации типа файла и вполне может быть липовым - вирусня очень часто в винде использует фейковые расширения - старый-старый прием - дать имя с "типо расширением" ну например .doc, за которым стопицот пробелов и настоящее расширение (обычно .exe или другое исполняемое)
В консоли есть команда file - которая определяет тип файла, не используя "расширение".
Ответ написан
Комментировать
Что такое расширение файла на системном уровне?
Ничего. На системном уровне совершенно иные привязки, например, inode в некоторых ФС Linux, кластер в NTFS.

Винда довольно жёстко привязывается
Многие привязки можно переопределить через графическую оснастку.

Чем обусловлена такая разница подходов
Удобство.
Ответ написан
Комментировать
@UndefinedBehaivor
Там просто расширения ассоциируются через реестр. При двойном клике например передается управление в shell32.dll!ShellExecute оттуда идет парсинг расширения, после расширение ищется из ассоциированных и врубается соответствующая программа. Например, для .txt - по дефолту notepad.exe, тогда врубается notepad.exe file.txt, можно поставить собственный софт и будет врубаться он.

Кстати, по этому принципу можешь сделать свой проводник. Берешь убиваешь основной, свой ставишь в авторан, при старте прогружаешь все с авторана через ShellExecute ( парсишь реестр ветки Run/RunOnce, после из RunOnce удаляешь ), потом парсишь десктоп и отрисовываешь иконки, создавая ассоциативный массив с сектором пикселей и путем до файла. После двойного клика передаешь путь до файла через ShellExecute. Профит


Есть также жестко зашитые расширения, например "PE Executable" в реестре пишут - и это тогда передается в загрузчик винды через ntdll.dll!RtlCreateProcessAsUser с уведомлением csrss.exe. Примерно так. Можешь свои проги так попробовать поврубать, только они могут некорректно работать, т.к система будет не знать, что они запущены. Будет просто дескриптор процесса зареган в ядре и создан поток на EntryPoint ( ну или TLS-коллбеки, у кого что ).

Ты можешь зарегать например .program как PE Executable и переименовать все экзешники в нее и тогда они будут врубаться. Или вообще вставить путь до своего софта, тогда сможешь перехватить запуск любой программы через шелл-оболочку, но вызовы в обход shell32 будут игнорироваться. Чтобы и их ловить надо поставить фильтр в драйвере через ntoskrnl.exe!PsSetCreateProcessNotifyRoutine

Т.е попробуй из любого кода на нативном языке ( делфи/си и т.д ) вызвать ShellExecute(0, "open", "file.txt", 0, 0, SW_SHOW) - откроется нотпад с файлом, а если пропишешь CreateProcess утебя вернет ошибку
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы