@Linda-chan

Тег windows в блоге Linda-chan

Linda-chan

В «новом интерфейсе» (на самом деле – в новой панели управления) Windows 10, на который так дрочат эстеты и зумеры в Твиттере, отсутствует управление с клавиатуры в принципе. Я надеюсь, что Трампарарамп в конце концов найдёт всех причастных к этому говнищу, к Метро, к новому меню Пуск и отправит на тот самый остров с крокодилами.

Linda-chan

Где-то попалось, что Microsoft придумала новый алгоритм файлового сжатия и реализовала его через reparse points. Типа, вместо файла – оно самое, а сами сжатые данные – где-то ещё. И всё прозрачно работает через драйвер. Собственно, либо автор описания ебанулся, либо ебанулась Microsoft и забыла, что в NTFS предусмотрено использование разных алгоритмов сжатия, просто до сих пор алгоритм был всего один.

Linda-chan

Просмотрщик сертификатов в Windows – единственный вменяемый из всех подобных. Ни в броузерах, ни в других операционных системах не смогли сделать вывод сведений о сертификате таким, чтобы от мешанины букв и цифр не разбегались глаза.

Linda-chan

Non-ASCII Paths and Portability - Some features may not be fully portablized if this app is used from a non-ASCII path and then moved to another location (settings, extensions, etc).

https://portableapps.com/ap...rnet/r3dfox-portable
Опять UTF-8 в ANSI API?

Linda-chan

Попутно выяснила занятное. У функции DeviceIOControl(), которая позволяет давать команды устройствам и получать от них всякие данные (как раз через неё пишутся и читаются данные reparse point), есть такие параметры: входной буфер с размером, выходной буфер с размером, сколько было записано в выходной буфер, ну и ссылка на OVERLAPPED для асинхронной операции. Буферы опциональны в зависимости от устройства и команды, параметр, возвращающий количество записанного, – тоже, ну и OVERLAPPED. Ну, у меня при записи в reparse point операция синхронная и используется только входной буфер, поэтому в функцию передаю только входной буфер и его размер, а всё остальное – NULL. Ну и программа в результате вылетает. Оказалось, что, если параметр, принимающий OVERLAPPED, установлен в NULL, то параметр, принимающий количество записанного в выходной буфер, должен ссылаться на актуальную переменную, даже если выходной буфер – тоже NULL. Оказывается, Microsoft не только не добавила проверку этого параметра, но и использовала его значение где-то внутрях функции, о чём указала в документации. В общем, не делайте так =_=

Linda-chan

Короче, написала я прототип программы, которая данные хранит в reparse point. И оно работает: появляется файл длиной ноль байт, который, поскольку система не знает, что это такое, можно только удалить. Написать код, который вытащит эти данные, разумеется, – задача тривиальная, тоесть для маскировки подходит мало, но тут именно что нужно писать код или искать очень специальную утилиту, ибо никакими блокнотами такие файлы не открываются.

Linda-chan

А я поняла, почему размеры не совпадают. При чём, как оказалось, не только в WSL симлинках, но и в других симлинках (собственно, симлинках и junctions). Началось с того, что я нашла баг в билиотеке, где передавался неправильный размер буфера, и сломалось всё. Код показывал, что в заголовке данных размер буфера с путями такой, а на деле – другой, поменьше. Оказалось, что это поле в заголовке показывает кое-что другое. Там есть структура REPARSE_DATA_BUFFER, которая универсальная для всех майкрософтовских reparse points. У всех у них первые восемь байт имеют одинаковый смысл, а дальше уже могут быть как дополнительные данные, так и дополнительные поля, которые эти данные описывают. Полей может быть разное количество. Так вот, поле, которое указывает размер данных, указывает этот размер после общего заголовка, тоесть вместе со всеми дополнительными полями. А я считала без учёта дополнительных заголовков, ну и получалось, что фактически данных меньше, чем в заголовке. При чём в описании этих заголовков именно это и было написано, но я читала невнимательно =_=

Linda-chan

Добавила в свою библиотеку парсинг симлинков WSL. Оказалось, что Cygwin создаёт их как-то странно: в заголовке данных симлинка есть поле, которое указывает размер части, которая идёт после заголовка и содержит путь к объекту, на который указывает симлинк (в UTF-8, кстати). И вот это значение почему-то всегда на четыре больше, чем там есть по факту. Почему – БП. Надо попытаться ещё с самим WSL поэкспериментировать. Кроме того, сами данные там в очень свободной форме. Если у обычного симлинка есть флаг, относительный там путь или абсолютный, то тут может быть всё, что угодно, и оно даже может не совпадать с тем, что передано команде ln. Передала «0000» – получила «0000». Передала «/cygdrive/x/0000» – получила «/mnt/x/0000». Передала «X:\0000» – «X:\0000».

Linda-chan

Я это всё к чему? У нас есть ещё Cygwin, у которого есть своя ln. И вот как раз она создаёт натуральные reparse points, которые видятся как reparse point. DIR показывает их как «JUNCTION», FAR3 – как «LX_SYM», Проводник (в Windows 7 и ниже) вообще показывает это как файл, а Link Shell Extension не воспринимает как симлинк. И никто не умеет с этим работать. А на деле у данной штуки «тэг» – IO_REPARSE_TAG_LX_SYMLINK, тоесть симлинк, который поддерживается WSL. Возможно, в Десятке в Проводнике он выглядит лучше, но я не видела. Надо экспериментировать.

Linda-chan

В линупсе, при создании симлинков на NTFS разделах, создаются нормальные на первый взгляд симлинки. Но после перезагрузки они превращаются в тыкву в виде файла с атрибутом «Системный», с заголовком «IntxLNK» и каким-то данными после Chr(1). Оказалось, что это какое-то легаси, которое должно работать и в винде, но не через нормальные reparse points, а через какое-то дополнительное ПО, обеспечивающее совместимость с POSIX или типа того (кажется, речь идёт не про подсистему). Короче, в живую я это ПО не видела, так что не в курсе. Что интересно, MINGW32 тоже создаёт такие файлы, но при этом правильно парсит их, ls показывает их как симлинки, ну и входящие в комплект программы тоже работают с ними, как с симлинками. Просто интересное наблюдение.

Linda-chan

Задача жакафрески, на размышление – тридцать секунд. Есть два компа с Windows 2000, других операционных систем на них нет и не было. Обе стоят на разделе, отформатированном в NTFS. На одном компе версия NTFS – 3.0, тоесть та, что появилась с Windows 2000. На другом – 3.1, тоесть от Windows XP. Вопрос: как так получилось?

Linda-chan

А вот интересно... Можно ли сделать кастомную reparse point так, чтобы хранить в ней какие-то свои данные, не связанные с файловой системой? Типа как маскировка данных в файловых потоках, только ещё круче, что прямо код надо писать, чтобы вытащить эти данные.
// Возможно, этот пост содержит часть ответа на вопрос из предыдущего.

Linda-chan

Написала код, который изучает симлинк (на самом деле – reparse point) и выдаёт то, на что симлинк ссылается. Проверила – работает. Почти приступила к применению, но тут заметила, что в некоторых случаях код работает неправильно, выдаёт странные результаты. Начала изучать двоичные данные, которые парсит программа, и поняла, что что-то с ними не так: одни поля налезают на другие, хотя в других случаях всё с полями нормально. Начала копаться в MSDN. Оказалось, что документация про всему этому есть, но какая-то туманная, везде недосказанность, функций всего ничего, объясняются только общие концепции. Продолжила копать и повторно открыла для себя раздел «Open Specifications», в котором предельно чётко описаны все структуры, которые в этих самых reparse points используются. И оказалось, что в MSDN была описана одна структура, а в реальности используются другие структуры, по одной на каждый тип симлинков. А та, что описана в MSDN – вообще для сторонних реализаций. В итоге код придётся переписывать и снова всё тестировать. Но я всё равно не понимаю, чего Microsoft так тряслись над этими reparse points так, словно это пентагоновский секрет?

Linda-chan

Почему структура GUID не соответствует текстовому виду этого самого GUID?

Linda-chan

Обновилась Windows 11. Поотваливались подключения по RDP. Супер. В RDP клиенте по многочисленным просьбам дизайнеров переделали кнопочки, поэтому панелька с кнопками теперь болтается ниже, стала больше и обмазана ШГ, даже значки на кнопках умудрились размазать. Ещё в диалоге свойств RPD соединения криворукие зумеры впилили новый фрейм с галочкой, который не влез по высоте, а посему в окне появился вертикальный скроллбар! Охуенчик! Ещё в меню «Пуск» переделали менюшку (меню в меню, блять), которая появляется при щелчке на имени пользователя. Теперь там логотип Microsoft, который конфузит, и тебе поначалу кажется, что пользователь как-то просочился не с локальной учёткой. Более того, криворукие зумеры решили, что отображаемое имя пользователя – это всегда что-то вроде «BG» (не путать с «BJ»), а посему длинное имя уходит за границы менюшки, обрубаясь краем оной. Зато дизайнеры в экстазе, наконец Microsoft избавляется от старого интерфейса™.

Linda-chan

Заметила, что логи CHKDSK, которые в «System Volume Information» лежат, зачем-то в конце содержат кусок из нулей. Озадачилась. Потом вдруг заметила размер файлов и поняла, что нулями оно выравнивает этот размер до килобайтной границы. Зачем – БП. Возможно, что, когда программа запускается из нативного режима при загрузке системы, драйверы ещё не все загружены, и работает что-то вроде упрощённого драйвера NTFS, который не умеет работать с невыровненными файлами. А при запуске программы в обычном режиме, выравнивание случается для совместимости. Но это просто рандомное предположение, возможно, у Рэймонда Чена есть про это.

Linda-chan

Оказалось, что старые версии Windows испытывают некоторые затруднения в парсинге строк и эмодзиками. Ну или это я что-то не так делаю, либо хочу не того. Короче, мне надо было взять строку в UTF-8 и заэкранировать ей в HTML кодах. Всякие CharNextW() давали мне не то, что нужно, а то и вообще ничего не давали. Поэтому пришлось открыть доки и написать собственный парсер UTF-8 строки =_= И он даже заработал.

Linda-chan

Кажется, я поняла, зачем программы и рантаймы таскают в ресурсах картинку с чекбоксами. Это чтобы эмулировать чекбоксы в системном tree-view.

Linda-chan

Microsoft выпустила очередную сборку Windows 11 Insider Preview, одним из заметных улучшений в которой стали обновлённые значки у индикатора аккумуляторной батареи. Теперь он имеет цветное исполнение, благодаря чему является более заметным, помогая пользователю не упустить важную информацию.

https://3dnews.ru/1117279/z...i-legche-chitayutsya
ЭТО ПРОРЫВ!
// Того гляди, и остальные иконки сделают нормальными, уберут все эти круглости, окна сделают более различимыми...

Linda-chan

Комп с Windows 10 или Windows 11. Работает несколько часов. Всё это время непрерывно моргает индикатор активности диска. Что, блять, оно делает с диском?

Добавить пост

Вы можете выбрать до 10 файлов общим размером не более 10 МБ.
Для форматирования текста используется Markdown.