Интересное дело, на винде нельзя создать обычными средствами (Explorer, Total Commander, etc…) директории и файлы, полный путь до которых превышает 260 символов. Даже введен специальный макрос MAX_PATH, который содержит оное значение.
Проблема, с которой я столкнулся, оказалась в том, что некий заказчик использует директории, полный путь до которых превышает пресловутое значение MAX_PATH. Как он это делает?! WTF?! А он спокойненько делал это на Java.
Как создать на виндах директории, полный путь до которых превышает 260 символов?! Проще простого — нужно использовать Unicode функции из WINAPI для работы с файловой системой. Причем все имена файлов/директорий должны быть абсолютными (т.е. не относительными типа: ‘programs/start.exe‘) и ГЛАВНОЕ, перед именем необходим ПРЕФИКС: \\?\
Ну что за хак?!
Вот, что по этому поводу говорит MSDN в разделе Naming a File:
The Windows API has many functions that also have Unicode versions to permit an extended-length path for a maximum total path length of approximately 32,000 characters. This type of path is composed of components separated by backslashes, each up to 255 characters in length. To specify an extended-length path, use the “\\?\” prefix. For example, “\\?\D:\<very long path>”. (The characters < > are used here for visual clarity and cannot be part of a valid path string.)
Все попытки использовать префикс “\\?\” в командной строчке не увенчались успехом. Пришлось написать небольшой пример, который циклически создавал вложенные директории, полный путь до последней из которых был около 450 символов:
#include <string.h>
#include <windows.h>
int main ()
{
int i;
size_t len;
const char *mdir;
static wchar_t wdir[8192];
static wchar_t tmp_wdir[8192];
mdir = "\\\\?\\c:\\space\\lugovskoy\\tmp";
len = strlen (mdir);
MultiByteToWideChar (CP_ACP, 0, mdir, len, wdir, len);
mdir = "\\abcdefghijklmnopqrstuvwxyx0123";
len = strlen (mdir);
MultiByteToWideChar (CP_ACP, 0, mdir, len, tmp_wdir, len);
for (i = 0; i < 10; i++)
{
wcscat (wdir, tmp_wdir);
if (!CreateDirectoryW (wdir, NULL))
{
printf ("CreateDirectoryW failed (%d) [%u]%d:%S\n",
GetLastError (), wcslen (wdir), i, dir);
return -1;
}
}
return 0;
}В результате в директории C:\space\lugovskoy\tmp\ была создана цепочка из 10 вложенных директорий (’abcdefghijklmnopqrstuvwxyx0123‘). Теперь требовалось положить внутрь этих директорий необходимый файл, чтобы проверить, что его потом можно будет оттуда прочитать. Ни одно стандартное средство не смогло его туда скопировать. Explorer отказался заходить глубже чем на 260 символов, а это ~5 вышеописанных директорий. Чтобы скопировать файл в самую глубокую папку, мне опять пришлось писать код, работающий с WINAPI функциями:
#include <string.h>
#include <windows.h>
int main (int argc, char *argv[])
{
int i;
size_t len;
const char *str;
static wchar_t wtmp[8192];
static wchar_t wdir[8192];
str = "\\\\?\\c:\\space\\lugovskoy\\tmp";
len = strlen (str);
MultiByteToWideChar (CP_ACP, 0, str, len, wdir, len);
str = "\\abcdefghijklmnopqrstuvwxyx0123";
len = strlen (str);
MultiByteToWideChar (CP_ACP, 0, str, len, wtmp, len);
for (i = 0; i < 10; i++)
wcscat (wdir, wtmp);
str = strrchr (argv[1], '\\');
len = strlen (str);
memset (wtmp, 0, sizeof (wchar_t) * 8192);
MultiByteToWideChar (CP_ACP, 0, str, len, wtmp, len);
wcscat (wdir, wtmp); // wdir: \\?\c:\space\lugovskoy\tmp\abcd...\input
len = strlen (argv[1]);
memset (wtmp, 0, sizeof (wchar_t) * 8192);
MultiByteToWideChar (CP_ACP, 0, argv[1], len, wtmp, len);
// wtmp: <path-to-input>\input
if (!CopyFileW (wtmp, wdir, FALSE)) { // rewrite existed file
printf ("CopyFileW failed (%d) [%u]:%S\n", GetLastError (),
wcslen (wdir), dir);
return -1;
}
return 0;
}Итак, файл переписывается в неизвестность
, так как посмотреть где и как он лежит невозможно…
Разные мысли приходят на ум:
- Какое отличное поле для создания надоедливых вирусов. Удалить такие директории, что очевидно, не получится обычным способом. Ни Total, ни Explorer не смогли ее удалить. Так что хранить в глубине ее вредоносные файлы потенциально безопаснее, чем в обычных директориях.
- Я долго мучался и думал как мне защитить от посторонних глаз на моем же компьютере важную информацию. А тут достаточно поместить файл в глубь такой директории, и никто никогда не догадается как до него добраться. Обычные программы, типа Word, тоже не могут ни зайти, ни сохранить, ни открыть файлы из такого хранилища.
- Последняя и самая трезвая мысль — НАФИГА? Нафига было разделять и усложнять так жизнь?!




Discussion
Pingback: Soviet