windows驱动学习之hello world
2007年11月24日
从今天开始本人要记录下学习驱动的过程。主要目的是给自己以后提供复习的资料。
学习驱动的目的原因很多:一是没有办法,人家让学你就得学,不学就没有工作了,所以硬着头皮也要学。在此基础上给自己一个合理的安慰,那就是学习驱动的人不多,听说学好了也能赚很多钱,所以也给自己学习的动力。
开始了。。。。。。。。。。。。
1。到网上查查人家是怎么学的,是怎么写的。找到应该看得书籍记录如下:
《C程序设计》(第二版) 清华大学出版社 谭浩强
《Windows 2000内部揭密》 机械工业出版社 (美)Mark E.Russinovich著 詹剑锋等译
《Microsoft Windows 驱动程序模型设计》 北京大学出版社 Microsoft公司
《Windows 2000设备驱动程序设计指南》 机械工业出版社 [美]Art Baker,Jerry Lozano著 施诺等译
《WINDOWS NT与WINDOWS 2000设备驱动及开发》 电子工业出版社 [美]Peter G.Viscarola等著 新智工作室译
《WINDOWS WDM设备驱动程序开发指南》 机械工业出版社 [美]Chris Cant 译:孙义 马莉波 国雪飞
《Windows设备驱动程序(VxD与WDM)开发实务》 电子工业出版社 武安河,周利莉
《Windows 核心编程》
《LINUX设备驱动程序》(第二版) 中国电力出版社 ALESSANDRO RUBINI等著 魏永明等译
《Microsoft Windows 2000驱动程序设计指南》(影印版) 北京大学出版社 Microsoft公司
《VC++.NET开发驱动程序详解 ——Windows 2000/XP》 北京希望电子出版社 郭益昆
电子书如下:
《Windows Driver Model》 Walter Oney著 马少华译
《驱动程序超级宝典》 翟洪涛
《The Windows 2000 Device Driver Book》 英文版
2。第一步资料已经差不多收集齐全了,那就开始看吧。在看的同时一定要动手写代码。那么我们就开始写第一个HelloWorld程序吧。
在写代码之前要把程序编译环境构建起来。
需要的环境:WinXP、WinXP DDK(上网下一个然后安装)
1). 新建一个hello.C文件,把如下代码复制进去。
#include <ntddk.h>
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
{
DbgPrint("Hello World!/n");
return STATUS_SUCCESS;
}
2). 程序写完了,开始编译:
在你安装的WinXP DDK 的src文件夹下找一个makefile文件复制到你的程序目录里,然后再新建一个名叫sources的文件,这个文件指明了要编译那些文件和驱动类型。
Sources文件格式如下:
Targetname=hello;驱动名称;
TARGETPATH=obj;目标文件输出路径;
TARGETTYPE=DRIVER
SOURCES=hello.c/ 指定将要用到的所有源文件,每个文件一行
Hello2.c/ (如果有第二个文件)
Hello3.c (如果有第三个文件)
Sources文件写好了。开始编译。从开始菜单的Development Kits->Windows ddk 2006->BuildEnvironments-> Win XP Checked Build Environment 进入DOS模式。
然后从这里进入你的工作目录(hello.c所在的目录) ,然后键入build –c 命令。看看你的工作目录(hello.c所在的目录)是不是多了两个文件obj文件就是sources中TARGETPATH的值。还有objfre这个文件,里面会有一个.sys文件,这就是我们最终要的驱动文件。把这个.sys文件拷贝到系统目录下(具体是:system32/drivers/)
3). 驱动文件编译完成了,下面开始加载这个驱动。
需要在注册表中写个服务来加载这个驱动,
HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services
在上面的目录下新建一项 名字叫hello
在hello中添加如下键值:
ImagePath=systam32/drivers/hello.sys (类型是REG_EXPAND_SZ)
DisplayName=驱动名称(随便写) (类型是REG _SZ)
ErrorControl=1 (类型是REG_DWORD)
Start=3 (类型是REG_DWORD)
Type=1 (类型是REG_DWORD)
服务写好了以后,重启电脑!
4).现在开始启动服务了。
这是就需要一个工具来观察驱动运行的结果,工具叫:Dbgview.exe
首先打开Dbgview.exe,然后运行cmd进入命令行,运行 net start hello,这时在Dbgview.exe中可以看到helloWorld。
PS:感谢作者的文章,从CSDN COPY来的,不错
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/hello]
"ImagePath"=hex(2):73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,64,00,/
72,00,69,00,76,00,65,00,72,00,73,00,5c,00,68,00,65,00,6c,00,6c,00,6f,00,2e,/
00,73,00,79,00,73,00,00,00
"DisplayName"="hello"
"ErrorControl"=dword:00000001
"Start"=dword:00000003
"Type"=dword:00000001
[HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/hello/Enum]
"Count"=dword:00000001
"NextInstance"=dword:00000001
"INITSTARTFAILED"=dword:00000001
"0"="Root//LEGACY_HELLO//0000"
第一项是要加的,后面那项是调用驱动后自动写进注册表的