В Windows (предположим, начиная с 2000 года) длина файла может составлять не более 32767 символов. Это ограничение существует из-за внутренней обработки с UNICODE_STRING
в собственном API (также со стороны ядра, в драйверах и т.д.). Все идет нормально. Я знаю теорию этой части.
Причиной ограничения является то, что члены Length
и MaximumLength
UNICODE_STRING
подсчитывают количество байтов в Buffer
, но представляют собой 16-битные беззнаковые целые числа.
Я также знаю, почему предел является приближением, а не установленным пределом. Это происходит главным образом из-за того, как ваше имя файла (например, \\.\C:\boot.ini
) разрешается в его родной форме (например, \??\C:\boot.ini
), а затем на то, что префикс имени фактического имени устройства, а затем путь по отношению к этому тому, например \Device\HarddiskVolume2\boot.ini
.
Кроме того, из Проводника Windows известный симптом при достижении предела ( "ANSI" ) MAX_PATH
заключается в том, чтобы притворяться, что файл или папка не существует в некоторых версиях Windows (возможно, это было исправлено в какой-то момент).
Но что происходит в диспетчере объектов, диспетчере ввода-вывода и уровне драйверов файловой системы, соответственно, когда я вызываю CreateFile()
с контуром, который выглядит как \\.\C:\...\filename.ext
, и весь путь не превышает предел, но достигает его, в моем обращении к kernel32.dll
CreateFile()
, а затем расширяется?...
Ни SDK, ни WDK не кажутся особенно болтливыми по этой теме. Или я смотрел в неправильные разделы?