Система Orphus

четверг, 8 сентября 2011 г.

Почему функция SetWindowsHookEx принимает параметр HINSTANCE?

Это перевод Why does SetWindowsHookEx take an HINSTANCE parameter? Автор: Реймонд Чен.

Анонимный комментатор спросил, почему функция SetWindowsHookEx принимает параметр HINSTANCE, если она всё равно сконвертирует это значение в имя файла.

Посмотреть текст целиком...

среда, 7 сентября 2011 г.

Как злоупотребляли оконными ловушками в Win16

Это перевод One way people abused hooks in 16-bit Windows. Автор: Реймонд Чен.

В прошлый раз мы увидели, как в 16-битных Windows реализуются оконные ловушки. Даже хотя значения HHOOK являются не прозрачными типами данных ("чёрным ящиком"), с которыми нужно работать как с описателями, многие программы "знали слишком много, чтобы стать опасными" - и воспользовались тем фактом, что значения HHOOK были просто указателями на предыдущую процедуру ловушки.

Посмотреть текст целиком...

вторник, 6 сентября 2011 г.

Как были реализованы оконные ловушки в 16-битных Windows?

Это перевод How were window hooks implemented in 16-bit Windows? Автор: Реймонд Чен.

Механизм отслеживания оконных ловушек был реализован существенно иначе в 16-битных Windows.

Посмотреть текст целиком...

понедельник, 5 сентября 2011 г.

Кандидат на звание самого непонятного сочетания клавиш: Shift+F8

Это перевод Candidate for most obscure keyboard shortcut: Shift+F8. Автор: Реймонд Чен.

Так получилось, что одной из самых непонятных сочетаний клавиш является Shift+F8, которая используется в listbox для несмежного расширенного выбора. Господи, сколько же слов.

Посмотреть текст целиком...

воскресенье, 4 сентября 2011 г.

Как менее наивный компилятор вызывает импортируемую функцию

Это перевод How a less naive compiler calls an imported function. Автор: Реймонд Чен.

Если функция объявлена со спецификатором dllimport, то это указывает компилятору Visual Studio C/C++, что эта функция импортируется из другого (исполняемого) модуля, а не является обычной функцией в этом же исполняемом модуле. Имея на руках эту информацию, компилятор генерирует немного другой код, поскольку теперь он осведомлён об особенностях импортируемых функций.

Посмотреть текст целиком...

суббота, 3 сентября 2011 г.

Вызов импортируемой функции, наивный способ

Это перевод Calling an imported function, the naive way. Автор: Реймонд Чен.

Библиотека импорта (import library) разрешает (resolve) символы импортируемых функций, но к ней не обращаются до этапа компоновки. Давайте посмотрим на наивную реализацию, когда компилятор слепо не осведомлён о существовании импортируемых функций.

Посмотреть текст целиком...

пятница, 2 сентября 2011 г.

Смена дизайна импорта в 32-х битных Windows

Это перевод Rethinking the way DLL exports are resolved for 32-bit Windows. Автор: Реймонд Чен.

За последние дни мы узнали, как работает экспорт и импорт функций в 16-битных Windows, а также что экспорт функций в Win32 очень похож на экспорт функций в 16-битных Windows. Но 16-битный импорт был полностью переписан в мире 32-битных Windows.

Посмотреть текст целиком...

четверг, 1 сентября 2011 г.

Экспортируемые функции, являющиеся forwarder-ами

Это перевод Exported functions that are really forwarders. Автор: Реймонд Чен.

В прошлый раз мы видели как экспортируемые функции в Win32 ведут себя похоже на экспорт функций в 16-битных Windows - только сместился акцент использования с импорта по номеру на импорт по имени. Этот акцент никак не выражен в формате исполняемого файла; и 16-битные и 32-битные DLL могут экспортировать функции по номеру и имени (и обоим одновременно).

Но в Win32 появляется новый тип экспортируемых функций, известный как forwarder.

Посмотреть текст целиком...

среда, 31 августа 2011 г.

Как экспортируются DLL функции в 32-битных Windows?

Это перевод How are DLL functions exported in 32-bit Windows? Автор: Реймонд Чен.

Дизайнерам 32-битных Windows не нужно было беспокоиться о втискивании в 256 Кб памяти. Поскольку модули в Win32 построены на загрузке по запросу, то всё, что вам нужно сделать - спроецировать весь образ в память, а затем коснуться тех частей, которые вам нужны. Поэтому нет никакого различия между резидентной и не резидентной таблицами, так что имена экспортируемых функций просто записываются в исполняемый образ вместе с указателем (вернее относительным виртуальным адресом) на имя, хранимое в таблице экспорта.

Посмотреть текст целиком...

вторник, 30 августа 2011 г.

Как импортировались DLL функции в 16-битных Windows?

Это перевод How were DLL functions imported in 16-bit Windows? Автор: Реймонд Чен.

В прошлый раз я рассказал о том, как экспортировались функции в 16-битных Windows. Сегодня мы посмотрим на их импорт.

Посмотреть текст целиком...

понедельник, 29 августа 2011 г.

Как экспортировались DLL функции в 16-битных Windows?

Это перевод How were DLL functions exported in 16-bit Windows? Автор: Реймонд Чен.

Весь смысл динамических библиотек (DLL) заключается в динамическом связывании. В то время как статические библиотеки встраиваются в конечный продукт, модуль, который использует динамическую библиотеку, просто говорит: "мне, пожалуйста, функцию X из модуля Y, спасибо". Эта техника имеет преимущества и недостатки. Одно из преимуществ - эффективное использование места на диске и в памяти, поскольку существует только одна копия модуля, вместо отдельных копий для каждого модуля. Второе преимущество - обновление DLL может быть выполнено без перекомпиляции всех программ, её использующих. С другой стороны, возможность менять функциональность также является и одним из недостатков DLL, поскольку одна программа может изменить DLL и вызвать этим каскадные эффекты в других клиентах DLL.

В любом случае, давайте начнём с того, как 16-битные Windows управляли импортом и экспортом. После этого мы посмотрим что было изменено при миграции на 32-битные Windows, а затем мы посмотрим на импорт с точки зрения компилятора.

Посмотреть текст целиком...

воскресенье, 28 августа 2011 г.

Pidl и моникеры делают примерно одно и то же, только по-разному

Это перевод Pidls and monikers do roughly the same thing, just backwards. Автор: Реймонд Чен.

Работая с Оболочкой (Shell) Windows, вам наверняка в какой-то момент пришлось работать с указателем на список ID элементов (pointer to item ID list), известным как "pidl" (рифмуется с "middle"). С другой стороны, работая с OLE, вы могли работать с моникерами (moniker). В каком-то смысле они делают одно и то же. Они позволяют вам ссылаться на какой-то объект внутри пространства имён (с которым вы как-то работаете), они имеют иерархическую структуру, вы можете их сериализовать и т.п.

Но почему тогда команда Оболочки Windows изобрела pidl-ы, если моникеры делали ровно это же?

Посмотреть текст целиком...

суббота, 27 августа 2011 г.

Не всякий человек с не-Windows разделом является гиком

Это перевод Not everybody with a non-Windows partition type is a geek. Автор: Реймонд Чен.

В обсуждении поста "Почему установщик Windows записывает новый загрузочный сектор?" (прим.пер. имеется в виду оригинал) некоторые комментаторы предложили такое поведение: если на машине обнаруживается не-Windows раздел, то предполагать, что машина принадлежит техно-гику. Таким образом, типичный пользователь компьютера может быть спасён от лицезрения технического диалога с гик-вопросом, на которой они не смогут ответить.

Посмотреть текст целиком...

пятница, 26 августа 2011 г.

Прежде чем учиться опознавать неправильное, вам нужно узнать, что есть правильное

Это перевод Before you can learn to recognize what's wrong, you must learn to recognize what's right. Автор: Реймонд Чен.

Иногда, когда я отлаживаю проблему, я могу проигнорировать какой-то поток, а кто-то спросит: "а что делает этот поток? Почему ты его игнорируешь?"

Мой ответ: "Я понятия не имею, что он делает, но что бы он ни делал, это - нормально".

Посмотреть текст целиком...

четверг, 25 августа 2011 г.

Нет, а почему именно 160x31?

Это перевод No, really, why is it 160x31? Автор: Реймонд Чен.

Когда я ранее пояснял, почему свёрнутые (минимизированные) окна имеют размер 160x31, я не пояснил, почему размером выбрано именно ровно 160 и 31.

Посмотреть текст целиком...

среда, 24 августа 2011 г.

Максимальный размер переменных окружения - это 32 или 64 Кб?

Это перевод Is the maximum size of the environment 32K or 64K? Автор: Реймонд Чен.

Кажется, есть некоторая путаница в максимальном размере переменных окружения: 32 Кб или 64 Кб. Какое значение правильное?

Посмотреть текст целиком...

вторник, 23 августа 2011 г.

Безопасность: не забывайте обнулять вещи, на которые вам наплевать

Это перевод Security: Don't forget to initialize the stuff you don't care about. Автор: Реймонд Чен.

Затерянным в волнении уязвимостей повышения привилегий является простое раскрытие информации через отсутствующую инициализацию мусора (прим.пер.: понятия не имею, зачем оригинальное предложение так построено).

Посмотреть текст целиком...

понедельник, 22 августа 2011 г.

Событие с авто-сбросом - это просто глупый семафор

Это перевод An auto-reset event is just a stupid semaphore. Автор: Реймонд Чен.

Когда вы создаёте событие с помощью функции CreateEvent, вы указываете, хотите ли вы создать событие с авто-сбросом (auto-reset event) или с ручным сбросом (manual-reset event).

Событие с ручным сбросом прозрачно для понимания: если событие сброшено, то вы ждёте сигнального состояния; если событие установлено (в сигнальном состоянии), то ожидания не происходит (ожидание удовлетворяется сразу). Не играет значения, сколько человек ждут события; они все обрабатываются одинаково, а состояние события не зависит от числа его ожидающих.

Событие с авто-сбросом - более запутывающая штука.

Посмотреть текст целиком...

воскресенье, 21 августа 2011 г.

Одноэкземплярная программа является своим собственным отказом в обслуживании

Это перевод A single-instance program is its own denial of service. Автор: Реймонд Чен.

Есть много способов, которыми программа может достичь поведения запуска в едином экземпляре; я не буду разбирать их. Но как только люди встают на путь программы с одним запущенным экземпляром, они тут же спотыкаются о другую проблему при анализе безопасности: отказ в обслуживании (denial of service attack).
Мы используем мьютекс с фиксированным именем, чтобы определить, не запущена ли уже копия программы. Но это также означает, что злоумышленник может создать мьютекс с таким именем до запуска программы, блокируя, таким образом, запуск нашей программы! Как я могу предотвратить этот тип отказа в обслуживании?

Посмотреть текст целиком...

суббота, 20 августа 2011 г.

Почему нет программного способа изменить порядок элементов в меню Пуск?

Это перевод Why can't you programmatically reorder the items on the Start menu? Автор: Реймонд Чен.

Классическое меню Пуск и часть "Все программы" меню Пуск в стиле Windows XP позволяют вам изменить порядок ярлыков, показываемых в них. Вы можете использовать перетаскивание для его упорядочивания, либо же просто использовать сортировку по имени. Но почему нет никакого программного интерфейса для выполнения этих операций?

Посмотреть текст целиком...

пятница, 19 августа 2011 г.

Разбираемся, что на самом деле значит "значимые цифры"

Это перевод Understanding what significant digits really mean. Автор: Реймонд Чен.

Числа с плавающей запятой двойной точности (double-precision floating point number) содержат 15 значащих цифр. Что это значит на самом деле?
Я умножил 0,619207 на 10'000'000 и получил 6'192'069,999999991 вместо 6'192'070. Это же только шесть цифр; где мои обещанные пятнадцать?

Посмотреть текст целиком...

четверг, 18 августа 2011 г.

Свойства оконных классов применяются ко всем окнам этого класса

Это перевод Window class properties apply to all windows that belong to the class. Автор: Реймонд Чен.

Свойства оконных классов применяются ко всем окнам этого класса. Именно поэтому они и называются классовыми свойствами. Это выглядит как очевидная вещь, когда её облекают в слова, но я видел множество "решений", которые теряют из вида этот простой факт.

Посмотреть текст целиком...

среда, 17 августа 2011 г.

Подводные камни вывода сглаженного текста с прозрачным фоном

Это перевод Pitfalls of transparent rendering of anti-aliased fonts. Автор: Реймонд Чен.

Windows предоставляет несколько технологий рендеринга монохромного текста на цветных экранах, пользуясь преимуществами характеристик экрана для предоставления гладкого результата. Эти техники включают в себя сглаживание (grayscale anti-aliasing), а также и более продвинутую технику - ClearType. Обе техники читают фоновые пиксели, чтобы определить, что рисовать. Это означает, что рендеринг текста требует дополнительного внимания.

Посмотреть текст целиком...

вторник, 16 августа 2011 г.

Блуждая в темноте и спотыкаясь о неверное решение

Это перевод Fumbling around in the dark and stumbling across the wrong solution. Автор: Реймонд Чен.

Я не хотел придираться к этой серии записей, но она иллюстрирует интересный шаблон спотыкания на неверном "решении".

Эта серия пытается запустить системный триггер неактивности монитора отправкой сообщения окну рабочего стола (desktop window).

Посмотреть текст целиком...

понедельник, 15 августа 2011 г.

Помните, что происходит, когда вы делаете широковещательную рассылку

Это перевод Remember what happens when you broadcast a message. Автор: Реймонд Чен.

Иногда я вижу, как люди делают вещи вроде широковещательной рассылки (broadcasting) сообщения WM_COMMAND всем окнам верхнего уровня (top-level windows). Это одна из вещей, которые настолько очевидно неправильные, что я не понимаю, как кому-то вообще может приходить в голову идея, что это будет работать.

Посмотреть текст целиком...

воскресенье, 14 августа 2011 г.

Забытые элементы управления: функция MenuHelp

Это перевод The forgotten common controls: The MenuHelp function. Автор: Реймонд Чен.

Функция MenuHelp - это одна из самых запутывающих функций в библиотеке общих элементов управления. К счастью, вам почти никогда не придётся её использовать, и когда вы узнаете её историю - вы не захотите её использовать.

Посмотреть текст целиком...

суббота, 13 августа 2011 г.

Что делает стиль оконного класса CS_CLASSDC?

Это перевод What does the CS_CLASSDC class style do? Автор: Реймонд Чен.

В прошлый раз я говорил об исторической подоплёке стиля оконных классов CS_OWNDC и почему изначально это звучит как отличная идея, но после близкого знакомства оказывается, что это больше похоже на ужасную идею.

Стиль CS_CLASSDC - это то же самое, только хуже. Потому что он берёт все проблемы CS_OWNDC и умножает их.

Посмотреть текст целиком...

пятница, 12 августа 2011 г.

Что делает стиль оконного класса CS_OWNDC?

Это перевод What does the CS_OWNDC class style do? Автор: Реймонд Чен.

Вспомните, что оконные DC (device context - контексты устройств) обычно используются только временно. Если вам нужно нарисовать что-то на окне, то вы вызываете BeginPaint или, если рисование происходит вне цикла рисования, GetDC (хотя вам следует избегать прорисовки вне цикла рисования). Оконный менеджер создаёт для окна DC и возвращает его. Вы используете полученный DC для рисования, а затем восстанавливаете состояние окна, возвращая DC оконному менеджеру вызовом EndPaint (или ReleaseDC). Внутренне, оконный менеджер хранит небольшой кэш DC, который он использует, когда его просят дать DC для окна, и когда DC возвращается - он помещается обратно в кэш (прим.пер.: отдельный кэш каждому потоку, кэш - per-thread). Поскольку оконные DC используются только временно, то число кэшированных DC обычно не сильно велико, так что небольшой кэш достаточен, чтобы удовлетворять запросы на DC в типичной работающей системе.

Если вы регистрируете оконный класс с флагом CS_OWNDC в классовых стилях, то оконный менеджер создаст DC для окна и поместит его в кэш, пометив специальным флагом "Не удалять этот DC из кэша, потому что он принадлежит окну с CS_OWNDC". Если вы вызовите BeginPaint или GetDC для получения DC окна со стилем CS_OWNDC, то этот DC всегда будет найден в кэше и всегда будет помещаться обратно в него (потому что он был помечен "никогда не удалять"). Из этого есть следствия: хорошие, плохие и ещё хуже.

Посмотреть текст целиком...

четверг, 11 августа 2011 г.

Почему "Установка и удаление программ" пытается угадать недостающую информацию?

Это перевод Why did the Add or Remove Programs control panel try to guess all that information? Автор: Реймонд Чен.

Как мы видели ранее, апплет панели управления "Установка и удаление программ" использует несколько эвристических техник, чтобы определить вещи вроде размера программы и частоты её использования. Зачем апплет вообще заморачивается с получением этой информации, если программа её не указывает?

Посмотреть текст целиком...

среда, 10 августа 2011 г.

Если вы собираетесь эмулировать действия пользователя, убедитесь, что пользователь вообще смог бы их сделать

Это перевод If you're going to try to simulate user actions, make sure the user can do them. Автор: Реймонд Чен.

Многим людям нравится эмулировать действия пользователя программно. Я не собираюсь комментировать, является ли это вообще хорошей идеей; однако я хочу указать, что если вы всё же собираетесь это делать, то вам лучше бы быть уверенными в том, что вы эмулируете те вещи, которые пользователь на самом деле может делать.

Посмотреть текст целиком...