Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: (DriverWorks) KEvent не инициализируется от хендла переданного из приложения  (Прочитано 6412 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
bams
Гость
« : 30-09-2005 08:54 » 

Не получается создать KEvent для синхронизации приложения с драйвером. В приложении создаю евент и через структуру передаю в драйвер, в драйвере по полученому хендлу инициализирую событие. В документации сказано:

Цитата
...
Form 3
KEvent(
   HANDLE hEvent,
   ACCESS_MASK access =OBJECT_TYPE_ALL_ACCESS
);

A driver uses FORM 3 when the system event object already exists but only the handle of the object is known. The handle can be passed from application code. An application can use the Win32 interface to create an event, and pass the handle to the driver via DeviceIoControl. This allows direct sharing of synchronization events between a driver and an application. The underlying system service for FORM 3 is ObReferenceObjectByHandle.
...
Получается все как бы честно...

Может кто сталкивался? Уж думаю не кривизна ли DriverWorks это?

Вот код в драйвере:

Код:
...
PVOID pBuffer = I.IoctlBuffer();
ULONG inputSize = I.IoctlInputBufferSize();
ULONG outputSize = I.IoctlOutputBufferSize();

I.Information() = 0;

PRADIUS_START_IO sio = reinterpret_cast<PRADIUS_START_IO>(pBuffer);


T<<sio->m_EventRx<<EOL<<sio->m_EventTx<<EOL;


T<<"    Allocate write sync event" << EOL;
m_event_CanWrite = new(NonPagedPool) KEvent((HANDLE)sio->m_EventTx);  // <--- _НЕ_РАБОТАЕТ_

if(m_event_CanWrite)
{
T<<"    Error: Write sync event allocation failed" << EOL;
CleanupIoResources();
return STATUS_UNSUCCESSFUL;


m_event_CanWrite->Set();
...

А вот код софтины:

Код:
...
   FWriteEnabled           = CreateEvent(NULL, true, false, NULL);
  InitializeCriticalSection(&FWriteCriticalSection);

    RADIUS_START_IO startIoSettings;
    bool            result;
    ULONG           returned;

    // Инициализация драйвера на ввод-вывод
    startIoSettings.m_EventRx = FReadEnabled;
    startIoSettings.m_EventTx = FWriteEnabled;

    result = DeviceIoControl(
                    FDeviceHandle,
                    IOCTL_RADIUS_START_IO,
                    &startIoSettings, sizeof(RADIUS_START_IO),
                    NULL, 0,
                    &returned,
                    NULL
                );
...

СПАСАЙТЕ
Записан
Серж
Гость
« Ответ #1 : 30-09-2005 13:57 » 

А заходите в систему с правами администратора? Чтобы передать системный объект драйверу, наверняка нужны права администратора.
Записан
bams
Гость
« Ответ #2 : 30-09-2005 14:19 » 

Права админовские. Пробовал сначала использовать именованые события (вот тут как раз и могут быть грабли с правами доступа), но потом прочитал что предпочтительнее передавать хендл в драйвер из приложения или использовать метод отложеного завершения IRP. Остановился на передаче события. Но видать это все-таки грабли самого драйверверкса Жаль
Вот так то-же не работает:
...
m_event_CanWrite = new(NonPagedPool) KEvent();
m_event_CanWrite->Initialize((HANDLE)sio->m_EventTx);
if(m_event_CanWrite)
{
...
Записан
bams
Гость
« Ответ #3 : 30-09-2005 14:29 » 

Все доперло!!! Блин, пол дня убил!
надо не:
if(m_event_CanWrite) ...
а надо:
if(!m_event_CanWrite) ...
Вопрос снимается Улыбаюсь

Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines