четверг, 10 ноября 2022 г.

Почему x86-64 функции Windows НЕ начинаются с бессмысленной инструкции MOV EDI, EDI?

Это перевод Why don’t Windows functions begin with a pointless MOV EDI,EDI instruction on x86-64? Автор: Реймонд Чен.

Когда-то мы обсуждали, почему все функции Windows начинаются с бессмысленной инструкции MOV EDI, EDI. Ответ заключался в том, что эта инструкция использовалась как двухбайтовый NOP, что позволяло безопасно заменить её на инструкцию перехода JMP $-5, что позволяло применять различные исправления к работающей системе (такой метод не подходит для тех исправлений, которые изменяют структуры данных или включают взаимодействие между процессами).

Но вы могли заметить, что в 64-битной Windows эти бессмысленные инструкции исчезли. Значит ли это, что метод мёртв?

Почему все функции Windows начинаются с бессмысленной инструкции MOV EDI, EDI?

Это перевод Why do Windows functions all begin with a pointless MOV EDI, EDI instruction? Автор: Реймонд Чен.

Если вы посмотрите на ассемблерный код функций внутри DLL Windows, вы обнаружите, что они начинаются с бессмысленной инструкции MOV EDI, EDI. Эта инструкция копирует регистр в самого себя и не обновляет флаги, что совершенно не имеет смысла. Тогда зачем она там?

понедельник, 4 июля 2022 г.

Рано или поздно особенное перестанет быть особенным

Это перевод Eventually, nothing is special any more. Автор: Реймонд Чен.

Комментатор ulric предположил, что должны существовать две функции для получения "текущего" окна: одна для обычного повседневного использования и одна для "специального использования", когда вы хотите взаимодействовать с окнами вне вашего процесса.
Однако мне было бы проще, если бы поведение API по умолчанию заключалось в том, чтобы возвращать HWND только для текущего процесса, а приложения, которым действительно нужен HWND из (потенциально) других процессов, должны использовать другой API, который специально создан только для этого.
Это отличный пример предложения того, что Windows уже делает! Специальная функция стала настолько не особенной, что вы даже не понимаете, что она особенная.

среда, 1 июня 2022 г.

Теперь элемент манифеста activeCodePage можно использовать для установки не только UTF-8

Это перевод The activeCodePage manifest element can be used for more than just setting UTF-8 as the active code page. Автор: Реймонд Чен.

В Windows 10 версии 1903 появилось новое свойство манифеста под названием activeCodePage, которое можно использовать для установки кодовой страницы процесса в UTF-8.

Начиная с Windows Server 2022 (и Windows 11)¹ вы также можете использовать это свойство для выбора кодовых страниц, отличных от UTF-8, в манифестах неупакованных приложений².

AppLocale наконец-то повзрослел!

вторник, 24 мая 2022 г.

Как Windows определяет, должно ли вновь созданное окно использовать ориентацию LTR или RTL?

Это перевод How does Windows decide whether a newly-created window should use LTR or RTL layout? Автор: Реймонд Чен.

В Extended стилях окна можно указать, будет ли оно отображаться слева направо (Left-To-Right - LTR) или справа налево (Right To Left - RTL). Раскладка справа налево используется в языках с написанием справа налево - из которых сегодня наиболее широко используются, вероятно, арабский и иврит. Вы можете попросить Windows сделать окно с ориентацией RTL, установив Extended-стиль WS_EX_LAYOUTRTL.

пятница, 15 октября 2021 г.

Что означает поле SizeOfImage в структуре MODULEINFO?

Это перевод What does the SizeOfImage mean in the MODULEINFO structure? Автор: Реймонд Чен.

У одного клиента была программа с поддержкой плагинов, и клиент хотел провести анализ занимаемой плагинами памяти. Клиент уже умел отслеживать выделение динамической памяти плагинами (поскольку его модель плагинов была очень ограниченной), но его интересовал объём памяти, занимаемый кодом модуля и сегментами статических данных. Клиент получал информацию о плагине, вызывая функцию GetModuleInformation и просматривая поле SizeOfImage, но ему нужна была помощь в интерпретации этого значения. Будет ли SizeOfImage учитывать, например, большой статический массив с инициализацией нулями? Клиент знал, что обнулённые статические данные обычно не занимают места в самом файле, но добавляются ли они в SizeOfImage? И вообще, SizeOfImage - это размер чего именно?

четверг, 19 августа 2021 г.

Почему в заголовочниках Windows полно слов типа "чувак"?

Это перевод What’s with all of the references to “dude” in the accessibility header files? Автор: Реймонд Чен.

Если вы читали заголовочнй файл winuser.h, то вы могли видеть как комментарии ссылаются на объекты как на "чуваков" ("dudes"):
/*
 * For all EVENT_OBJECT events,
 *      hwnd is the dude to Send the WM_GETOBJECT message to (unless NULL,
 *          see above for system things)
 *      ...
 *          The hwnd/idObject pair gets you to the container, the dude you
 *          probably want to talk to most of the time anyway.  The idChild
 *          can then be passed into the acc properties to get the name/value
 *          of it as needed.
 *      ...
 * Now, if the app itself resizes child windows as a result of being
 * sized, USER will generate LOCATIONCHANGEs for those dudes also because
 * it doesn't know better.
 *      ....
 */
Что это ещё за "чуваки"? Автор комментариев была большим поклонником Большого Лебовски?

среда, 26 мая 2021 г.

Почему не зависящие от устройства растровые изображения перевёрнуты вверх ногами?

Это перевод Why are device-independent bitmaps upside down? Автор: Реймонд Чен.

Для всех, кто в первый раз знакомится с независимыми от устройства (device-independent) растровыми изображениями Windows, становится сюрпризом тот факт, что они перевёрнуты - в том смысле, что первая строка пикселей соответствует нижней строке изображения, а последующие строки пикселей идут по изображению вверх, при этом последняя строка пикселей соответствует самой верхней строке изображения.

Ладно, не будем называть эти растровые изображения перевёрнутыми вверх ногами. Менее осуждающий термин - называть их восходящими (bottom-up) растровыми изображениями.

Итак, почему растровые изображения, не зависящие от устройства, хранятся снизу вверх?

вторник, 17 ноября 2020 г.

Почему в выводе echo командной строки с перенаправлением появляется 1? Кто вставляет эти единицы?

Это перевод Why does my command line redirection echo with an extra 1? Who’s inserting these rogue 1s everywhere? Автор: Реймонд Чен.

Если вы оставите включённым режим echo в командном файле, и командный файл выполняет команду с перенаправлением, тогда в выводе появится загадочная единичка.

среда, 9 сентября 2020 г.

Как можно заклинить виртуальный картридер?

Это перевод How is it possible to jam a virtual card reader? Автор: Реймонд Чен.

Когда-то давно я поддерживал систему с разделением времени, известную как VM/CMS. Каждый пользователь, вошедший в систему, получал свою собственную виртуальную машину с виртуальными аппаратными устройствами: виртуальным устройством для чтения карт, виртуальным устройством для записи перфокарт и виртуальным принтером.

Хорошо, у вас есть виртуальный картридер. Как вы будете загружать виртуальные карты в свой виртуальный картридер? И зачем вообще это делать?