Обход ограничений FAT32/NTFS A.M.D.F. (amdf@mera.net.ru) Xakep, номер #062, стр. 062-080-2 Имена DOS-устройств В каждой Windows системе существует эмуляция MS-DOS. Этот факт тоже накладывает свои ограничения. При работе в командной строке используются псевдонимы для устройств, работа с которыми ничем не отличается от работы с обычными файлами. Под устройства зарезервированы следующие имена файлов: AUX, CON, NUL, PRN, COM1-COM9 и LPT1-LPT9. Простейший пример работы с этими объектами: если в командной строке ввести «dir > prn | sort», то отсортированный список файлов и каталогов текущей папки начнет распечатываться на принтере. Здесь «prn» означает принтер. Понятно, что если бы существовала возможность называть файлы зарезервированными именами устройств, то возникла бы путаница, поэтому эта возможность заблокирована. Способы обхода ограничений Мне известны три способа обхода описанных ограничений. Общий принцип их действия таков: определенным образом составляется название файла, после чего оно передается какой-либо системной функции для работы с файлами. В результате этого алгоритм проверки параметра на корректность не срабатывает, и мы получаем нужный результат – создается файл или каталог с кривым названием для системы. Какие это открывает возможности, я опишу позже. А пока поговорим о самих способах. Некоторые способы можно использовать не только программно, но и на пользовательском уровне. Способ первый - использование UNC-путей. Это, на мой взгляд, самый простой и удобный способ. Разберем его на примере создания файла с точкой в конце названия. При его создании мы будем использовать стандартные функции для работы с файлами, но при этом будем указывать полный путь до объекта и добавлять в начале пути четыре символа "\\?\" или "\\.\". Получится примерно следующее: "\\?\f:\test\prn". Дальше работаем с файлом как обычно, т.е. можем писать в него, читать из него, копировать, удалять и делать все остальное, используя стандартные функции. Надо только не забывать, что везде, где требуется имя файла, необходимо указывать полный путь с UNC-префиксом. Тестирование показало, что использование префикса "\\?\" более надежно, чем "\\.\". При использовании второго префикса, к примеру, можно потерпеть неудачу при попытке удаления файла. Этот способ еще хорош тем, что работает и в командной строке. Действительно, возможны манипуляции с файлами прямо из командной строки, без использования различных языков программирования. Набранная в командной строке команда "type \\?\f:\test\prn" отобразит содержимое созданного файла. Пример создания файла «prn» и записи в него информации смотри в листинге 1. Способ второй - подстановка символов «.\». Тоже довольно удобный способ, позволяющий работать с файлами и папками любыми обычными средствами, а затем просто заменять название файла каким-либо другим, некорректным. Этот способ реализуется так. Если при использовании функций MoveFile, CopyFile, MkDir, RmDir и некоторых других подставить в конец нового названия файла или каталога два символа ".\", то файл создастся с любым нужным нам именем. |