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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как открыть Event?  (Прочитано 6061 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Detsel
Гость
« : 01-07-2005 11:39 » 

Собственно такой вопрос: в user mode процессе создаю событие. В драйвере мне нужно его открыть и выставить. Нарыл как выставлять и как работать с этим Event в драйвере, но аналога OpenEvent не могу найти в DDK. Заранее спасибо!!!
Записан
Серж
Гость
« Ответ #1 : 01-07-2005 15:46 » 

Это делают функции IoCreateNotificationEvent или IoCreateSinchronizationEvent и затем
KeInitializeEvent. Смотри описание этих функций в DDK.
В DriverStudio есть класс KEvent, который при инициализации вызывает эти функции,
для этих классов есть исходники.
Записан
Detsel
Гость
« Ответ #2 : 04-07-2005 06:46 » 

Серж, спасибо. Я за выходные, пока не было нета, нарыл таки в ддк эти функции. Но меня терзает еще один вопрос. Если событие создается в User mode откроется ли оно в Kernel mode? Потому что пока я не могу получить нормальный указатель на Event(непустой). Спасибо.
Записан
Серж
Гость
« Ответ #3 : 04-07-2005 07:32 » 

Detsel, конечно, откроется. Еще один способ - просто передать handle открытого в приложении события через DeviceIOControl.

Вот тебе текст из DriverStudio:
Signaling an Application from a Kernel Mode Driver
Sometimes a driver needs to signal an application. There are at least three ways to do this:

Method 1
The application makes a DeviceIoControl to the driver. The driver returns STATUS_PENDING. When the event occurs, the driver completes the IRP. The thread returns from the DeviceIoControl call and handles the event.

// sample class declaration
class MyDevice : public KDevice
{
   public:
     MyDevice();
     VOID EventHandler(void);
     DEVMEMBER_DISPATCHERS
     DEVMEMBER_CANCELIRP (MyDevice, CancelSignalIrp);
     KIrp m_IrpToCompleteToSignalEvent;
   };
 
// Handler for Device Control requests
NTSTATUS MyDevice::DeviceControl(KIrp I)
{
   switch (I.IoctlCode())
   {
     case MYDEVICE_IOCTL_SETUP_SIGNAL:
       CancelSpinLock::Acquire();
       I.SetCancelRoutine(LinkTo(CancelSignalIrp));
       m_IrpToCompleteToSignalEvent = I;
       CancelSpinLock::Release();
       
       return STATUS_PENDING;
       break;
       . . .
     }
}
 
// cancel routine for the signal IRP
VOID MyDevice::CancelSignalIrp(KIrp I)
{
   m_IrpToCompleteToSignalEvent = KIrp(NULL);
   I.Information() = 0;
   CancelSpinLock::Release(I->CancelIrql);
   I.Complete(STATUS_CANCELLED);
}
 
// Routine that completes the IRP to signal the event
// to the application. Not callable at IRQL > DISPATCH_LEVEL.
VOID MyDevice::EventHandler(void)
{
   KIrp I = m_IrpToCompleteToSignalEvent;
   m_IrpToCompleteToSignalEvent = KIrp(NULL);
   I.Information() = 0;
   I.Complete(STATUS_SUCCESS);
}

Method 2
The application creates an event object, and passes the handle to the driver via DeviceIoControl. The driver obtains an object pointer for the event, which it can then set or reset.

Note that the thread handle is specific to the calling process. Therefore, this method can only be used for monolithic or highest level drivers.

// sample class declaration
class MyDevice : public KDevice
{
   public:
     MyDevice();
     VOID EventHandler(void);
     KEvent * m_pEventToSignal;
   };
 
// Handler for Device Control requests
NTSTATUS MyDevice::DeviceControl(KIrp I)
{
   switch (I.IoctlCode())
   {
     case MYDEVICE_IOCTL_SETUP_SIGNAL:
       // app passes event handle in input buffer
       HANDLE hEvent = *(HANDLE*)I.IoctlBuffer();
       m_pEventToSignal = new(NonPagedPool) KEvent(hEvent);
       NTSTATUS status = (m_pEventToSignal != NULL) :
         STATUS_SUCCESS ?
         STATUS_INSUFFICIENT_RESOURCES;
       return I.Complete(status);
       break;
       . . .
     }
}
 
// Routine signals the event to the application.
// Not callable at IRQL > DISPATCH_LEVEL.
VOID MyDevice::EventHandler(void)
{
   m_pEventToSignal->Set(); // or Pulse
}

Method 3
Note:  This method is not available in versions of Windows NT earlier than 4.0.

Create a named event.

#define APP_EVENT_NAME "SynchEvent"
#define DRIVER_EVENT_NAME L"\\BaseNamedObjects\\SynchEvent"
 
// Application code
hEvent = OpenEvent(SYNCHRONIZE, FALSE, EVENT_NAME);
// The driver must have already created the event in
// order for this to succeed. If you want the app to
// create the event, use CreateEvent instead of OpenEvent.
// If the user is not privileged, it is required to
// create the event in the application.
 
// Driver Initialization Code
KEvent* m_pSynchEvent = new (NonPagedPool) KEvent(
   KUstring(DRIVER_EVENT_NAME),SynchronizationEvent);
m_pSynchEvent->Clear(); // initially signaled
 
// The following code signals the event
m_pSynchEvent->Set();

 
Записан
Detsel
Гость
« Ответ #4 : 04-07-2005 07:46 » 

Серж, спасибо. Я решил свою проблему. Все было как всегда из за недостатка инфы =) Имя события указывал не верно. Без \\BaseNamedObjects\\. Спасибо за помощь!
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines