Включение регистрозависимых имен файлов на NTFS-дисках
Включение регистрозависимых имен файлов на NTFS-дисках
Век живи - век учись. Сколько лет работаю с дисками, отформатированными в NTFS, но лишь недавно узнал, что эта файловая система поддерживает регистрозависимые имена файлов, как это "из коробки" работает на *NIX-системах. То есть в Windows можно сделать так, чтобы файлы "FILE.TXT" и "file.txt" считались разными файлами и при этом одновременно существовали в каталоге.
Такая возможность в NTFS задумана изначально, но в Windows по умолчанию отключена. Как мне кажется, это сделано для обеспечения максимальной совместимости на случай, если в системе используются диски с разными файловыми системами. Для включения регистрозависимых имен файлов достаточно поменять всего один ключ в реестре. Открываем regedit, находим следующий ключ:
[HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\kernel]
"obcaseinsensitive"=dword:00000001
Параметр obcaseinsensitive отвечает за нужную нам опцию. Меняем его значение на 0, перезагружаем компьютер. Все, теперь NTFS становится чувствительной к регистру символов в именах файлов и каталогов.
Но при попытке создать два разных каталога через стандартный Проводник Windows нас ждет неудача, регистр продолжает игнорироваться. В чем дело? Копнем немного глубже. В Проводнике используются стандартные функции WinAPI типа CreateDirectory, но они по сути являются лишь надстройками над низкоуровневыми функциями. Непосредственно за создание каталога отвечает функция NtCreateFile, в которой при помощи определенного флага можно указать чувствительность к регистру символов. Так вот, при вызове ядерных функции из API высокого порядка, всегда используется флаг OBJ_CASE_INSENSITIVE, то есть регистр значения не имеет.
Для тестов я написал на Ассемблере следующую программу, которая использует для работы с файлами только низкоуровневые функции. Она создает в корне диска C: два файла с именами "test.txt" и "TEST.TXT", а затем записывает в них строки "DATA1" и "DATA2" соответственно.
Code (Assembler) : Убрать нумерацию
- format PE GUI 4.0
- entry start
- include 'win32w.inc'
- ;---------------------------------------------
- section '.data' data readable writeable
- struct UNICODE_STRING
- Length dw ?
- MaximumLength dw ?
- Buffer dd ?
- ends
- struct OBJECT_ATTRIBUTES
- Length dd ?
- RootDirectory dd ?
- ObjectName dd ?
- Attributes dd ?
- SecurityDescriptor dd ?
- SecurityQualityOfService dd ?
- ends
- struct IO_STATUS_BLOCK
- Status dd ?
- Information dd ?
- ends
- struct LARGE_INTEGER
- LowPart dd ?
- HighPart dd ?
- ends
- fname1 du '\??\C:\test.txt',0
- fname2 du '\??\C:\TEST.TXT',0
- data1 db 'DATA1'
- dlen = $-data1
- data2 db 'DATA2'
- hFile dd ?
- align 4
- FileOffset LARGE_INTEGER
- align 4
- object_name UNICODE_STRING
- align 4
- attr OBJECT_ATTRIBUTES
- align 4
- status_block IO_STATUS_BLOCK
- FILE_READ_DATA = 0x0001
- FILE_WRITE_DATA = 0x0002
- FILE_OPEN_IF = 0x00000003
- ;---------------------------------------------
- section '.code' code readable executable
- start:
- ; Заполнить юникодную строку
- invoke RtlInitUnicodeString,object_name,fname1
- ; Заполнить атрибуты
- mov [attr.Length],sizeof.OBJECT_ATTRIBUTES
- mov [attr.RootDirectory],NULL
- mov [attr.Attributes],0
- mov [attr.ObjectName],object_name
- mov [attr.SecurityDescriptor],NULL
- mov [attr.SecurityQualityOfService],NULL
- ; Создать первый файл
- invoke NtCreateFile,hFile,\
- FILE_READ_DATA+FILE_WRITE_DATA,\
- attr,status_block,NULL,0,\
- FILE_SHARE_READ+FILE_SHARE_WRITE,\
- FILE_OPEN_IF,\
- 0,NULL,0
- ; Записать данные в файл
- invoke NtWriteFile,[hFile],\
- NULL,NULL,NULL,\
- status_block,data1,dlen,FileOffset,NULL
- ; Закрыть файл
- invoke NtClose,[hFile]
- ; Заполнить юникодную строку
- invoke RtlInitUnicodeString,object_name,fname2
- ; Создать второй файл
- invoke NtCreateFile,hFile,\
- FILE_READ_DATA+FILE_WRITE_DATA,\
- attr,status_block,NULL,0,\
- FILE_SHARE_READ+FILE_SHARE_WRITE,\
- FILE_OPEN_IF,\
- 0,NULL,0
- ; Записать данные в файл
- invoke NtWriteFile,[hFile],\
- NULL,NULL,NULL,\
- status_block,data2,dlen,FileOffset,NULL
- ; Закрыть файл
- invoke NtClose,[hFile]
- invoke ExitProcess,0
- ;---------------------------------------------
- section '.idata' import data readable writeable
- library kernel32,'kernel32.dll',\
- user32,'user32.dll',\
- ntdll,'ntdll.dll'
- include 'apia\kernel32.inc'
- include 'apia\user32.inc'
- import ntdll,\
- RtlInitUnicodeString,'RtlInitUnicodeString',\
- NtCreateFile,'NtCreateFile',\
- NtWriteFile,'NtWriteFile',\
- NtClose,'NtClose'
Два файла на диске
Далеко не все программы и файловые менеджеры могут работать с такими файлами, для этого они тоже должны использовать Nt-функции.
В приложении пример программы с исходным текстом, которая пытается создать два файла с именами в разном регистре.
Просмотров: 2770 | Комментариев: 7
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(05.08.2021 в 15:00):
Обновления включены. Да причина на самом деле пофиг, просто сам факт, что MS тоже могут создавать такое "в рабочем порядке".
Petya
(05.08.2021 в 14:18):
Обновления вырублены?
Если нет, то, видимо, с обновлением прилетел файл в другом регистре, который в обычных условиях перезаписал бы оригинал, а тут такие спецэффекты возникли...
ManHunter
(28.06.2021 в 21:49):
Кстати, после включения опции в реестре, совершенно случайно обратил внимание, что в папке винды появилось два файла - NOTEPAD.EXE и основной notepad.exe. Не малвара стопудово, оба файла с валидной подписью Microsoft, но с разными иконками и разным размером, оба запускаются как Блокнот. Чудеса какие-то.
Exit
(28.04.2021 в 16:25):
Ох, блин, не винда, а ящик пандоры *рукалицо*
не удивлюсь, если появится вирусня с именем SVCHOST.EXE, в папке с родным svchost.exe
или прочие \System32\wininit.exe и им подобные
не удивлюсь, если появится вирусня с именем SVCHOST.EXE, в папке с родным svchost.exe
или прочие \System32\wininit.exe и им подобные
newfuck
(28.04.2021 в 08:53):
Проверил! Я ожидал отказа дисковой системы с синим экраном или неудаляемых файлов)
ManHunter
(27.04.2021 в 15:03):
Что удерживает от взять и проверить самостоятельно?
newfuck
(27.04.2021 в 14:54):
что же будет, если создать два файла с одинаковыми именами, а затем через реестр запретить их? Что покажет Winда? Или создать на флешке с ntfs и вставить её на комп, где нет поддержки таких имен - файлы отобразятся?
Добавить комментарий
Заполните форму для добавления комментария