Sergeivas
Гость
|
|
« : 28-09-2008 10:27 » |
|
Добрый день
Хочу научиться программировать драйвера, заказал книги сейчас вот читаю, и ничего не понимаю. Си немного знаю, программирую микроконтроллеры, до драйверов еще не доходил. Вот про книгу и что непонятно, книга Уолтер Они "использование microsoft WDM" . Непонятно со структурами, точнее, что такое структура, я знаю, если программа на си для микроконтроллера, то структура просто содержит переменные, и как её я назову, так и будет. А здесь структуры с уже определенными именами, например, adddevice, что в них записывать? Если программа на си начинает работать из функции Main(), то откуда начинает работать код в драйвере? Что нужно написать, чтобы подергать каким-нибудь пином в LPT? Понимаю, что очень много вопросов и понимаю, что не бывает простых ответов на сложные вопросы:) Но если будет свободная минутка, напишите что-нибудь, буду очень благодарен.
|
|
« Последнее редактирование: 03-10-2008 16:17 от Алексей1153++ »
|
Записан
|
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
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
|
|
« Ответ #3 : 28-09-2008 18:33 » |
|
про точку входа можно было и сообразить) это DriverEntry... выгрузка - соответственно. просто при загрузке драйвера не создается нового процесса, отсюда такая структура драйвера - как библиотека.
по поводу примера... nmake надо запускать из консоли с заданными переменными окружения. консоль создавать батничком который лежит в Пуск-ДДК-chk XP (не помню дословно... как-то так).
вот не помню make или nmake.... но помоему не build точно) ЗЫ хотя... черт его знает) я в среде MSVC компилю)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы 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
|
|
« Ответ #6 : 01-10-2008 15:43 » |
|
патамушто пример с ошибками... TARGETPATH не прописан
кстати можно и build.exe вызывать оказывыается...
|
|
|
Записан
|
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
|
|
« Ответ #8 : 02-10-2008 18:58 » |
|
в файл sources добавить строку TARGETPATH = obj посмотрие любой пример из DDK. остальное есть в переменный окружения, если вы правильно консоль вызвали. PS примеры у вас на диске лежат в папке C:\WINDDK\3790.1830\src\ если вы их их при установке DDK не отменили
|
|
« Последнее редактирование: 02-10-2008 19:02 от Ochkarik »
|
Записан
|
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
|
|
« Ответ #11 : 14-10-2008 15:05 » |
|
Как подергать ногой "selected"(PIN_13) с помощью функции DERG_NOG()?
нога - чего? функция - что? о чем речь то вообще)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Sla
|
|
« Ответ #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
|
|
« Ответ #14 : 14-10-2008 19:01 » |
|
а что говорит по этому поводу контроллера LPT? и порт 378 обычно... если не ошибаюсь
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Sergeivas
Гость
|
|
« Ответ #15 : 15-10-2008 08:30 » |
|
>а что говорит по этому поводу контроллера LPT? и порт 378 обычно... если не ошибаюсь Что должен говорить контроллер и регистр 0х378 ?
|
|
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #16 : 15-10-2008 09:01 » |
|
Не понимаю. Есть порт данных и порт статуса. В чем проблема? Записать байт в порт данных и все. Для полного счастья еще только в стандартный режим перевести не забыть...
|
|
|
Записан
|
while (8==8)
|
|
|
Ochkarik
|
|
« Ответ #17 : 15-10-2008 09:58 » |
|
Sergeivas, RTFM)
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Sergeivas
Гость
|
|
« Ответ #18 : 15-10-2008 10:40 » |
|
читаю
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы 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
|
|
« Ответ #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 уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Sergeivas
Гость
|
|
« Ответ #22 : 17-10-2008 10:31 » |
|
Теперь понятно. Сейчас читаю книжку солдатова там есть пример драйвера для lpt. вот строчка из драйвера : pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension
pDevExt указатель на структуру PDEVICE_EXTENSION ,а pDevObj указатель на PDEVICE_OBJECT. Это вопрос наверно по синтаксису самого си, но не пойму как это работает. К pDevExt добавится структура pDevObj ?
|
|
|
Записан
|
|
|
|
Ochkarik
|
|
« Ответ #23 : 18-10-2008 10:08 » |
|
это указатель. почитайте по указатели)))) PS а вообще я так понимаю вам ндо начать изучение не с солдатова, а с книжки по Си))))
|
|
|
Записан
|
RTFM уже хоть раз наконец! :[ ну или хотя бы STFW...
|
|
|
Sergeivas
Гость
|
|
« Ответ #24 : 18-10-2008 10:20 » |
|
Одно другому не мешает. Будем читать и Солдатова и Уолтера и про указатель прочитаем.)
|
|
|
Записан
|
|
|
|
|