Конференция "Прочее" » А можно ли вообще при проектировании драйверов использовать ООП?
 
  • Городской Шаман (22.01.09 23:21) [0]
    Насколько я понял компилятор для сборки драйверов почти не понимает конструкции С++. В принципе это и правильно. Но возможно ли использовать C++ для написания kernel-mode кода?
  • jack128_ (22.01.09 23:25) [1]

    > В принципе это и правильно.

    почему если не секрет??
  • Городской Шаман (22.01.09 23:29) [2]

    > jack128_   (22.01.09 23:25) [1]
    >
    >
    > > В принципе это и правильно.
    >
    > почему если не секрет??


    Потому что там очень хитрое выделение памяти и ее освобождение. Если с paged memory еще как-то можно реализовать, то с nonpaged вешайся. Мне бы хотя бы для paged, ну там new, delete, виртуальные функции. Мне много не нужно...
  • Eraser © (22.01.09 23:46) [3]
    форум это не справочная система. неужели даже букварь влом почитать.
  • Городской Шаман (23.01.09 00:02) [4]

    > Eraser ©   (22.01.09 23:46) [3]
    >
    > форум это не справочная система. неужели даже букварь влом
    > почитать.


    Ну почему, читал
    C++ Issues for Kernel-Mode Drivers
    http://www.microsoft.com/whdc/driver/kernel/KMcode.mspx
  • Eraser © (23.01.09 00:05) [5]
    мда... склоняюсь к тому, что не зря MS ввело обязательную сертификацию драйверов. с такими писателями по-другому никак видимо.
  • Городской Шаман (23.01.09 00:18) [6]

    > Eraser ©   (23.01.09 00:05) [5]
    >
    > мда... склоняюсь к тому, что не зря MS ввело обязательную
    > сертификацию драйверов. с такими писателями по-другому никак
    > видимо.


    Нет, я понимаю что это можно сделать через перегрузку оператора new, но это геморрой перегружать его для каждого класса.
  • Городской Шаман (23.01.09 00:45) [7]
    Ладно, разобрался, всем спасибо.
  • Пробегал2.... (23.01.09 00:53) [8]
    Удалено модератором
  • Пробегал2.... (23.01.09 00:55) [9]
    Удалено модератором
  • Пробегал2.... (23.01.09 00:56) [10]
    Удалено модератором
  • Германн © (23.01.09 00:58) [11]

    > В драйверах тут 90% ничего не понимают

    Не. 99.9(9)% в драйверах тут ничего не понимает.
    Но "умные" вопросы задают многие.
  • AndreyV © (23.01.09 01:08) [12]
    > [6] Городской Шаман   (23.01.09 00:18)
    >
    > > Eraser ©   (23.01.09 00:05) [5]
    > >
    > > мда... склоняюсь к тому, что не зря MS ввело обязательную
    >
    > > сертификацию драйверов. с такими писателями по-другому
    > никак
    > > видимо.
    >
    >
    > Нет, я понимаю что это можно сделать через перегрузку оператора
    > new, но это геморрой перегружать его для каждого класса.

    Можно стандартный переопределить
    ::operator new()
    ::operator new[]()
  • Johnmen © (23.01.09 01:19) [13]

    > Пробегал2....   (23.01.09 00:55) [9]

    Вам что-то не нравится? М.б. стОит пойти туда, где Вас любят?
  • Городской Шаман (23.01.09 01:32) [14]

    > Пробегал2....   (23.01.09 00:56) [10]
    >
    > Городской Шаман   (23.01.09 0:45) [7]
    > Ладно, разобрался, всем спасибо
    >
    > ну так разобрался - расскажи в трех словах и нам ;)


    Просто переопределить операторы, код не особо рабочий просто для примера

    #define YOURMEM_TAG 0xfef1
    __inline void* __cdecl operator new(size_t lBlockSize)
    {
     PAGED_CODE();
     return ExAllocatePoolWithTag(PagedPool, lBlockSize, YOURMEM_TAG);
    }


    __inline void* __cdecl operator new(size_t lBlockSize, int pageType)
    {
     //здесь типа по pageType выбираем функцию под нужный тип памяти
     PAGED_CODE();
     return ExAllocatePoolWithTag(PagedPool, lBlockSize, YOURMEM_TAG);
    }


    __inline void __cdecl operator delete( void *p )
    {
     PAGED_CODE();

     if (!p)
       return;

     ExFreePoolWithTag(p, YOURMEM_TAG);
    }


    __inline void __cdecl operator delete( void *p, int pageType)
    {
     //здесь типа по pageType выбираем функцию под нужный тип памяти

     PAGED_CODE();

     if (!p)
       return;

     ExFreePoolWithTag(p, YOURMEM_TAG);
    }




    Использовать так

    class PagedObject
    {
    }
    ;

    PagedObject* newPO = new PagedObject;
    int* int_tst = new int;
    int* int_tst_unpages = new(10) int;//10 означает что используем нестраничную память из нужного пула

  • Городской Шаман (23.01.09 01:34) [15]

    > AndreyV ©   (23.01.09 01:08) [12]
    >
    > Можно стандартный переопределить
    > ::operator new()
    > ::operator new[]()


    Это я уже понял, просто мне проще сперва вслух сформулировать вопрос, а потом дать на него ответ, тоже вслух.
  • Игорь Шевченко © (23.01.09 01:40) [16]
    Странно. У меня в каталоге %SystemRoot%\System32\drivers как минимум десяток драйверов написанных на С++, причем фирмы вроде солидные - ATI, Realtek. Кроме того, ядерная часть GDI (которая в драйвере Win32k.sys) она тоже на С++.

    Ну и в примерах DDK тоже есть драйверы на С++

    Но раз Софт считает, что нельзя - ну увы.

    Хотя я лично не вижу причин для ненаписания драйверов на С++. А уж ООП - оно и в Африке ООП (то есть, в драйверах, опять же)
  • ketmar © (23.01.09 01:41) [17]
    как хорошо… как хорошо, что Линус не стал писать Linux на *этом*… а то вот понаписали бы…

    ---
    All Your Base Are Belong to Us
  • Игорь Шевченко © (23.01.09 01:43) [18]
    ketmar ©   (23.01.09 01:41) [17]

    на *этом* - это на чем ?
  • Городской Шаман (23.01.09 02:04) [19]

    > Игорь Шевченко ©   (23.01.09 01:40) [16]


    А можно ссылку на исходники данного драйвера, так как я в WinDDK\6001.18001\src\ не нашёл примеров использования ООП при разработке драйверов, поэтому и спрашивал.
 
Конференция "Прочее" » А можно ли вообще при проектировании драйверов использовать ООП?
Есть новые Нет новых   [134453   +33][b:0][p:0.002]