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

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

Добрый день

Хочу научиться программировать драйвера, заказал книги сейчас вот читаю, и ничего не понимаю.
Си немного знаю, программирую микроконтроллеры, до драйверов еще не доходил.
Вот про книгу и что непонятно, книга Уолтер Они "использование microsoft WDM"   .
Непонятно со структурами, точнее, что такое структура, я знаю, если  программа
на си для микроконтроллера, то структура просто содержит переменные, и как её я назову, так
и будет. А здесь структуры с уже определенными именами, например, adddevice, что в них записывать?
Если программа на си начинает работать из функции Main(), то откуда начинает работать
код в драйвере?  Что нужно написать, чтобы подергать каким-нибудь пином в LPT?
Понимаю, что очень много вопросов и понимаю, что не бывает простых ответов на сложные вопросы:)
Но если будет свободная минутка, напишите что-нибудь, буду очень благодарен.
« Последнее редактирование: 03-10-2008 16:17 от Алексей1153++ » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 28-09-2008 11:58 » 

так не бывает - "ничего не понимаю". Поразвёрнутее вопрос задавай - сначала: что пробовал, потом: где споткнулся
Записан

Sergeivas
Гость
« Ответ #2 : 28-09-2008 13:37 » 

Сделал все как тут написано, http://habrahabr.ru/blogs/system_programming/40466/
пока  решил немного поэксперементировать, а потом дальше буду изучать книгу .
Сейчас не собирается файл TestDriver.sys и ошибок ddk не выдает.
вот файл sources
Код:
##################################################
TARGETNAME=TestDriver
TARGETTYPE=DRIVER

SOURCES=TestDriver.c
##################################################
вот makefile
Код:
##################################################
# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source
# file to this component. This file merely indirects to the real make file
# that is shared by all the driver components of the Windows NT DDK
#

! INCLUDE $(NTMAKEENV)\makefile.def
##################################################
вот testdriver.c
Код:
   1. // TestDriver.c
   2. 
   3. #include <ntddk.h>
   4. 
   5. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
   6. VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject);
   7. 
   8. #pragma alloc_text(INIT, DriverEntry)
   9. #pragma alloc_text(PAGE, UnloadRoutine)
  10. 
  11. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  12. {
  13.   DriverObject->DriverUnload = UnloadRoutine;
  14. 
  15.   DbgPrint(«Hello world!\n»);
  16. 
  17.   return STATUS_SUCCESS;
  18. }
  19. 
  20. VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject)
  21. {
  22.   DbgPrint(«Goodbye!\n»);
  23. }


вот что говорит ddk
Код:

C:\driver>build
BUILD: Adding /Y to COPYCMD so xcopy ops won't hang.
BUILD: Object root set to: ==> objchk_wxp_x86
BUILD: Compile and Link for i386
BUILD: Loading C:\WINDDK\3790~1.183\build.dat...
BUILD: Computing Include file dependencies:
BUILD: Done

C:\driver>
файла testdriver.sys негде нет. Пробовал поиск по всем дискам нет его негде.
В папке c:\driver появляется файл buildchk_wxp_x86 в нем написано :
BUILD: Computing Include file dependencies:


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

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

« Ответ #3 : 28-09-2008 18:33 » 

про точку входа можно было и сообразить) это DriverEntry...
выгрузка - соответственно.
просто при загрузке драйвера не создается нового процесса, отсюда такая структура драйвера - как библиотека.

по поводу примера...
nmake надо запускать из консоли с заданными переменными окружения. консоль создавать батничком который лежит в Пуск-ДДК-chk XP (не помню дословно... как-то так).

вот не помню make или nmake.... но помоему не build точно)
ЗЫ хотя... черт его знает) я в среде MSVC компилю)
Записан

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

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

« Ответ #4 : 01-10-2008 11:58 » 

да. все совершенно верно.
запускать надо nmake.exe из консоли
типа C:\WINDOWS\system32\cmd.exe /k C:\DDK\DDK379~1.183\bin\setenv.bat C:\DDK\DDK379~1.183 fre WXP
ссылки лежат в ПУСК->програмы-DDK->Build Environments->
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #5 : 01-10-2008 14:08 » 

nmake тоже вызывает ошибку, "отсутствует makefile error 1064 "

Код:
C:\driver>nmake

Microsoft (R) Program Maintenance Utility   Version 7.00.8882
Copyright (C) Microsoft Corp 1988-2000. All rights reserved.

NMAKE : fatal error U1064: MAKEFILE not found and no target specified
Stop.

C:\driver>
Записан
Ochkarik
Модератор

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

« Ответ #6 : 01-10-2008 15:43 » 

патамушто пример с ошибками...
TARGETPATH не прописан

кстати можно и build.exe вызывать оказывыается...
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #7 : 02-10-2008 13:46 » 

Что нужно прописывать,пути до

Код:
# target path for libraries and objects:
LIBPATH=C:\WINDDK\3790.1830\lib
# directory for include files
INCLUDEDIR=C:\WINDDK\3790.1830\inc

? может есть не нужный makefile для ddk, посмотреть бы что как делать.
Записан
Ochkarik
Модератор

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

« Ответ #8 : 02-10-2008 18:58 » 

в файл sources добавить строку
TARGETPATH = obj
посмотрие любой пример из DDK.
остальное есть в переменный окружения, если вы правильно консоль вызвали.

PS примеры у вас на диске лежат в папке  C:\WINDDK\3790.1830\src\  Что, съел? 
если вы их их при установке DDK не отменили Меня одолевают смутные сомнения
« Последнее редактирование: 02-10-2008 19:02 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #9 : 03-10-2008 13:27 » 

Да точно, все лежит в папке ддк. Буду дальше изучать,если вопрос появится буду писать.
Записан
Sergeivas
Гость
« Ответ #10 : 14-10-2008 08:27 » 

Как подергать ногой "selected"(PIN_13) с помощью функции DERG_NOG()?

Код:


#include "ntddk.h"

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
void UnloadRoutine(IN PDRIVER_OBJECT DriverObject);

NTSTATUS DERG_NOG();



 #pragma alloc_text(INIT, DriverEntry)
 #pragma alloc_text(PAGE, UnloadRoutine)


NTSTATUS DERG_NOG(    )
{



    return STATUS_SUCCESS;
}


NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
   DriverObject->DriverUnload = UnloadRoutine;

  DbgPrint("Hello world!\n");

   return STATUS_SUCCESS;
 }

void UnloadRoutine(IN PDRIVER_OBJECT DriverObject)
 {
   DbgPrint("Goodbye!\n");
 }



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

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

« Ответ #11 : 14-10-2008 15:05 » 

Как подергать ногой "selected"(PIN_13) с помощью функции DERG_NOG()?
нога - чего? функция - что? о чем речь то вообще)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sla
Команда клуба

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

WWW
« Ответ #12 : 14-10-2008 15:09 » 

Ochkarik, "ногой" lpt (13 pin)

Как-будто ты не в теме Улыбаюсь
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sergeivas
Гость
« Ответ #13 : 14-10-2008 15:20 » 

>нога - чего? функция - что? о чем речь то вообще)
нога : имел ввиду номер вывода на разъеме lpt  порта, подергать: имел ввиду изменять уровень с 1 на 0,
с помощью функции :  имел ввиду, что нужно написать в функции NTSTATUS DERG_NOG() чтобы она могла изменять уровень
на этом выводе. Сейчас читаю и смотрю примеры из ddk и всякие статьи из инета , но хотелось бы простой пример посмотреть.



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

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

« Ответ #14 : 14-10-2008 19:01 » 

а что говорит по этому поводу контроллера LPT? и порт 378 обычно... если не ошибаюсь
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #15 : 15-10-2008 08:30 » 

>а что говорит по этому поводу контроллера LPT? и порт 378 обычно... если не ошибаюсь
Что должен говорить контроллер и регистр 0х378 ?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #16 : 15-10-2008 09:01 » 

Не понимаю. Есть порт данных и порт статуса. В чем проблема? Записать байт в порт данных и все. Для полного счастья еще только в стандартный режим перевести не забыть...
Записан

while (8==8)
Ochkarik
Модератор

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

« Ответ #17 : 15-10-2008 09:58 » 

Sergeivas, RTFM)
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #18 : 15-10-2008 10:40 » 

читаю  С ума сойти...
Записан
Ochkarik
Модератор

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

« Ответ #19 : 15-10-2008 12:21 » 

http://www.esavitsky.narod.ru/article/article2.htm
Регистр состояния (BASE+1): биты 0-2 не используются,

Бит  Ножка         Назначение
7    11 (не инв.)  0 – занят.

PS
4    13 (не инв.)  1 – зависит от принтера.
 
« Последнее редактирование: 15-10-2008 12:25 от Ochkarik » Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #20 : 16-10-2008 09:32 » 

спасибо Улыбаюсь

Вот еще возник вопрос в процессе чтения Улыбаюсь :

Код:
static NTSTATUS DispatchRead   ( IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp );

Что такое IN PDEVICE_OBJECT или IN PIRP.
Подозреваю что это макроопределение, но что они означают Unsigned chal или int ?
Сколько их всего. Помогите разобраться с этим вопросом.
Записан
Ochkarik
Модератор

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

« Ответ #21 : 16-10-2008 14:59 » 

IN - (а так же OUT и INOUT) - пустой дефенишн, для удобства различения входных выходных переменных.

PDEVICE_OBJECT - указатель на структуру описывающую экземпляр устройства (например для двух одинаковых устройств код обработки может быть один, поэтому устройства надо как-то различать). поэтому обозвали объектом....

PIRP - (I/O request packet). драйвера обмениваются запросами в неком стандартном формате. PIRP - указатель на структуру описывающую запрос ввода вывода. например, когда вы вызваете API ReadFile() - тоже формируется запрос IRP с кодом IRP_MJ_READ, который запрашивает у драйвера файловой системы новые данные.

при регистрации драйвера, (функция DriverEntry) заполняется таблица обработчиков стандартных запросов. далее они вызываются менеджером запросов напрямую по этой таблице.
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #22 : 17-10-2008 10:31 » 

Теперь понятно.
Сейчас читаю  книжку солдатова там есть пример драйвера для lpt.
вот строчка из драйвера :
Код:
pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension
pDevExt указатель на структуру PDEVICE_EXTENSION ,а pDevObj указатель на PDEVICE_OBJECT.
Это вопрос наверно по синтаксису самого си, но не пойму как это работает.
К pDevExt добавится структура pDevObj ?
Записан
Ochkarik
Модератор

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

« Ответ #23 : 18-10-2008 10:08 » 

это указатель. почитайте по указатели))))
PS а вообще я так понимаю вам ндо начать изучение не с солдатова, а с книжки по Си))))
Записан

RTFM уже хоть раз наконец!  RTFM :[ ну или хотя бы STFW...
Sergeivas
Гость
« Ответ #24 : 18-10-2008 10:20 » 

Одно другому не мешает. Будем читать и Солдатова и Уолтера и про указатель прочитаем.)
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines