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

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Необычная ошибка при написании драйвера !  (Прочитано 11774 раз)
0 Пользователей и 1 Гость смотрят эту тему.
buisyhanh
Постоялец

vn
Offline Offline

« : 30-09-2008 10:35 » 

Тут я хотел установить связь между Приложением и Драйвером:
В приложение написал так:

HANDLE hEvent = CreateEvent(......);   // Create Event Object
DeviceIoControl(....,&hEvent,....);        //Send down the Handle of Event Object to Driver

В драйвер напипал таким образом:

HANDLE hEvent=*(PHANDLE)pIrp->AssociatedIrp.SystemBuffer; // as Event object

      g_hEvent = hEvent;

      KEVENT kEvent;

      iStatus = ObReferenceObjectByHandle(                                             //Create reference to Event Object with Application
                           g_hEvent,                           //Handle as Event Object
                           EVENT_MODIFY_STATE,   //Can Modify Event Object state
                           *ExEventObjectType,           //Type of event object. if File object - *IofileObjectType
                           pIrp->RequestorMode,   //UserMode or KernelMode. If KernelMode - Set Previuos parameter to NULL
                             &kEvent,                          //Global pointer to Event object
                           NULL
                           );
 Когда откомпилировал этот код то появился ошибки:
<quote>
1>dispatch.c(96) : error C2275: 'KEVENT' : illegal use of this type as an expression
1>dispatch.c(96) : error C2146: syntax error : missing ';' before identifier 'kEvent'
1>dispatch.c(96) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
1>dispatch.c(96) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
1>dispatch.c(96) : error C2143: syntax error : missing ';' before 'identifier'
1>dispatch.c(96) : error C2065: 'kEvent' : undeclared identifier
1>dispatch.c(99) : error C2275: 'HANDLE' : illegal use of this type as an expression
1>dispatch.c(99) : error C2146: syntax error : missing ';' before identifier 'hEvent'
1>dispatch.c(99) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
1>dispatch.c(99) : error C2144: syntax error : '<Unknown>' should be preceded by '<Unknown>'
1>dispatch.c(99) : error C2143: syntax error : missing ';' before 'identifier'
1>dispatch.c(99) : error C2065: 'hEvent' : undeclared identifier
1>dispatch.c(99) : error C4047: '=' : 'int' differs in levels of indirection from 'HANDLE'
1>dispatch.c(100) : error C4047: '=' : 'HANDLE' differs in levels of indirection from 'int'
1>dispatch.c(101) : error C4013: 'iStatus=ObReferenceObjectByHandle' undefined;assuming extern returning int
1>dispatch.c(106) : error C3209: '' : Unicode identifiers are not yet supported
1>dispatch.c(106) : error C2065: '' : undeclared identifier
1>dispatch.c(110) : error C2065: 'g_pEvent' : undeclared identifier
1>dispatch.c(110) : error C4047: 'function' : 'PRKEVENT' differs in levels of indirection from 'int'

</qoute>

Как это разобраться. Вообще не видел где определить KEVENT.
Кто может разобраться в этом фрагменте скажите пожалуйста.

Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 30-09-2008 14:41 » 

Код:
      PKEVENT pkEvent; 
      iStatus = ObReferenceObjectByHandle(                                             //Create reference to Event Object with Application
                           g_hEvent,                           //Handle as Event Object
                           EVENT_MODIFY_STATE,   //Can Modify Event Object state
                           *ExEventObjectType,           //Type of event object. if File object - *IofileObjectType
                           KernelMode,   //UserMode or KernelMode. If KernelMode - Set Previuos parameter to NULL
                           (PVOID*)&pkEvent,                          //Global pointer to Event object
                           NULL
                           );

PS В данном случае память под структуру KEVENT размещается вызовом CreateEvent в приложении. А вам нужн указатель на эту структуру.
« Последнее редактирование: 30-09-2008 14:48 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #2 : 30-09-2008 15:41 » 

<b>Ochkarik </b>
PS В данном случае память под структуру KEVENT размещается вызовом CreateEvent в приложении. А вам нужн указатель на эту структуру.

Как это выглядит, ведь при копилировании драйвера не имеет никаокй зависимоть с компилированием приложения.
Записан
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #3 : 30-09-2008 16:06 » 

In Application as:

HANDLE <b> hEvent </b> = CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
                      // pointer to security attributes
  BOOL bManualReset,  // flag for manual-reset event
  BOOL bInitialState, // flag for initial state
  LPCTSTR lpName      // pointer to event-object name
);

BOOL DeviceIoControl(
  HANDLE hDevice,              // handle to device of interest
  DWORD dwIoControlCode,       // control code of operation to perform
  LPVOID lpInBuffer,           // pointer to buffer to supply input data //Here as:<b> &hEvent </b>
  DWORD nInBufferSize,         // size, in bytes, of input buffer
  LPVOID lpOutBuffer,          // pointer to buffer to receive output data
  DWORD nOutBufferSize,        // size, in bytes, of output buffer
  LPDWORD lpBytesReturned,     // pointer to variable to receive byte count
  LPOVERLAPPED lpOverlapped    // pointer to structure for asynchronous operation
);
 
Мы должны использовать &hEvent как параметр и он сохранится в Irp->Associated.SystemBuffer.

а в драйвере:

HANDLE hEvent=(PHANDLE)pIrp->AssociatedIrp.SystemBuffer; // as Event object

      g_hEvent = hEvent;

      KEVENT kEvent;

      iStatus = ObReferenceObjectByHandle(        //Create reference to Event Object with Application
                           g_hEvent,              //Handle as Event Object
                           EVENT_MODIFY_STATE,   //Can Modify Event Object state
                           *ExEventObjectType,    //Type of event object. if File object - *IofileObjectType
                           pIrp->RequestorMode,   //UserMode or KernelMode. If KernelMode - Set Previuos parameter to NULL
                             &kEvent,              //Global pointer to Event object
                           NULL
                           );

Не знаю откуда взялась такая обшибка. что 'KEVENT' : illegal use of this type as an expression.
Записан
Basurman
Опытный

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 30-09-2008 16:28 » 

А как с синтаксисом строк:
 g_hEvent = hEvent;
KEVENT kEvent;
И наверное лучше не дублироать имена?
« Последнее редактирование: 30-09-2008 16:30 от Basurman » Записан
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #5 : 30-09-2008 16:40 » 

А как с синтаксисом строк:
 g_hEvent = hEvent;
KEVENT kEvent;
И наверное лучше не дублироать имена?

Дела не в этом, просто я хотел использовать ее Глобальной. Но здесь не работает схема связи и не разпознать  KEVENT kEvent.
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 30-09-2008 18:11 » 

1. по поводу PKEVENT - читайте документацию пожалуйста: http://msdn.microsoft.com/en-us/library/ms802942.aspx
2. а по ошибке - не включен заголовочный файл. какой - см документацию.  видимо это один из файлов Wdm.h, Ntddk.h, Ntifs.h

в остальном идея правильная.
исправьте ошибку с PKEVENT
"Object
Pointerto a variable that receives a pointer to the object's body. The following table contains the pointer types.".
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #7 : 01-10-2008 02:55 » 

1. по поводу PKEVENT - читайте документацию пожалуйста: http://msdn.microsoft.com/en-us/library/ms802942.aspx
2. а по ошибке - не включен заголовочный файл. какой - см документацию.  видимо это один из файлов Wdm.h, Ntddk.h, Ntifs.h

в остальном идея правильная.
исправьте ошибку с PKEVENT
"Object
Pointerto a variable that receives a pointer to the object's body. The following table contains the pointer types.".
1. по поводу PKEVENT - читайте документацию пожалуйста: http://msdn.microsoft.com/en-us/library/ms802942.aspx
2. а по ошибке - не включен заголовочный файл. какой - см документацию.  видимо это один из файлов Wdm.h, Ntddk.h, Ntifs.h

в остальном идея правильная.
исправьте ошибку с PKEVENT
"Object
Pointerto a variable that receives a pointer to the object's body. The following table contains the pointer types.".

я исправил эти обшибки, это Unicode characters совмещает вместе с ANSI  Когда я скопировал переменые. Переделал и все нормально.

Ну у меня опять новая проблема:

 Хотел передать массив через DeviceIoControl parameter в Драйвер. Но как получить этот массив в Драйвер.
 Я делал так:
 Создая массив в драйвере и присвоить Associated.SystemBuffer к этому массиву.
 Нпр: g_kEnTable=(KENTABLE) pIrp->AssociatedIrp.SystemBuffer
 где:g_kEnTable - это массив типа KENTABLE c 51 элементов, а pIrp->AssociatedIrp.SystemBuffer - как указно - PVOID.
 
 - Полученны обшибки: error C2440: 'type cast' : cannot convert from 'PVOID' to KENTABLE.
 
 Как можно перевести тип для соглосования Не понял?
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 01-10-2008 13:04 » 

ересь Быть такого не может
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
buisyhanh
Постоялец

vn
Offline Offline

« Ответ #9 : 02-10-2008 04:17 » 

Ладно я исправил все, написал драйвер но систеный красс был и мертвый экран появится, наверно нужно снова переписать драйвер
Записан
Ochkarik
Модератор

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 02-10-2008 08:13 » 

выкладывайте код драйвера целиком...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines