Blog. Just Blog

Включение регистрозависимых имен файлов на NTFS-дисках

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Software | Автор: ManHunter
Включение регистрозависимых имен файлов на 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" соответственно.
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include 'win32w.inc'
  5.  
  6. ;---------------------------------------------
  7.  
  8. section '.data' data readable writeable
  9.  
  10. struct UNICODE_STRING
  11.         Length        dw ?
  12.         MaximumLength dw ?
  13.         Buffer        dd ?
  14. ends
  15.  
  16. struct OBJECT_ATTRIBUTES
  17.         Length dd ?
  18.         RootDirectory dd ?
  19.         ObjectName dd ?
  20.         Attributes dd ?
  21.         SecurityDescriptor dd ?
  22.         SecurityQualityOfService dd ?
  23. ends
  24.  
  25. struct IO_STATUS_BLOCK
  26.         Status dd ?
  27.         Information dd ?
  28. ends
  29.  
  30. struct LARGE_INTEGER
  31.         LowPart dd ?
  32.         HighPart dd ?
  33. ends
  34.  
  35. fname1 du '\??\C:\test.txt',0
  36. fname2 du '\??\C:\TEST.TXT',0
  37.  
  38. data1  db 'DATA1'
  39. dlen = $-data1
  40. data2  db 'DATA2'
  41.  
  42. hFile   dd ?
  43.  
  44. align 4
  45. FileOffset LARGE_INTEGER
  46.  
  47. align 4
  48. object_name UNICODE_STRING
  49. align 4
  50. attr OBJECT_ATTRIBUTES
  51. align 4
  52. status_block IO_STATUS_BLOCK
  53.  
  54. FILE_READ_DATA  = 0x0001
  55. FILE_WRITE_DATA = 0x0002
  56. FILE_OPEN_IF    = 0x00000003
  57.  
  58. ;---------------------------------------------
  59.  
  60. section '.code' code readable executable
  61.  
  62.   start:
  63.         ; Заполнить юникодную строку
  64.         invoke  RtlInitUnicodeString,object_name,fname1
  65.  
  66.         ; Заполнить атрибуты
  67.         mov     [attr.Length],sizeof.OBJECT_ATTRIBUTES
  68.         mov     [attr.RootDirectory],NULL
  69.         mov     [attr.Attributes],0
  70.         mov     [attr.ObjectName],object_name
  71.         mov     [attr.SecurityDescriptor],NULL
  72.         mov     [attr.SecurityQualityOfService],NULL
  73.  
  74.         ; Создать первый файл
  75.         invoke  NtCreateFile,hFile,\
  76.                 FILE_READ_DATA+FILE_WRITE_DATA,\
  77.                 attr,status_block,NULL,0,\
  78.                 FILE_SHARE_READ+FILE_SHARE_WRITE,\
  79.                 FILE_OPEN_IF,\
  80.                 0,NULL,0
  81.  
  82.         ; Записать данные в файл
  83.         invoke  NtWriteFile,[hFile],\
  84.                 NULL,NULL,NULL,\
  85.                 status_block,data1,dlen,FileOffset,NULL
  86.  
  87.         ; Закрыть файл
  88.         invoke  NtClose,[hFile]
  89.  
  90.         ; Заполнить юникодную строку
  91.         invoke  RtlInitUnicodeString,object_name,fname2
  92.  
  93.         ; Создать второй файл
  94.         invoke  NtCreateFile,hFile,\
  95.                 FILE_READ_DATA+FILE_WRITE_DATA,\
  96.                 attr,status_block,NULL,0,\
  97.                 FILE_SHARE_READ+FILE_SHARE_WRITE,\
  98.                 FILE_OPEN_IF,\
  99.                 0,NULL,0
  100.  
  101.         ; Записать данные в файл
  102.         invoke  NtWriteFile,[hFile],\
  103.                 NULL,NULL,NULL,\
  104.                 status_block,data2,dlen,FileOffset,NULL
  105.  
  106.         ; Закрыть файл
  107.         invoke  NtClose,[hFile]
  108.  
  109.         invoke  ExitProcess,0
  110.  
  111. ;---------------------------------------------
  112.  
  113. section '.idata' import data readable writeable
  114.  
  115.   library kernel32,'kernel32.dll',\
  116.           user32,'user32.dll',\
  117.           ntdll,'ntdll.dll'
  118.  
  119.   include 'apia\kernel32.inc'
  120.   include 'apia\user32.inc'
  121.  
  122. import ntdll,\
  123.         RtlInitUnicodeString,'RtlInitUnicodeString',\
  124.         NtCreateFile,'NtCreateFile',\
  125.         NtWriteFile,'NtWriteFile',\
  126.         NtClose,'NtClose'
Если включена поддержка регистрозависимых имен файлов, то после выполнения программы вы получите два файла, каждый со своей строкой, если нет, то на диске будет только один файл со строкой "DATA2".

Два файла на диске
Два файла на диске

Далеко не все программы и файловые менеджеры могут работать с такими файлами, для этого они тоже должны использовать Nt-функции.

В приложении пример программы с исходным текстом, которая пытается создать два файла с именами в разном регистре.

Пример программы с исходным текстом (FASM)Пример программы с исходным текстом (FASM)

Case-Sensitive.Files.Demo.zip (1,849 bytes)


Поделиться ссылкой ВКонтакте
Просмотров: 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 и им подобные
newfuck (28.04.2021 в 08:53):
Проверил! Я ожидал отказа дисковой системы с синим экраном или неудаляемых файлов)
ManHunter (27.04.2021 в 15:03):
Что удерживает от взять и проверить самостоятельно?
newfuck (27.04.2021 в 14:54):
что же будет, если создать два файла с одинаковыми именами, а затем через реестр запретить их? Что покажет Winда? Или создать на флешке с ntfs и вставить её на комп, где нет поддержки таких имен - файлы отобразятся?

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.003 сек.) / Память: 4.5 Mb
Наверх