Выпуск новостей ReactOS №55 | Participants
|
- Statistics
- Participants
- Translate into Russian
- Translation result
- Translated in draft, editing and proof-reading required.
If you do not want to register an account, you can sign in with OpenID.
ReactOS Newsletter - Newsletter 55 (#55) | ||
Font Engine | ||
There is a difference between functional correctness and implementation correctness, a distinction one always has to keep in mind when saying something works in ReactOS. In the case of text rendering, while the output may for the most part look correct, the underlying implementation is nothing like how it should be. The abbreviated function call chain for displaying text is TextOutA/W, NtGdiExtTextOutW, and GreExtTextOutW. There are a few variations but the above provides a general idea of the path down to the Gre function. ReactOS on the other hand did not even have GreExtTextOutW and the Win32k module was actually calling NtGdiExtTextOutW. Since NtGdiExtTextOutW is the syscall that interacts with usermode memory and thus checks to make sure the buffers it is handed is in usermode, calling the function in kernel mode with kernel mode buffers should not work at all. This only worked because of another bug in MmCopyFromCaller, which is used to copy data from usermode buffers to kernel mode. This function was supposed to check a usermode buffer and copy the data to a kernel mode buffer. The check was broken, which was what allowed Win32k to use NtGdiExtTextOutW. In addition to all the above, MmCopyFromCaller should not exist. It is a ReactOS specific hack and NtGdiExtTextOutW should be using SEH to do the checking of buffers it receives. The reason Win32k is supposed to use GreExtTextOutW is that it is handing the function kernel mode buffers and GreExtTextOutW is also expecting to receive kernel mode buffers. Thus it automatically trusts whatever it is handled without any checking. This is very common amongst functions that are designed to work only when called from kernel mode. | Существует разница между корректной работой функций и их реализацией, и ее всегда надо иметь в виду, когда говоришь, что что-то работает в ReactOS. В случае с отрисовкой текста, внутренняя реализация не имеет вообще ничего общего с тем, какой она должна быть. Цепочка вызовов функций для отображения текста - это TextOutA/W, NtGdiExtTextOutW и GreExtTextOutW. Существуют несколько вариаций, но вышеназванный способ показывает общую идею того, как поток управления спускается до уровня функции GRE. В ReactOS этой функции вообще нет, и модуль Win32K просто вызывал NtGdiExtTextOutW. Поскольку эта функция является системным вызовом, то она взаимодействует с пользовательской памятью и, следовательно, должна проверять передаваемый буфер на принадлежность к ней, вызов этой функции в режиме ядра с буферами памяти ядра вообще не должен сработать. Оно работало из-за одной ошибки в функции MmCopyFromCaller, которая копирует данные из пользовательских буферов в буферы ядра. Ожидалось, что она будет проверять буфер назначения на то, является ли он пользовательским, однако проверка не работала, поэтому Win32K успешно использовала NtGdiExtTextOutW. Кроме всего прочего, функция MmCopyFromCaller вообще не должна существовать. Это заплатка, существующая только в ReactOS, и функция NtGdiExtTextOutW должна использовать SEH для проверки получаемого буфера. Причиной, по которой Win32K должна использовать GreExtTextOutW, является тот факт, что Win32K работает с буферами ядра, а GreExtTextOutW требует такой буфер для своей работы, следовательно можно автоматически доверять любому передаваемому буферу без проверок. Это широко распространенная практика среди функций, которые должны работать только в том случае, если они вызваны в режиме ядра. | |
The other thing ReactOS was not doing was using the STROBJ/ESTROBJ data structure, used describe a set of glyphs and their positions, essentially the text that one wants displayed. GreExtTextOutW calls the ESTROBJ::vInit to initialize the structure, also passing along the data to fill it in and doing the necessary coordinate translation. The | Кроме того, в ReactOS также не использовались структуры данных STROBJ / ESTROBJ, применяемые для описания набора символов и их положений - по сути, текста, который требуется вывести. Функция GreExtTextOutW вызывает ESTROBJ::vInit для инициализации структуры, также передавая данные, согласно которым ее можно заполнить и провести необходимые преобразования координат. |

Comment was deleted