Использование класса в драйвере

Тема в разделе "WASM.BEGINNERS", создана пользователем SPath, 1 сен 2005.

  1. SPath

    SPath New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2005
    Сообщения:
    13
    Какие манипуляции нужно сделать с файлами для VS чтобы можно было использовать class.

    Просто объявление class вызывает ошибку но в тоже время есть dsw от проэкта He4HookInv в котором широко используются классы, а также driver wizard создает проэкты в виде классов
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Что за ошибка? Что за класс?
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Какая именно ошибка?

    Вот простейший класс, который без проблем использую вместо RtlInitUnicodeString:
    Код (Text):
    1. class Counted_string
    2. {
    3.     UNICODE_STRING  str;
    4. public:
    5.     __forceinline Counted_string(const wchar_t * s)
    6.     {
    7.         str.Buffer = (wchar_t *) s;
    8.         str.Length = 0;
    9.         while( *s++ ) str.Length += sizeof(wchar_t);
    10.         str.MaximumLength = str.Length + sizeof(wchar_t);
    11.     }
    12.     UNICODE_STRING * operator &() { return &str; };
    13. };
     
  4. SPath

    SPath New Member

    Публикаций:
    0
    Регистрация:
    10 авг 2005
    Сообщения:
    13
    syntax error : identifier 'Counted_string'

    syntax error : ';'

    found '{' at file scope (missing function header?)

    error C2059: syntax error : '}'



    как у вас создан файл проэкта?



    проэкт создан из source тулзой srctodsp
     
  5. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    SPath

    Слушай, а ты случайно не как "С" компилируешь?

    /Tc<source file> compile file as .c
     
  7. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    ООП в драйверах - это нечто ужасное. У меня даже мысль об этом вызывает приступ тошноты.
     
  8. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    SPath >




    У меня есть только студия 2005 beta2 и использование её компилятора для создания дров мне кажется опасным :)

    Компилирую всё батником:



    cl /O[тут опции оптимизации] /Gz /Fe%kmd_name% %kmd_resource%.res /Zc:wchar_t,forScope %kmd_source% /link /align:32 /driver /machine:x86



    В исходнике должны быть такие строчки:
    Код (Text):
    1.  
    2. #pragma comment(linker, "/entry:DriverEntry") // или как там у вас.
    3. #pragma comment(linker, "/subsystem:native")
    4. #pragma comment(lib,    "ntoskrnl.lib") // другие либы, если нужны - аналогично
    5. #pragma intrinsic( memcpy ) // для всех crt a-ций, что бы не линковалось ничего


    Хидеры из DDK подключаю так:
    Код (Text):
    1. #define _X86_
    2. #ifdef  __INTEL_COMPILER // если нужно собирать Intel C Compiler
    3. #if _MSC_VER < 1300
    4. #undef  _MSC_VER
    5. #define _MSC_VER 1300
    6. #endif
    7. #endif
    8.  
    9. extern "C"  {           // нужно когда компилятор в режиме CPP
    10. #include <ntddk.h>
    11. }
    И ещё - использовать статические экземпляры классов нельзя, поскольку вызовом конструкторов\деструкторов занимается CRT.







    Противникам "ООП в драйверах" предлагаю ответить на 2 вопроса:

    - если в сорцах встречается слово "class", означает ли это, что используется ООП?

    - в чём разница между массивом MajorFunction в структуре DRIVER_OBJECT и таблицей виртуальных методов?