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

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

народ, помоги плз... я понимаю что я чего-то не понимаю, но чего я не понимаю я ещё не понимаю...
хочу сделать "драйвер" который будет писать/читать данные в порт 378h (LPT Data), читать из порта состояние устройства (LPT Status), писать/читать в порт управления (LPT Control)
делаю DriverEntry... там пишу следующее
DriverObject->DriverUnload = DrvUnload;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DrvCtl;
пишу, но не понимаю почему пишу... ))) смешно не так ли... мне надо чтобы польз. программа делала
DeviceIOControl где в параметрах был бы указатель на вх. буфер и вых. буфер и собственно сам IOCTL_readData (к примеру)
и как мне в драйвере получить указатель на этот буфер?? и как собственно с ним работать??
Да и как мне вообще можно будет связаться с этим драйвером?
Нужно ли мне делать IoCreateDevice, и при Unloadе IoDeleteDevice ??
Нужно ли мне делать IoCreateSymbolicLink, IoDeleteSymbolicLink ??

главный вопрос:
Как мне получить параметры DeviceIoControl'a в самом драйвере, т.е.
NTSTATUS DrvCtr(PDEVICE_OBJECT devobj,PIRP irp)
{
PVOID InBuf=???,OutBuf=???;
ULONG ControlCode=???;

switch (ControlCode) {
case IOCTL_readByte:
__asm {
   mov dx,378h
   out dx,al
   mov ebx,OutBuf
   mov [ebx],al
   }
return STATUS_SUCCESS;
case IOCTL_writeByte:
...
...
...
default:
   return STATUS_INVALID_DEVICE_REQUEST;
}
}


Извините за столь тупорылые вопросы. но я уже совсем... того...
Заранее спасибо...
« Последнее редактирование: 16-12-2007 17:04 от Алексей1153++ » Записан
Ochkarik
Модератор

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

« Ответ #1 : 06-11-2005 13:56 » 

нееее... так дело не пойдет)
поимей DriverStudio 3.1 желательно... делает замечательные РЫБЫ. там правда много лишнего... но сильно поможет.
и второе: полистай примеры из DDK.... там очень много полезного.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
acc15
Гость
« Ответ #2 : 06-11-2005 14:37 » 

DriverStudio 3.0 имеется... крякнутый и т.п.
всё имеется кроме знаний )))

Просто не хочется тратить 3 дня на поиск 1 строки
Записан
Ochkarik
Модератор

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

« Ответ #3 : 06-11-2005 15:47 » 

Нужно ли мне делать IoCreateDevice, и при Unloadе IoDeleteDevice ??
Нужно ли мне делать IoCreateSymbolicLink, IoDeleteSymbolicLink ??

да. по IoCreateDevice - у тебя создается объект драйвера и собстенно к нему ты будешь в дальнейшем обращатся.
IoDeleteDevice - в анлоаде обязательно.
IoCreateSymbolicLink - создается символическая ссылка по которой ты будешь обращатся к драйверу из приложений (CreateDevice)
запусти студию... драйвер-визард:
Сгенери рыбу. параметры:
выбираешь в начале - чистый Си!!!! (без классов и плюсов - последний, чтоб не заморачиваться)
тип проекта кернел-сервис
обработка IRP - по умолчанию (IRP_MJ_Креат/Клосе, Реад/Врайт,IOControl - если захочешь)
Io- символик-линк укажи какой надо.
все остальное как есть...
(по умолчанию у тебя и тестовая апликуха будет)

потом в коде найди обработку запросов Read и Write и их перепишешь на твой реад/врите порт. (READ_PORT_ULONG|WRITE_PORT_ULONG макросы)
IRP_MJ_READ|WRITE - это как раз ReadFile WriteFile из апликухи. - если все просто - используй их и не связывайся с ИОКонтролами.
/////если все таки нужны девайсИОконтролы - соответственно. там впиши в список (вызываются DeviceIOControl)
вызов - CreateDriver() потом Write/Read. в тестовой апликухе - должно быть....
при выходе CloseHandle
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
acc15
Гость
« Ответ #4 : 06-11-2005 17:23 » 

Цитата
главный вопрос:
Как мне получить параметры DeviceIoControl'a в самом драйвере, т.е.
Код:
NTSTATUS DrvCtr(PDEVICE_OBJECT devobj,PIRP irp)
{
PVOID InBuf=??,OutBuf=??;
ULONG ControlCode=??;

На половину своих вопросов я уже нашёл ответ, но один я так и не понял.... ГДЕ ВЗЯТЬ ВХОДНОЙ БУФЕР?Не понял

Код:
ControlCode = IrpStack->Parameters.DeviceIoControl.IoControlCode;
ULONG InBufSize = IrpStack->Parameters.DeviceIoControl.InputBufferLength;
ULONG OutBufSize = IrpStack->Parameters.DeviceIoControl.OutputBufferLength;
ULONG Method = ControlCode & 0x03;
PVOID InBuf,OutBuf;
if (Method == METHOD_BUFFERED)
   OutBuf = Irp->AssociatedIrp.SystemBuffer;
else
   OutBuf = Irp->UserBuffer;

InBuf = ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??

если читать из OutBuf'a то всё работает, но ради правильности входные данные должны быть входными а не и тем и другим...
« Последнее редактирование: 16-12-2007 17:04 от Алексей1153++ » Записан
Ochkarik
Модератор

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

« Ответ #5 : 07-11-2005 09:49 » 

с этим рекомендую не заморачиваться если у тебя нет пересылки больших объемов данных из приложения/дравера.
используй METHOD_BUFFERED, когда определяешь IOCTL_коды вызова. макрос для определения - CTL_CODE()
В этом случае у тебя система сама формирует промужутоный буфер размера max(входной, выходной) и копирует в него входные параметры IOControl-а
Указатель у тебя будет один Irp->AssociatedIrp.SystemBuffer.
при этом при входе в функцию обработки ты из него выгребаешь входные параметры.
а перед тем как выйдти в него же записываешь выходные. размер записанных, выходных данных указываешь в
Irp->IoStatus.Information = sizeof(выходная структура)  -обязательно.
выходные параметры будут скопированы в апликуху.
Юра.
« Последнее редактирование: 07-11-2005 11:02 от Ochkarik » Записан

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

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines