Попутно выяснила занятное. У функции DeviceIOControl(), которая позволяет давать команды устройствам и получать от них всякие данные (как раз через неё пишутся и читаются данные reparse point), есть такие параметры: входной буфер с размером, выходной буфер с размером, сколько было записано в выходной буфер, ну и ссылка на OVERLAPPED для асинхронной операции. Буферы опциональны в зависимости от устройства и команды, параметр, возвращающий количество записанного, – тоже, ну и OVERLAPPED. Ну, у меня при записи в reparse point операция синхронная и используется только входной буфер, поэтому в функцию передаю только входной буфер и его размер, а всё остальное – NULL. Ну и программа в результате вылетает. Оказалось, что, если параметр, принимающий OVERLAPPED, установлен в NULL, то параметр, принимающий количество записанного в выходной буфер, должен ссылаться на актуальную переменную, даже если выходной буфер – тоже NULL. Оказывается, Microsoft не только не добавила проверку этого параметра, но и использовала его значение где-то внутрях функции, о чём указала в документации. В общем, не делайте так =_= #программизм #Windows
Короче, написала я прототип программы, которая данные хранит в reparse point. И оно работает: появляется файл длиной ноль байт, который, поскольку система не знает, что это такое, можно только удалить. Написать код, который вытащит эти данные, разумеется, – задача тривиальная, тоесть для маскировки подходит мало, но тут именно что нужно писать код или искать очень специальную утилиту, ибо никакими блокнотами такие файлы не открываются. #программизм #Windows
А вот интересно... Можно ли сделать кастомную reparse point так, чтобы хранить в ней какие-то свои данные, не связанные с файловой системой? Типа как маскировка данных в файловых потоках, только ещё круче, что прямо код надо писать, чтобы вытащить эти данные.
// Возможно, этот пост содержит часть ответа на вопрос из предыдущего. #программизм #Windows
Написала код, который изучает симлинк (на самом деле – reparse point) и выдаёт то, на что симлинк ссылается. Проверила – работает. Почти приступила к применению, но тут заметила, что в некоторых случаях код работает неправильно, выдаёт странные результаты. Начала изучать двоичные данные, которые парсит программа, и поняла, что что-то с ними не так: одни поля налезают на другие, хотя в других случаях всё с полями нормально. Начала копаться в MSDN. Оказалось, что документация про всему этому есть, но какая-то туманная, везде недосказанность, функций всего ничего, объясняются только общие концепции. Продолжила копать и повторно открыла для себя раздел «Open Specifications», в котором предельно чётко описаны все структуры, которые в этих самых reparse points используются. И оказалось, что в MSDN была описана одна структура, а в реальности используются другие структуры, по одной на каждый тип симлинков. А та, что описана в MSDN – вообще для сторонних реализаций. В итоге код придётся переписывать и снова всё тестировать. Но я всё равно не понимаю, чего Microsoft так тряслись над этими reparse points так, словно это пентагоновский секрет? #ненависть #программизм #Windows
Почему структура GUID не соответствует текстовому виду этого самого GUID? #программизм #Windows
Узнала, что JavaScript поддерживает запись двоичных чисел как «0b10101010». В смысле, в принципе поддерживает двоичные числа. #JavaScript #программизм
Не, я знаю, что For Each, не смотря на использование варианта, работает быстрее, чем просто For с индексом, но чтобы настолько... Коллекция, 240 тысяч элементов типа Long, с которым в цикле производятся действия (коллекция перегоняется в массив). For с индексом пережёвывает коллекцию за тридцать-сорок секунд. For Each проносится по коллекции за 0.12 секунд. #программизм #vb6
Научилась делать ботов-уведомляторов для телеграмки на VB. Документация по API, конечно, написана в лучших традициях Роберта Гейла. Особенно порадовало описание отправки картинок и файлов на сервер, типа, можно указать URL, можно указать ID, а можно «КАК БРОУЗЕР ЗАГРУЖАЕТ КАРТИНКИ НА САЙТ». Я час ломала голову, пока не додумалась, что оно в отправляемой форме хочет имя файла, даже если это имя потом нигде не будет использоваться. #программы #Telegram #программизм
Я тут пишу кое-что, и снова столкнулась с такими мерзкими, но неизбежными вещами, как байтовые буферы, в том числе запихнутые в строки. Всвязи с чем два наблюдения.
1. У VB нет встроенных механизмов, чтобы скопировать часть одного байтового буфера в другой. CopyMemory().
2. Строки в VB – юникодные, но могут быть ANSI, если хорошо попросить. Понять, в каком формате строка, очень трудно, но сам VB знает, что там внутри. #программизм #vb6
Покрытие в картинках

Тесты — это хорошо. Приятно работать с кодом, который хорошо покрыт качественными тестами. Тесты дают свободу. Можно экспериментировать, не боясь что-нибудь сломать; можно рефакторить код до идеала, не опасаясь, что он перестанет работать. Люблю тесты. Покрытие тестами — полезная метрика, если не делать из неё цели1. Дядя Боб на одной из лекций спрашивал аудиторию, к какому проценту покрытия кода тестами стоит стремиться, и, получив в ответ что-нибудь вроде «95%», с картинным удивлением вопрошал: «Выходит, вам всё равно, работают ли остальные пять процентов вашего кода? Так стоило ли их писать?!»

DIMV