| 
			| 
					
						| 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.c2.
 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 »  |  | 
 
 Одно другому не мешает. Будем читать и Солдатова и Уолтера и про указатель прочитаем.)
 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |