Wednesday, June 25, 2008

Kernel C++

До тех пор, пока вы видите в своем свежескомпилированном драйвере:

mov eax, _pCurrentException
mov [ebp-40h], eax
mov eax, _pCurrentExContext
mov [ebp-44h], eax
вместо

call PsGetCurrentThread
lea ecx, [eax + CurrentExceptionOffset]
mov [ebp-40h], ecx
lea ecx, [eax + CurrentExContextOffset]
mov [ebp-44h], ecx
_Winnie C++ Colorizer
С++ в kernel'е использовать рановато.
Использование "С++ без исключений" порождает интересные вопросы:
  1. как быть с STL?
  2. как быть с уменьшением ширины кода без goto?
  3. как дружить RAII с goto?
  4. как добавлять поддержку non-valid состояния во все объекты, которые в других ситуациях могли бы просто выкинуть исключение в конструкторе?
    Итого, максимум что можно получить, это С со строгой типизацией и возможностью объявлять переменные где угодно.
    Можно, конечно, посмотреть в сторону ParseProcedure/DeleteProcedure, это, наверное, единственный гарантированно 100% работающий вариант - сделать свой микро-TLS в кернеле. Интересно, будут ли хаки этих процедур работать на Vista 64?
    И, самое главное - вы на самом деле готовы отдать (2*sizeof(void*) + sizeof(TreeHeader))*SystemThreadCount байт NonPaged Pool'а на поддержку C++ nested exceptions?

No comments: