The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



"Доступен Debian GNU/Hurd 2021"
Версия для распечатки Пред. тема | След. тема
Форум Разговоры, обсуждение новостей
Исходное сообщение [ Отслеживать ]
Подсказка: Для контроля за появлением новых сообщений - перед выходом жмите "Пометить прочитанным".
. "Доступен Debian GNU/Hurd 2021" +/
Сообщение от n00by (ok), 18-Авг-21, 15:03 
>> А Вы не предполагайте, а изучите вопрос. Что бы "сунуть" в ядро
>> такой механизм плюсов как исключения, надобно достаточно хорошо понимать, как это
>> всё работает, начиная с уровней IRQL и заканчивая собственно диспетчером исключений.
>> Представьте себе, SEH (т.е. исключения) обязательно там используется в любом драйвере
>> на Си.
> там немного не те исключения. SEH это самоделка (в хорошем смысле) исключений
> от Microsoft для C. Поддерживаемая на уровне компилятора C от Microsoft,
> и их стандартной библиотеки.

Совершенно верно. При этом на вопрос хорошо бы смотреть чуть шире: у Микрософта не было компилятора актуальной версии Си. Вместо работы над соответствием стандарту они реализовали механизм очень похожий внешне на Си++ (если не считать __ и finally). На этом фоне ряд претензий к исключениям Си++ выглядят странно (если не принимать во внимание размер бросаемых объектов).

> Скорее всего есть поддержка и в библиотеке
> ядра системы. Возможно у Microsoft в C++ исключения реализованы уже через
> C, но именно этим вопросом не интересовался.

throw() ортогонален к исключениям ОС (SEH) и вызывает диспетчер (что ищет подходящий блок catch). Тот же диспетчер может быть вызван и ОС, если происходит исключение при доступе к памяти. Будет ли catch ловить SEH, определяется ключами компилятора. Микрософт не предоставляла реализацию диспетчера Си++ исключений для ядра, но её можно написать самому или взять готовую -- не думаю, что упомянутые "индусы" на такое способны.

> Как сейчас - не знаю, но в WINDDK версии "Windows Server 2003 Service Pack 1"
> примеры драйверов все были на C, и, кстати, без __try/__except/__finally.

Drivers must call ProbeForRead inside a try/except block. If the routine raises an exception, the driver should complete the IRP with the appropriate error. Note that subsequent accesses by the driver to the user-mode buffer must also be encapsulated within a try/except block: a malicious application could have another thread deleting, substituting, or changing the protection of user address ranges at any time (even after or during a call to ProbeForRead or ProbeForWrite). For more information, see Handling Exceptions.

https://docs.microsoft.com/en-us/windows-hardware/drivers/dd...

Не знаю, почему Микрософт считает нижеприведённый код C++, но я и try вместо __try впервые у них вижу, а углубляться в MSDN резона нет:


try {
    ...
    ProbeForWrite(Buffer, BufferSize, BufferAlignment);

    /* Note that any access (not just the probe, which must come first,
     * by the way) to Buffer must also be within a try-except.
     */
    ...
} except (EXCEPTION_EXECUTE_HANDLER) {
    /* Error handling code */
    ...
}

https://docs.microsoft.com/en-us/windows-hardware/drivers/ke...
Ответить | Правка | Наверх | Cообщить модератору

Оглавление
Доступен Debian GNU/Hurd 2021, opennews, 14-Авг-21, 09:29  [смотреть все]
Форумы | Темы | Пред. тема | След. тема



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру