NTFS Links - обсуждение
Модераторы: Avada, CaptainFlint, Nik, d-view, Моторокер
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Планируется непременнейшим образом. Конкретно юникодная сделана давным-давно чуть менее, чем полностью, просто я там начал добавлять поддержку вистовых симлинков, а оказалось, что их без повышения привилегий не создашь (а повышение привилегий — это до ужаса муторная вещьMVV писал(а):Не планируется ли юникодной версии NTFS Links?
Само собой. Просто текущую заменю на новую.MVV писал(а):Кстати, с учётом того, что NTFS есть только в Windows NT, не-юникодную версию вообще можно убрать
[off]
Вообще, я решил окончательно забить на поддержку Win9x. Единственное исключение — NoClose Replacer, да и то лишь потому, что для остальных мои программ/плагинов, если кому сильно надо, можно взять старую версию, а у NoClose старая версия с новым Тоталом работать не сможет.
[/off]
Почему же, ё-моё, ты нигде не пишешь "ё"?
Ну не так и муторно повысить привилегии. Привилегия всего одна требуется. Вот код для получения (писал для NTLinks):CaptainFlint писал(а):Планируется непременнейшим образом. Конкретно юникодная сделана давным-давно чуть менее, чем полностью, просто я там начал добавлять поддержку вистовых симлинков, а оказалось, что их без повышения привилегий не создашь (а повышение привилегий — это до ужаса муторная вещь).
Код: Выделить всё
bool GetCreateSymlinkPrivileges() {
HANDLE hToken; TOKEN_PRIVILEGES tp;
bool result=0;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) {
tp.PrivilegeCount=1;
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
if (LookupPrivilegeValue(0, SE_CREATE_SYMBOLIC_LINK_NAME, &tp.Privileges[0].Luid)) {
result=AdjustTokenPrivileges(hToken, 0, &tp, sizeof(TOKEN_PRIVILEGES), 0, 0)!=0 && !GetLastError();
}
CloseHandle(hToken);
}
return result;
}А компилить можно так же на 6 студии, чтоб без зависимостей:) но отключить совместимость с вин98 (выравнивание секций в файле по 4 кило).
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Я говорил не про это, а про повышение уровня UAC. Запросить привилегию — это раз плюнуть, но система же не выдаст её обычному, неповышенному процессу. А главная сложность в том, что текущий процесс повысить нельзя, надо запускать новый и как-то обеспечивать взаимодействие повышенного с неповышенным.MVV писал(а):Ну не так и муторно повысить привилегии.
Смотри, что получается: запросить привилегию сразу же после нажатия кнопки OK я не могу, потому что для жёстких ссылок и junction'ов она не требуется (а каждый раз выдавать UAC-окно, независимо от того, реально ли нужно повышение, — это не комильфо). Таким образом, я должен сделать это, только если пользователь захотел создавать именно симлинки. А определить эту ситуацию я смогу лишь на этапе окончательного разбора заданных пользователем параметров и обработки выделенных объектов, фактически, где-то посреди самого́ процесса создания ссылок (потому что даже если пользователь сказал делать, скажем, каталожные симлинки, далеко не факт, что у него вообще выбран хоть один каталог или что заданная глубина рекурсии не превысит реальную глубину выделенных каталогов). К этому моменту внутри программы накоплена дикая туча всевозможных внутренних структур (включая программный стек рекурсивной функции обхода каталогов), и чтобы обеспечить корректную работу, мне необходимо будет все их каким-то образом сериализовать и перебросить в повышенную копию. По сути, изобрести способ клонирования и восстановления внутреннего состояния программы. Я не говорю, что это абсолютно нерешабельно, но по-моему, эта задача по сложности на порядки превышает сложность всей NTFS Links как таковой.
Гораздо логичнее реализовать что-то типа Тоталовского tcmadmin, который будет работать повышенным и выполнять лишь собственно создание ссылок, а вся обработка, построение дерева и прочая мишура останется на совести основного процесса, который будет кидать повышенному лишь единичные команды по созданию конкретной ссылки. Но тут возникает другая проблема: если исходный каталог требует повышенных привилегий для чтения, то основной процесс NTFS Links его не прочитает. То есть, чтение тоже надо выносить в повышенного напарника. А раз так, то снова вылезает проблема своевременного запуска и передачи текущего состояния в обходе дерева каталогов из одного процесса в другой.
В общем, я пока не смог придумать схему, которая меня бы устроила одновременно с точки зрения и юзабилити, и сложности кода. Понятно, что в крайнем случае можно реализовать повышенный перезапуск от одной лишь галочки "создавать симлинки", даже если реально симлинки создавать не потребуется, но мне эта затея очень уж не нравится…
Добавлено спустя 3 минуты:
На шестой студии я 64-битку не скомпилю.MVV писал(а):А компилить можно так же на 6 студии, чтоб без зависимостей
Нет уж, с шестёрки я окончательно ухожу. Жаль, конечно, но обеспечивать совместимость проектов между ней и 2008 становится слишком обеременительным делом.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Думаю, можно предварительно построить список создаваемых папок и симлинков/точек соединения, далее запустить себя с повышением, если юзер запросил создание симлинков и привилегию включить не удаётся... При первом же спорном моменте можно запрашивать повышения. И потом просто по построенному списку создавать папки и точки переподключения. Также можно добавить опцию - запрашивать всегда/при необходимости/не запрашивать (при варианте "запрашивать всегда" можно не строить список, если повышения ещё нет, а сразу запускать с повышением).
Можно вообще сделать так, чтобы второй процесс, запущенный с повышением, у первого перекачивал список ещё не созданных объектов - через пайп, например. Тогда проблема частичного выполнения отпадает. Типа, запуская процесс с повышением, указываешь в комстроке имя пайпа и ожидаешь подключения... По идее, несложно реализовать. Ну а в каком виде передавать - уж как будет угодно.
Можно вообще сделать так, чтобы второй процесс, запущенный с повышением, у первого перекачивал список ещё не созданных объектов - через пайп, например. Тогда проблема частичного выполнения отпадает. Типа, запуская процесс с повышением, указываешь в комстроке имя пайпа и ожидаешь подключения... По идее, несложно реализовать. Ну а в каком виде передавать - уж как будет угодно.
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
MVV
Да, я уже думал о построении списка. Это решает проблему, но создаёт другую: потенциально нехилое потребление памяти. Если обход идёт в потоковом режиме, то программа может обрабатывать произвольное число объектов без существенного увеличения требуемой памяти (потребление пропорционально всего лишь максимальному уровню рекурсии). Если же заранее создавать список, то занимаемая память становится пропорциональной числу объектов.
Можно прикинуть. Например, у меня сейчас в XP в папке Windows 50 тысяч файлов. Суммарное число символов в путях: 3,3 млн, т.е. 6,6 Мб. Плюс для каждого объекта надо хранить ещё целевой путь, т.е. примерно вдвое больше — 13 Мб. Плюс накладные расходы аллокатора… В общем, мегабайт 20 на одних только путях, а есть ещё и другие данные. Ну а в виртуальной Семёрке файлов уже 113 тысяч, и пути подлиннее, суммарная длина 14,5 млн символов. Соответственно, выходит уже памяти на ~90 Мб. А уж если кто-то, не дай Бог, решит Program Files склонировать на хорошенько обустроенной системе…
Возможно, всё-таки получится сделать потоковый вариант, в котором при любой ошибке доступа прога будет обращаться за тем же действием к повышенному помощнику. Конечно, ещё вопрос производительности встанет, т.к. я пока ещё слабо представляю, с какой скоростью данные перегоняются через пайп… В общем, думаю, прикидываю, соображаю.
Да, я уже думал о построении списка. Это решает проблему, но создаёт другую: потенциально нехилое потребление памяти. Если обход идёт в потоковом режиме, то программа может обрабатывать произвольное число объектов без существенного увеличения требуемой памяти (потребление пропорционально всего лишь максимальному уровню рекурсии). Если же заранее создавать список, то занимаемая память становится пропорциональной числу объектов.
Можно прикинуть. Например, у меня сейчас в XP в папке Windows 50 тысяч файлов. Суммарное число символов в путях: 3,3 млн, т.е. 6,6 Мб. Плюс для каждого объекта надо хранить ещё целевой путь, т.е. примерно вдвое больше — 13 Мб. Плюс накладные расходы аллокатора… В общем, мегабайт 20 на одних только путях, а есть ещё и другие данные. Ну а в виртуальной Семёрке файлов уже 113 тысяч, и пути подлиннее, суммарная длина 14,5 млн символов. Соответственно, выходит уже памяти на ~90 Мб. А уж если кто-то, не дай Бог, решит Program Files склонировать на хорошенько обустроенной системе…
Возможно, всё-таки получится сделать потоковый вариант, в котором при любой ошибке доступа прога будет обращаться за тем же действием к повышенному помощнику. Конечно, ещё вопрос производительности встанет, т.к. я пока ещё слабо представляю, с какой скоростью данные перегоняются через пайп… В общем, думаю, прикидываю, соображаю.
Почему же, ё-моё, ты нигде не пишешь "ё"?
Ну тебе ведь не нужно хранить пути к каждому файлу, только к папкам. Запоминаешь пути к папкам, для которых создаешь папки или ссылки. Плюс ставишь для папки маркер, что нужно продублировать составляющие её файлы. Не думаю, что кто-то будет разом создавать больше нескольких тыщ папок/ссылок (а кто будет - у того памяти будет хватать точно). А кому может взбрести в голову дублировать ссылками папку с программами, понятия не имею - толку с того, это ж не бэкап.
А через пайп можно просто передать адрес в памяти. Можно его передать и через оконное сообщение (повышенная копия посылает спец сообщение запустившей её, и та возвращает адрес). А дальше можно читать прямо из памяти другого процесса по этому адресу - скорость будет немаленькая.
В любом случае, передача данных будет выполняться максимум 1 раз.
А через пайп можно просто передать адрес в памяти. Можно его передать и через оконное сообщение (повышенная копия посылает спец сообщение запустившей её, и та возвращает адрес). А дальше можно читать прямо из памяти другого процесса по этому адресу - скорость будет немаленькая.
В любом случае, передача данных будет выполняться максимум 1 раз.
При попытке скачивания, выдает вот такую картинку
Not Found
The requested URL /files/wdx_nl_info_1.20.rar was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Apache/1.3.37 Server at flint.wincmd.ru Port 80
Можно выложить еще раз?
Not Found
The requested URL /files/wdx_nl_info_1.20.rar was not found on this server.
Additionally, a 404 Not Found error was encountered while trying to use an ErrorDocument to handle the request.
Apache/1.3.37 Server at flint.wincmd.ru Port 80
Можно выложить еще раз?
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
Решил всё-таки выложить пока обновлённую версию с юникодом, но без поддержки вистовских ссылок. Что-то туго они у меня идут, слишком много вариантов поведения сразу появляется…
Версия 1.30
32-битная версия, зеркало (335 Кб)
64-битная версия, зеркало (353 Кб)
Версия 1.30
- Программа теперь полностью юникодная.
- Добавлена 64-битная версия.
- Добавлена опция блокировки окна TC (эмуляция стандартных диалогов копирования/перемещения).
- Путь к файлу настроек (ключ /i=<файл>) теперь поддерживает переменные окружения.
- Основным языком сделан английский.
- Разные незначительные улучшения.
- Удалён файл описания интерфейсных строк.
32-битная версия, зеркало (335 Кб)
64-битная версия, зеркало (353 Кб)
Почему же, ё-моё, ты нигде не пишешь "ё"?
- KhodeN
- Сообщения: 16
- Зарегистрирован: Пн окт 17, 2005 12:37
- Откуда: Владивосток
- Контактная информация:
Из описания на сайте:
P.S. В русской справке, правда есть примечание (до XP, включительно). В английской лучше - (Windows Explorer in pre-Vista systems).
Не актуально, начиная с висты.Некоторые программы, в частности - Проводник Windows, не умеют корректно распознавать символические ссылки! В результате при попытке удаления символической ссылки Проводником будет удалено всё содержимое оригинального каталога!
P.S. В русской справке, правда есть примечание (до XP, включительно). В английской лучше - (Windows Explorer in pre-Vista systems).
- CaptainFlint
- Сообщения: 6239
- Зарегистрирован: Вт дек 14, 2004 22:34
- Контактная информация:
KhodeN
Я уже говорил, сайт пока не обновляю, долго. Потом обновлю для всех инструментов сразу.
Я уже говорил, сайт пока не обновляю, долго. Потом обновлю для всех инструментов сразу.
Не смог подобрать адекватную альтернативу на русском. Пре-Вистовые? До-Вистовые? До Висты? Последнее можно, но могут подумать, что включительно, придётся пояснять, в результате и получим либо "до XP включительно", либо "до Висты, не включая оную". Что в лоб, что по лбу…KhodeN писал(а):В английской лучше - (Windows Explorer in pre-Vista systems).
Почему же, ё-моё, ты нигде не пишешь "ё"?