четверг, 25 июля 2024 г.

Принцип имён в API: если объект не указан явно, то действие относится к исходному объекту

Это перевод API naming principle: If there is no direct object, then the direct object is the source object. Автор: Реймонд Чен.

Обычно имена методов начинаются с глагола: widget.Toggle, widget.SetColor, widget.GetAssociatedDoodad.

Часто за глаголом следует объект: widget.SetColor, widget.GetAssociatedDoodad. Такой объект, указываемый явно — это то, над чем глагол работает, или что он создает. В примере выше: SetColor устанавливает (set) цвет (color), а GetAssociatedDoodad возвращает (get) ассоциированный doodad (associated doodad).

Иногда за глаголом вообще не следует название объекта. Например, метод widget.Toggle выше. В этом случае объект указывается неявно: это исходный объект. В приведенном выше примере widget.Toggle переключает (toggle) виджет (widget).

Всё это может показаться очевидным, но этот принцип легко упустить из виду.

понедельник, 4 декабря 2023 г.

Что такое указатель статической цепочки в контексте соглашения о вызовах ABI?

Это перевод What is a static chain pointer in the context of calling convention ABI? Автор: Реймонд Чен.

Глубоко в руководстве Application Binary Interface из System V для архитектуры AMD64 есть сноска на странице 24, в которой говорится: "%r10 используется для передачи указателя статической цепочки функции". Что такое "указатель статической цепочки"?

вторник, 21 февраля 2023 г.

Случай с загадочной ошибкой "out of bounds" из CreateUri и memmove

Это перевод The case of the mysterious "out of bounds" error from CreateUri and memmove. Автор: Реймонд Чен.

Один клиент пытался понять, почему его программа вылетала с ошибкой E_BOUNDS ("out of bounds"), возбуждаемой из вызова метода CreateUri:
combase!RoOriginateErrorW+0x50
wincorlib!Platform::Details::ReCreateFromException+0x40
contoso!`__abi_translateCurrentException'::`1'::catch$0+0x10
contoso!memmove+0x217f4
contoso!Windows::Foundation::IUriRuntimeClassFactory::CreateUri+0x44
contoso!Contoso::DashboardView::DashboardView_obj1_Bindings::Update_ViewModel_Layout_Groups+0x50
contoso!Contoso::DashboardView::DashboardView_obj1_Bindings::Update_ViewModel_Layout+0xe4
contoso!Contoso::DashboardView::DashboardView_obj1_Bindings::PropertyChanged+0x1134
contoso!XamlBindingInfo::XamlBindingTrackingBase::PropertyChanged+0x30
Судя по стеку, процедура копирования памяти memmove вызывала высокоуровневое исключение RTL C++/CX E_BOUNDS — что не имеет никакого смысла. Ещё более загадочно то, что memmove была вызвана из метода CreateUri интерфейса IUriRuntimeClassFactory, но код клиента DashboardView вообще не работает с URI. Похоже, что этот стек вызовов - это просто какая-то чепуха.

Что ж, попробуем раскрутить эту чушь.

четверг, 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.
 *      ....
 */
Что это ещё за "чуваки"? Автор комментариев была большим поклонником Большого Лебовски?