опять cpp в драйвере...
От: MTimur  
Дата: 18.02.10 18:09
Оценка:
Здравствуйте.
В поисках решения очередной проблемы наткнулся на статью microsoft'а How to Use Function typedefs in C++ Driver Code to Improve PREƒast Results.
Очень удивил меня вот этот кусок кода:
class MyDriverClass
{
    PDRIVER_OBJECT m_DriverObject;
public:

    DRIVER_INITIALIZE mf_DriverEntry;
    MyDriverClass();
};

MyDriverClass *g_DriverObject;

// The C linkage wrapper function
extern "C" DRIVER_INITIALIZE DriverEntry;

extern "C" NTSTATUS DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
{
   // Create/Initialize class MyDriverClass with a pointer
   // to it in g_DriverObject.
   g_DriverObject = new MyDriverClass();
   if (g_DriverObject == NULL)
   {
       //...
   }

   NTSTATUS st = g_DriverObject->mf_DriverEntry(DriverObject,RegistryPath);
   //...
}

// Implement the DriverEntry member function
NTSTATUS MyDriverClass::mf_DriverEntry(__in PDRIVER_OBJECT DriverObject, __in PUNICODE_STRING RegistryPath)
{
   m_DriverObject = DriverObject;
   //...
}


Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?
Re: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 18.02.10 18:19
Оценка: 1 (1)
Здравствуйте, MTimur, Вы писали:

MT>Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?

C++ в драйверах прекрасно работает с некоторыми ограничениями.
Sapienti sat!
Re[2]: опять cpp в драйвере...
От: MTimur  
Дата: 18.02.10 20:15
Оценка:
Здравствуйте, Cyberax, Вы писали:

MT>>Знающие люди, объясните как это понимать, оно вообще скомпилится? Если да, то как? Вроде как microsoft говорил всегда, что CPP в драйверах не поддерживает. Или я что-то упустил?

C>C++ в драйверах прекрасно работает с некоторыми ограничениями.

Спасибо. Не подскажите где можно почитать подробнее об этом?

Простой тест

    char * a = new char();


Результат:

error LNK2019: unresolved external symbol "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) referenced in function _DriverEntry@8

Re[3]: опять cpp в драйвере...
От: Геннадий Майко США  
Дата: 18.02.10 21:57
Оценка: 2 (1)
Здравствуйте, MTimur,

C>>C++ в драйверах прекрасно работает с некоторыми ограничениями.


MT>Спасибо. Не подскажите где можно почитать подробнее об этом?

--
Можно начать отсюда C++ for Kernel Mode Drivers: Pros and Cons.

C уважением,
Геннадий Майко.
Re[3]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 19.02.10 10:10
Оценка: 2 (1) +2
Здравствуйте, MTimur, Вы писали:

C>>C++ в драйверах прекрасно работает с некоторыми ограничениями.

MT>Спасибо. Не подскажите где можно почитать подробнее об этом?
http://www.microsoft.com/whdc/driver/kernel/KMcode.mspx
http://www.codeproject.com/KB/system/excpt.aspx

MT>Простой тест

MT>
MT>    char * a = new char();
MT>

MT>Результат:
MT>

error LNK2019: unresolved external symbol "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) referenced in function _DriverEntry@8

Ну так определи

Вообще, new() без параметров в ядерной разработке противопоказан. Я бы так и оставил его неопределённым и вместо него использовал бы параметрический new.
Sapienti sat!
Re[4]: опять cpp в драйвере...
От: eagersh  
Дата: 19.02.10 18:04
Оценка:
Здравствуйте, Геннадий Майко, Вы писали:

ГМ>Здравствуйте, MTimur,


C>>>C++ в драйверах прекрасно работает с некоторыми ограничениями.


MT>>Спасибо. Не подскажите где можно почитать подробнее об этом?

ГМ>--
ГМ>Можно начать отсюда C++ for Kernel Mode Drivers: Pros and Cons.

ГМ>C уважением,

ГМ>Геннадий Майко.
Мне особенно нравится эта фраза в заключении

"Several of the most insidious problems are extremely difficult to reproduce on demand while testing the driver, so a driver with an inherent unreliability might appear to run for extended periods with no problems and fail at random times. This reinforces the need for careful analysis."

Хотя вроде WDF написанна на С++. Так что наверное не все так плохо с С++.
Re[5]: опять cpp в драйвере...
От: TarasCo  
Дата: 19.02.10 18:59
Оценка:
E>Хотя вроде WDF написанна на С++. Так что наверное не все так плохо с С++.

Интересное явление: фреймворк написанный на С++, который не предоставляет С++ интерфейса )).
Да пребудет с тобою сила
Re[4]: опять cpp в драйвере...
От: gear nuke  
Дата: 21.02.10 07:40
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Я бы так и оставил его неопределённым и вместо него использовал бы параметрический new.


Отказаться от возможности написать
vector<int> v;
?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[5]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 21.02.10 12:17
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>Я бы так и оставил его неопределённым и вместо него использовал бы параметрический new.

GN>Отказаться от возможности написать
vector<int> v;
?

pool_allocator alloc(....);

std::vector<int, pool_allocator> v(alloc);
Sapienti sat!
Re[6]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 06:31
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>
C>pool_allocator alloc(....);

C>std::vector<int, pool_allocator> v(alloc);
C>


Я и не понимаю — ради чего следует отказаться от возможность использовать дефолтный аллокотор и заставлять пользователя писать повсеместно дополнительный код?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[7]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 06:35
Оценка:
В общем пример пока работает против себя.
Сравним 2 варианта:

vector<int> v;

pool_allocator alloc(....);

std::vector<int, pool_allocator> v(alloc);

В каком из случаев можно ответить на вопрос: "в каком пуле аллоцируется память?"
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[8]: опять cpp в драйвере...
От: ononim  
Дата: 22.02.10 08:56
Оценка:
GN>
vector<int> v;

GN>
GN>pool_allocator alloc(....);
GN>std::vector<int, pool_allocator> v(alloc);
GN>

GN>В каком из случаев можно ответить на вопрос: "в каком пуле аллоцируется память?"
В том, который был передан в конструктор pool_allocator'а вместо ... второго варианта
Как много веселых ребят, и все делают велосипед...
Re[7]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 22.02.10 09:00
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>
C>>pool_allocator alloc(....);
C>>std::vector<int, pool_allocator> v(alloc);
C>>

GN>Я и не понимаю — ради чего следует отказаться от возможность использовать дефолтный аллокотор и заставлять пользователя писать повсеместно дополнительный код?
Удобнее контролировать. Случайно сложнее сделать аллокацию из неправильного пула из повышенного IRQL, например.
Sapienti sat!
Re[9]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 10:53
Оценка:
Здравствуйте, ononim,

GN>>В каком из случаев можно ответить на вопрос: "в каком пуле аллоцируется память?"

O>В том, который был передан в конструктор pool_allocator'а

Боюсь, вопрос недопонят, в свете того, что 2 разных экземпляра одного типа должны быть эквивалентны.
pool_allocator nppa(non_paged_pool);
pool_allocator ppa(paged_pool);
assert( ppa == nppa );

20.4.1.2 allocator globals

template <class T1, class T2>
bool operator==(const allocator<T1>&, const allocator<T2>&) throw();

1 Returns: true.


Если есть мысли как сделать такой хитрый конструктор — с радостью послушаю

O>вместо ... второго варианта


Второй вариант — 2 разных не экземпляра, а типа аллокатора. Какие бенефиты даёт запрет неявного использования одного из типов?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[10]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 22.02.10 10:57
Оценка:
Здравствуйте, gear nuke, Вы писали:

GN>Если есть мысли как сделать такой хитрый конструктор — с радостью послушаю

Это в теории, на практике Dinkum STL прекрасно работает со stateful-аллокаторами.
Sapienti sat!
Re[8]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 11:09
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Удобнее контролировать. Случайно сложнее сделать аллокацию из неправильного пула из повышенного IRQL, например.


"Случайно" можно и другой пул написать

Про проверки IRQL, ксати, спасибо за намёк. Как я понял, идея делать их в мемберах аллокатора (это наверное и идеологически правильней — при доступе к памяти). Важно ли для реализации, дефолтный аллокатор или нет? По-моему — не важно.
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[11]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 11:16
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Это в теории, на практике Dinkum STL прекрасно работает со stateful-аллокаторами.


pool_allocator nppa(non_paged_pool);
pool_allocator ppa(paged_pool);
assert( ppa == nppa );

std::vector<int, pool_allocator> vnpp(nppa);
std::vector<int, pool_allocator> vpp(ppa);
vnpp.swap(vpp); // прекрасно?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Re[9]: опять cpp в драйвере...
От: ononim  
Дата: 22.02.10 11:44
Оценка:
GN>Про проверки IRQL, ксати, спасибо за намёк. Как я понял, идея делать их в мемберах аллокатора (это наверное и идеологически правильней — при доступе к памяти). Важно ли для реализации, дефолтный аллокатор или нет? По-моему — не важно.
Дело не только в том на каком IRQL ты обращаешься к памяти. А еще в том в каком пуле обязан лежать тот или иной объект ядра, если для него выделена память. К примеру KeInitializeMutex требует non-paged pool для мутекса (впрочем это общее правило для объектов синхронизации). Кроме того просто тупо может быть ситуация когда память, выделенная на PSASSIVE_LEVEL будет использоваться на DISPATCH_LEVEL. Так что концепция "дефолтового" аллокатора в ядре неприменима.
Как много веселых ребят, и все делают велосипед...
Re[12]: опять cpp в драйвере...
От: Cyberax Марс  
Дата: 22.02.10 12:31
Оценка:
Здравствуйте, gear nuke, Вы писали:

C>>Это в теории, на практике Dinkum STL прекрасно работает со stateful-аллокаторами.

GN>
GN>pool_allocator nppa(non_paged_pool);
GN>pool_allocator ppa(paged_pool);
GN>assert( ppa == nppa );

GN>std::vector<int, pool_allocator> vnpp(nppa);
GN>std::vector<int, pool_allocator> vpp(ppa);
GN>vnpp.swap(vpp); // прекрасно?
GN>

- Доктор, у меня болит когда я делаю вот так!
- Ну так не делайте вот так.


А если серьёзно, то это баг в Стандарте.
Sapienti sat!
Re[13]: опять cpp в драйвере...
От: gear nuke  
Дата: 22.02.10 18:19
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>
C>- Доктор, у меня болит когда я делаю вот так!
C>- Ну так не делайте вот так.
C>

О чём вообще речь? swap совершенно стандартное действие, причём с некоторыми гарантиями. Вот так
Автор: ononim
Дата: 22.02.10
делать не позворляет Стандарт. Вопрос
Автор: gear nuke
Дата: 22.02.10
остался без ответа.

C>А если серьёзно, то это баг в Стандарте.


Если так серьёзно, то что оно делает и в последнем драфте?
.
People who are more than casually interested in computers should have at least some idea of what the underlying hardware is like. Otherwise the programs they write will be pretty weird (c) D.Knuth
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.