Показаны сообщения с ярлыком Win32. Показать все сообщения
Показаны сообщения с ярлыком Win32. Показать все сообщения

четверг, 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. Эта инструкция копирует регистр в самого себя и не обновляет флаги, что совершенно не имеет смысла. Тогда зачем она там?

вторник, 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.

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

Чему может быть равно свойство Status у WMI класса Win32_ComputerSystem?

Это перевод What are the possible Status values for Win32_ComputerSystem? Автор: Реймонд Чен.

Документация для WMI класса Win32_Computer­System содержит такое описание свойства Status:
Status
Тип данных: string
Доступ: только чтение
Квалификаторы: MaxLen (10), DisplayName (“Status”)

Текущее состояние объекта. Могут быть определены различные рабочие и нерабочие состояния. К рабочим статусам относятся: OK, Degraded и Pred Fail. Последнее значение может использоваться, к примеру, жёстким диском с поддержкой SMART, который может функционировать правильно, но прогнозирует сбой в ближайшем будущем. К нерабочим состояниям относятся: Error, Starting, Stopping и Service, которые могут применяться во время переноса зеркала диска, перезагрузки списка разрешений пользователей или другой административной работы.

Это свойство наследуется от CIM_Managed­System­Element.

Значения могут быть следующими:
OK (“OK”)
Error (“Error”)
Degraded (“Degraded”)
Unknown (“Unknown”)
Pred Fail (“Pred Fail”)
Starting (“Starting”)
Stopping (“Stopping”)
Service (“Service”)
Stressed (“Stressed”)
NonRecover (“NonRecover”)
No Contact (“No Contact”)
Lost Comm (“Lost Comm”)
Что эта чушь пытается нам сказать? И что она говорит нам о возможных значениях свойства Status для Win32_Computer­System?

пятница, 21 августа 2020 г.

Об использовании FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING для проецируемых в память файлов

Это перевод On using FILE_FLAG_WRITE_THROUGH and FILE_FLAG_NO_BUFFERING for memory-mapped files. Автор: Реймонд Чен.

Клиент хотел использовать флаги FILE_FLAG_WRITE_THROUGH и FILE_FLAG_NO_BUFFERING для проецируемого в память файла (memory-mapped file), основываясь на этом руководстве в документации для функции CreateFile:
По этой причине флаг FILE_FLAG_WRITE_THROUGH часто используется совместно с флагом FILE_FLAG_NO_BUFFERING в качестве замены для вызова функции FlushFileBuffers после каждой записи, что может привести к ненужным потерям производительности. Совместное использование этих флагов позволяет избежать штрафов.
Клиент был обеспокоен тем, повлияет ли такая комбинация флагов на согласованность данных.

суббота, 23 мая 2020 г.

Дело о SHGetFolderPath(CSIDL_COMMON_DOCUMENTS), возвращающей ERROR_PATH_NOT_FOUND

Это перевод The case of the SHGetFolderPath(CSIDL_COMMON_DOCUMENTS) that returned ERROR_PATH_NOT_FOUND. Автор: Реймонд Чен.

У клиента возникла проблема с функцией SHGetFolderPath. В частности, у них была программа, которая вызывала функцию так:
SHGetFolderPath(0, CSIDL_COMMON_DOCUMENTS, 0, SHGFP_TYPE_CURRENT, PChar(pathBuffer));
но вызов функции возвращал ошибку $80070003 - это HRESULT-версия для ERROR_PATH_NOT_FOUND. Ошибка возникает только при запуске из Jenkins pipeline. Если же программа запускается автономно, то функция завершается успешно и возвращает ожидаемый результат.

пятница, 17 января 2020 г.

Подводный камень: размещение окна под TopMost окном сделает окно TopMost

Это перевод Nasty gotcha: Positioning your window beneath a topmost window makes it topmost. Автор: Реймонд Чен.

У функции DeferWindowPos (и, следовательно, любой функции на её основе, типа SetWindowPos) есть неприятный подводный камень: если вы укажете hwndInsertAfter, а окно insert-after будет самым верхним (TopMost), то позиционируемое окно будет размещено сразу после этого окна.

Пока всё идёт нормально.

Почему я не могу переместить FOLDERID_LocalAppData с помощью SHSetKnownFolderPath?

Это перевод Why can’t I use SHSetKnownFolderPath to change the location of FOLDERID_LocalAppData? Автор: Реймонд Чен.

Заказчик заметил, что его модульный тест начал давать сбой в Windows 10 версии 1803. В частности, он не прошел здесь:
SHSetKnownFolderPath(FOLDERID_LocalAppData, 0, 0, temporaryDirectory);
с ошибкой E_INVALIDARG. Что изменилось в Windows 10 версии 1803, из-за чего этот вызов стал недействительным?

четверг, 16 января 2020 г.

Почему последний выбранный файл появляется первым, когда я выбираю несколько файлов в диалоге открытия файла?

Это перевод When I select multiple files in the File Open dialog, why does the last item come first? Автор: Реймонд Чен.

Если у вас есть диалог открытия файла, который поддерживает множественный выбор, и вы выбираете несколько файлов, вы можете заметить, что файл, выбранный последним, указывается первым. Это раздражает, если порядок файлов при выборе является важным (прим. пер.: например, при добавлении фото в альбом). Почему последний выбранный элемент становится первым в списке?

четверг, 5 сентября 2019 г.

Печальная история спецификаторов форматирования в стиле printf в Visual C++

Это перевод The sad history of Unicode printf-style format specifiers in Visual C++. Автор: Реймонд Чен.

Windows реализовала Unicode раньше, чем большинство других операционных систем. В результате решения Windows для многих проблем отличаются от решений, принятых теми, кто подождал, когда пыль осядет¹. Самым ярким примером этого является использование Windows UCS-2 в качестве кодировки Unicode. Тогда это была кодировка, рекомендованная консорциумом Unicode, потому что Unicode 1.0 поддерживал только 65'536 символов². Консорциум Unicode передумал пять лет спустя, но к тому времени было уже слишком поздно для Windows, которая уже выпустила Win32s, Windows NT 3.1, Windows NT 3.5, Windows NT 3.51 и Windows 95 - все из которых использовали UCS-2³.

Но сегодня мы поговорим о строках формата в стиле printf.

Обновлено: Если FlushInstructionCache ничего не делает, почему я должен её вызывать?

Это перевод If FlushInstructionCache doesn’t do anything, why do you have to call it, revisited. Автор: Реймонд Чен.

Предполагается, что вы будете вызывать функцию FlushInstructionCache, когда вы генерируете или модифицируете исполняемый код в run-time - чтобы процессор при выполнении вашего сгенерированного/модифицированного кода читал бы написанные вами инструкции, а не старые инструкции, которые могут остаться в кеше команд процессора.

Ранее мы узнали, что в Windows 95 функция FlushInstructionCache не делает ничего, кроме возврата. Это потому, что простого вызова функции было достаточно, чтобы очистить кэш команд.

Но в Windows NT функция FlushInstructionCache выполняет реальную работу, поскольку ей необходимо уведомить все остальные процессоры о необходимости очищать их кэши.

Однако если вы посмотрите на Windows 10, то вы обнаружите, что функция FlushInstructionCache выглядит как версия для Windows 95: она ничего не делает.

В чём тут дело?

пятница, 11 января 2019 г.

Зачем нужна красная зона? Я же могу просто использовать стек?

Это перевод Why do we even need to define a red zone? Can’t I just use my stack for anything? Автор: Реймонд Чен.

В Windows стек растет от больших адресов к меньшим. Иногда это определяется архитектурно, а иногда просто условно. Значение, на которое указывает регистр указателя стека, располагается на вершине стека, а значения, расположенные глубже в стеке, находятся по адресам выше. Но что происходит с данными по адресам меньшим, чем указатель стека?

среда, 19 декабря 2018 г.

четверг, 13 октября 2016 г.

В Windows папка приложения - это его пакет

Это перевод In Windows, the directory is the application bundle. Автор: Реймонд Чен.

Комментатор Aaargh! спрашивает, почему бы Windows не "украсть" идею пакетов приложений (application bundle) у Apple и не распространять каждое приложение вместе со всеми библиотеками и необходимыми файлами.

суббота, 21 февраля 2015 г.

FPO

Это перевод FPO. Автор: Ларри Остерман.

На прошлой неделе я болтал с одним парнем из команды измерения производительности. Он мне рассказал историю, которая меня очень удивила. Как оказалось, они обнаружили проблему производительности в одном стороннем драйвере. К сожалению, у них возникли проблемы в локализации узкого места, поскольку разработчик драйвера скомпилировал его с FPO (Frame Pointer Ommission) и не предоставил отладочную информацию.

Что тут удивительного? Ну, я удивился что сегодня вообще кто-то использует FPO.

Но что такое FPO?

воскресенье, 11 января 2015 г.

Что на самом деле делает флаг SEE_MASK_UNICODE в ShellExecuteEx?

Это перевод What does the SEE_MASK_UNICODE flag in ShellExecuteEx actually do? Автор: Реймонд Чен.

Кое-кто с невежливым ником хотел узнать, что делает флаг SEE_MASK_UNICODE.

Что за дела с сообщением EM_SETHILITE?

Это перевод What's the deal with the EM_SETHILITE message? Автор: Реймонд Чен.

Если вы посмотрите на документацию по сообщениям EM_SETHILITE и EM_GETHILITE, то увидите просто "not implemented" ("не реализовано"). Что тут происходит?

четверг, 13 марта 2014 г.

Перенаправление вывода выполняется командным интерпретатором

Это перевод Command line redirection is performed by the command line interpreter. Автор: Реймонд Чен.

"Волшебные" символы перенаправления вывода <, > и | в командных строках вида:
myprogram.exe | sort > output.txt
обрабатываются командным интерпретатором CMD.EXE; они не встроены в функцию CreateProcess.

вторник, 19 ноября 2013 г.

Как мне запустить ограниченный процесс из моего повышенного процесса и наоборот?

Это перевод How can I launch an unelevated process from my elevated process and vice versa? Автор: Реймонд Чен.

Перейти от обычного процесса (unelevated) к процессу с повышенными правами (elevated) - легко. К примеру, вы можете запустить процесс с повышением прав, используя в Shell­Execute или Shell­Execute­Ex действие (verb) "runas".

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