驱动开详解的驱动编译环境的设置方法
- 格式:doc
- 大小:33.00 KB
- 文档页数:2
内核驱动的单独编译是指将内核驱动程序从内核源代码中分离出来,进行单独的编译和安装。
这样做可以方便地对驱动程序进行升级和维护,同时也可以避免因内核版本升级而导致的驱动不兼容问题。
要实现内核驱动的单独编译,可以按照以下步骤进行操作:
1. 获取内核源代码:首先需要获取对应版本的内核源代码,可以从官方网站或开源社区下载。
2. 创建驱动模块:在内核源代码的基础上,创建所需的驱动模块。
可以使用内核提供的工具和API来实现。
3. 配置内核:对内核进行配置,以启用所需的驱动模块。
可以使用内核提供的配置工具来进行配置,也可以手动编辑配置文件。
4. 编译内核:对配置后的内核进行编译,生成可执行文件。
可以使用内核提供的编译工具来完成。
5. 安装驱动模块:将编译好的驱动模块安装到系统中,可以使用内核提供的工具来完成。
6. 加载驱动模块:在系统运行时加载驱动模块,使其生效。
可以使用命令行工具来完成。
需要注意的是,内核驱动的单独编译需要具备一定的Linux系统和内核开发经验,同时需要了解驱动程序的原理和实现方式。
如果遇到问题,可以参考官方文档或寻求社区的帮助。
一准备DDK版本:Windows DDK 3790IDE:Visual Studio 2005二用DDK环境编译驱动这种编译驱动的办法是DDK文档中所提倡的办法。
此种方法需要编写一个编译脚本文件,在这个脚本中描述了DDK驱动程序的源文件、用到的lib文件和include路径名、编译输出的目录和文件名等信息。
编写此类脚本对于Windows程序员可能比较陌生,尤其是当源文件较多时,编写脚本文件可能显得更如麻烦。
在源程序的相同目录下创建两个文件makefile和Sources,这两个文件都是文本文件,内容如下。
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.defSources这个文件参考实际情况修改!if "$(DDK_TARGET_OS)"=="Win2K"TARGETNAME=Passthru_2000!elseif "$(DDK_TARGET_OS)"=="WinXP"TARGETNAME= Passthru _XP!elseif "$(DDK_TARGET_OS)"=="WinNET"TARGETNAME= Passthru _03Server!endifTARGETPATH=objTARGETTYPE=DRIVERC_DEFINES=$(C_DEFINES) -DNDIS_MINIPORT_DRIVER -DNDIS_WDM=1!if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="Win2K"## The driver is built in the Win2K build environment#C_DEFINES=$(C_DEFINES) -DNDIS40_MINIPORT=1C_DEFINES=$(C_DEFINES) -DNDIS40=1!else## The driver is built in the XP or .NET build environment# So let us build NDIS 5.1 version.#C_DEFINES=$(C_DEFINES) -DNDIS51_MINIPORT=1C_DEFINES=$(C_DEFINES) -DNDIS51=1!endif# Uncomment the following to build for Win98/SE/WinMe# This causes several APIs that are not present in Win9X to be# ifdef'ed out.# C_DEFINES=$(C_DEFINES) -DWIN9X=1PRECOMPILED_INCLUDE=precomp.hPRECOMPILED_PCH=precomp.pchPRECOMPILED_OBJ=precomp.obj!if !defined(DDK_TARGET_OS) || "$(DDK_TARGET_OS)"=="Win2K"TARGETLIBS=$(DDK_LIB_PATH)\ndis.lib \$(DDK_LIB_PATH)\ntstrsafe.lib!elseTARGETLIBS=$(DDK_LIB_PATH)\ndis.lib!endifUSE_MAPSYM=1INCLUDES=SOURCES=\miniport.c \passthru.c \passthru.rc \protocol.c \PTEXTEND.C \filter.c前7行说明此驱动的名称,这里用到了宏来控制不同操作系统版本的编译所需的文件,$(DDK_TARGET_OS)是从外面的命令行传递进来的。
Windows驱动程序开发笔记一、WDK与DDK环境最新版的WDK 微软已经不提供下载了这里:https:/// 可以下并且这里有好多好东东!不要走进一个误区:下最新版的就好,虽然最新版是Windows Driver Kit (WDK) 7_0_0,支持windows7,vista 2003 xp等但是它的意思是指在windows7操作系统下安装能编写针对windows xp vista的驱动程序,但是不能在xp 2003环境下安装Windows Driver Kit (WDK) 7_0_0这个高版本,否则你在build的时候会有好多好多的问题.上文build指:首先安装好WDK/DDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库如果你是要给xp下的开发环境还是老老实实的找针对xp的老版DDK吧,并且xp无WDK 版只有DDK版build自己的demo 有个常见问题: 'jvc' 不是内部或外部命令,也不是可运行的程序。
解决办法:去掉build路径中的空格。
二、下载 WDK 开发包的步骤1、访问Microsoft Connect Web site站点2、使用微软 Passport 账户登录站点3、登录进入之后,点击站点目录链接4、在左侧的类别列表中选择开发人员工具,在右侧打开的类别:开发人员工具目录中找到Windows Driver Kit (WDK) and Windows Driver Framework (WDF)并添加到您的控制面板中5、添加该项完毕后,选择您的控制面板,就可以看到新添加进来的项了。
客户端DDK编译环境配置说明概要文档主要说明DDK编译环境的部署,如何使用该环境进行客户端代码的编译,环境中一些主要命令、如何扩展一些命令。
以及在从VC环境下移植过来后,代码需要改进的一些描述。
文章将着重对相关模块下的sources makefile进行描述。
主要分以下五个部分,各个部分的详细叙述请参见各章节。
1.DDK build server的部署2.DDK环境目录的介绍3.DDK编译工具和操作介绍4.编译过程描述以及tang工程编译分析5.VC源代码移植一些常见编译错误6.一些遗留移植和完善工作DDK build server的部署DDK build server是指存在ddk build环境的服务器,可供每个开发人员下载到自己的开发机器,经过简单的配置就能成为本地ddk编译换进的一套机制。
DDK build server可供公司各个项目组使用,方便的下载,配置并执行编译功能。
目前没有ddk build server部署,大家可以从机器192.168.12.103的共享目录中进行下载。
DDK环境目录的介绍从上图中可以看到红圈标识的几个文件和文件夹,下面一一进行介绍:Bin目录:包含了对应系统平台下的整个环境的工具和编译命令,已经进行环境设置的bat 等。
例如:cl.exe,mc.exe,midl.exe,rc.exe包括编译命令build.exe等。
Inc目录:包含了整个环境中的头文件,其中包含的子目录crt,atl,wtl,ddk,api,mfc等包含了各种不同编程框架,crt以及系统sdk的头文件。
各个子目录都,对应与相应的环境变量一一对应:Crt $( CRT_INC_PATH) = ddk下载目录\inc\crtSdk $( SDK_INC_PA TH)= ddk下载目录\inc\apiWtl $( WTL_INC_PA TH)= = ddk下载目录\inc\wtl80…Lib目录:包含了整个编译环境下的所有lib文件(除用户lib),其中包含的子目录atl,crt,mfc,以及不同操作系统对应的库目录。
VC6编译驱动的⽅法(含32和64位)VC6只是⼀个IDE,可以⽅便的调⽤编译器,链接器,头⽂件,库⽂件,如果编辑和编译驱动能集成在⼀起,这样可以提⾼开发效率。
对于普通的Win32应⽤程序,VC6已经默认⽀持了,⽽对于驱动程序没有设定好的⼯程向导。
其实驱动程序也就是⼀个sys,是通过c语⾔写成,所以编译它理论上没有问题,只是在实际操作上有点⿇烦。
下⾯就来说明⼀下各种平台编译sys驱动的⽅法(包括64位平台)先看32位版本驱动的编译⽅法,⾸先你得准备⼀些编译必备⼯具:1.要安装VC62.安装DDK(装哪个呢?这个问题其实很简单的,只是很多⼈不明⽩,装DDK当然是越新越好了,越新⽀持的平台越多,像2000DDK你是绝对编译不出来64位sys的,因为它没带64位的库和编译器,所以我们选择现在最⽐较新的,2003DDK(WDK也可以),⽀持的平台很多,AMD64,IA64,2000,XP,2003都⽀持)。
好了,这下我们的系统已经安装了最强的开发⼯具VC6,最新DDK,在VC⾥编译各个平台的驱动都没有问题了!开始,假设我们的DDK装在C:/2003DDK⽬录,那么我会发现⾥⾯有很多驱动的例⼦(安装的时候全选),我们选择C:/2003DDK/src/wdm/usb/bulkusb作为我们的实验范例。
第⼀步:打开VC,建⽴⼀个Win32 Application⼯程,然后选择An empty Project(我⽤英⽂版的VC,建议你也换成英⽂版的),意思就是建⽴⼀个空的Win32⼯程,⼯程名字就叫bulkusb,点Finish.第⼆步:将C:/2003DDK/src/wdm/usb/bulkusb/sys(这⾥是驱动代码,另⼀个exe⾥是⽤户程序,不管它)⾥的所有⽂件拷贝到bulkusb⼯程⽬录下。
然后把.h,.c,.rc 导⼊到VC⾥对应的⽬录⾥⾯去。
第三步:然后就是开始设置⼯程选项,把这些代码编译成sys了。
IAR编译环境的配置是相当重要的,没配置正确或者不符合自己的习惯的话,使用起来就会很麻烦。
下面我根据网上的经验和资料,以及自己摸索和大家共同探讨下IAR的配置。
我第一次打开IAR环境的时候,发现工作区有明显分层现象。
如图一所示图一这是我郁闷了好久,网上也不知道该如何搜索相关,只有自己慢慢找,最后还是找到了。
点击tools---options 就会弹出一个对话框来,如图二所示图二点editor选项卡,可以看到右边有很多选项,这些选项关系到使用的习惯和便捷性。
首先要谈到的是tab size,这个表示tab的字符宽度,默认值为8,indent size表示缩进的字符宽度,默认为2。
有人喜欢缩进为4,有人喜欢缩进为2,根据个人喜好,和程序的复杂度来选择,我一般选择2。
然后紧跟着,下面有个tab key funtion,说得是按下tab键所起到的作用,第一个表示插入制表符,第二个表示插入空格,一般选择插入空着(insert with space)这个选项。
为了解决图一的问题,就在show right margin(显示右边空白),处理方法很多,可以不选中,也可以选择Printing edge(显示到边缘),也可以把Columns(分栏)占的比例修改为100都可以。
另外,根据个人习惯,有人喜欢列出行号,有人不喜欢,这个可以在configure的下面show line numbers的选项,选中即可列出行号。
其他可以根据自己习惯设定,设定好了之后,如图三的效果,就看起来舒服多了。
图三下面一个重点就是进行项目设定了,这个步骤非常重要,如果没有设置好,有可能编译不通过或者出错。
其实我们当初选择empty project模版的时候,配置都是属于默认的,但是有些关键配置还是需要自己手动配置的,虽然配置项目很多,根据网上经验和资料,以及个人理解,列举了几个关键选项来配置即可。
1、IAR EWARM允许为工作区中的任何一级目录和文件单独设置选项,但是用户必须首先为整个项目设置通用的选项General Option。
困扰我多天的问题终于在今天解决了,感觉很轻松啊!调试Windows内核程序不能象r3层的应用层一样,可以随便调试!毕竟人家是运行在r0层的!你要是设置中断的话,会导致整个操作系统暂停!据说以前都使用SoftICE调试,这个是一个单机调试的软件,使用后会使系统很不稳定,后来NuMega公司宣布停止SoftICE的开发,因此估计现在也不太会有人用了!!微软出的WinDbg是利用双机调试的一款软件,当然按照书上说的,肯定使用虚拟机和主机这样“双”机调试!在调试的时候要设置很多东西,我就是因为设置这些东西困惑了我整整半个学期!现在我把自己的设定写一下,也是根据书上的,但是书上说的实在是他娘的太模糊了!!下载安装winDbg和VMWare虚拟机我就不说了,已经虚拟机安装xp系统!先在虚拟机的windows安装目录下C盘下有个boot.ini(当然是处于隐藏状态,选择工具-》文件夹选项-》把隐藏受保护的操作系统文件这个选项去掉)修改boot。
ini内容改为[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /noguibootmulti(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug/debugport = com1/baudrate=115200// 红色我本机绿色背景的是增加的[boot loader]timeout=5default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetectC:\GHLDR=一键GHOST v2010.10.10然后关闭虚拟机系统,在VMware的Commands栏中单击Edit virtual machine setting“,选择Hardware页,然后单击Add,选择Serial Port(串口),单击下一步,选择Output to named pipe 单击下一步,保持前2个不变,分别为\\.\pipe\com_1和This end is the server,第三个修改为The other end is an application,这样虚拟机就算设置好了,接下来设置主机,转到你安装WinDbg的目录下,然后右击WinDbg。
目录一、驱动开发环境的搭建 (1)1.1 关于DDK (1)1.2 关于驱动程序的编译 (1)1.3关于驱动程序的运行 (2)二、驱动程序的结构 (3)2.1 驱动程序的头文件 (3)2.2 驱动程序的入口点 (3)2.3 创建设备例程 (4)2.4 卸载驱动例程 (5)2.5 派遣例程 (6)三、编写驱动程序的基础知识 (6)3.1 内核模式下的字符串操作 (6)3.2 内核模式下各种开头函数的区别 (8)3.3 一个示例程序 (10)3.4 补充说明 (10)四、在驱动中使用链表 (10)4.1 内存的分配与释放 (10)4.2 使用LIST_ENTRY (12)4.3 使用自旋锁 (12)五、在驱动中读写文件 (15)5.1 使用OBJECT_ATTRIBUTES (15)5.2 创建、打开文件 (16)5.3 读写文件操作 (16)5.4 文件的其它相关操作 (18)六、在驱动中操作注册表 (18)6.1 创建、打开注册表 (19)6.2 读写注册表 (20)6.3 枚举注册表 (21)七、在驱动中获取系统时间 (21)7.1 获取启动毫秒数 (21)7.2 获取系统时间 (22)八、在驱动中创建内核线程 (23)8.1 创建内核线程 (23)8.2 关于线程同步 (24)九、初探IRP (25)9.1 IRP的概念 (25)9.2 IRP的处理 (26)9.3 IRP派遣例程示例 (27)十、驱动程序与应用层的通信 (29)10.1 使用WriteFile通信 (29)10.2 使用DeviceIoControl进行通信 (32)十二、驱动程序开发实例 (33)12.1 NT驱动程序 (33)12.2 WDM驱动程序 (35)十三、参考资料 (41)一、驱动开发环境的搭建1.1 关于DDK开发驱动程序必备的一个东西就是DDK(Device Development Kit,设备驱动开发包),它跟我们在ring3常听到的SDK差不多,只不过它们分别支持开发不同的程序而已。
驱动模块调试方法
驱动模块调试方法。
驱动模块是计算机系统中用于管理和控制硬件设备的软件程序。
为了确保驱动模块能够正确地与硬件设备进行通信和协作,需要进
行严格的调试和测试。
下面将介绍一些常用的驱动模块调试方法。
1. 日志记录,在驱动模块中添加日志记录功能,可以帮助开发
人员跟踪代码执行过程中的各种状态和错误信息。
通过分析日志记录,可以快速定位问题所在,并进行调试和修复。
2. 调试工具,使用专门的调试工具,如调试器和性能分析器,
可以帮助开发人员实时监控驱动模块的运行情况,查看变量的值、
内存的使用情况等,从而快速定位和解决问题。
3. 模拟环境,在没有实际硬件设备的情况下,可以通过模拟环
境来进行驱动模块的调试。
模拟环境可以模拟硬件设备的各种状态
和行为,帮助开发人员进行离线调试和测试。
4. 单元测试,编写单元测试用例,对驱动模块的各个功能模块
进行独立测试,验证其正确性和稳定性。
单元测试可以帮助开发人员及早发现和修复问题,提高代码的质量和可靠性。
5. 回归测试,在对驱动模块进行修改和优化后,需要进行回归测试,确保修改不会引入新的问题,并且不会影响原有功能的正常运行。
总之,驱动模块的调试是一个复杂而又重要的工作,需要开发人员具备丰富的经验和技能。
通过合理的调试方法和工具的应用,可以有效提高驱动模块的稳定性和可靠性,确保其与硬件设备的良好兼容性。
Windows驱动开发技术详解一书中的驱动编译环境的设置方法
准备工作
安装虚拟机windows 2000
安装windows 2000 DDK
安装visual c++ 6.0
开始设置
第1步用vc新建一个工程
在"project"选项卡中,选择win32 Application,选择一个空的工程。
第2步将两个源文件Driver.h和Driver.cpp拷贝到工程目录中,并添加到工程中
第3步增加新的编译版本,去掉Debug 和Release 版本
Build菜单里选Configurations,再选中Win32 Debug,然后单击Add按钮,会弹出一个对话框。
对话框里设定好以后点OK。
最后把Win23 Debug 和Win32 Release 都删掉(其实不删也可以)。
做这些动作的意义,是先把Win32 Debug 的编译选项和连接选项等等都复制到你这个新建的DDK编译环境中。
然后,你就可以按照书上讲的手动地把这些选项做些变动。
第4步修改工程属性
选择"Project|Setting",或者直接按下Alt+F7键,弹出"Project Settings"。
在对话框中,选择“General”选项卡。
将Intermediate files和Output files改为MyDriver_Check.
选择C/C++选项卡,将原有的Project Options 内容全部删除替换成如下内容:/nologo /Gz /MLd /W3 /WX /Z7 /Od /D WIN32=100 /D _X86_=1 /D
WINVER=0X500 /D DBG=1 /Fo"MyDriver_Check/" /Fd"MyDriver_Check/" /FD /c
选择Link选项卡,将原有的Project Options 内容全部删除,替换成如下内容:ntoskrnl.lib /nologo /base:"10000" /stack:0x400000,0x1000 /entry:"DriverEntry" /subsystem:console /incremental:no /pdb:"MyDriver_Check/HelloDDK.pdb" /debug /machine:I386/nodefaultlib /out:"MyDriver_Check/HelloDDk.sys" /pdbtype:sept /subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078
第5步修改VC的lib目录和include目录
在vc中选择"Tools"|"Options",在弹出的对话框中选择“Directories”选项卡。
在“Show directories for”下拉菜单中选择“Include files”菜单,添加“D:\WINDDK\2600.1106\INC\W2K”和“D:\WINDDK\2600.1106\INC\DDK\W2K”并将这两个目录置于最上。
读者可将“D:\WINDDK\2600.1106”替换成自己的DDK安装目录。
新增修改:在这一步,我在虚拟机windows 2000中的设置路径为C:\NTDDK\INC和C:\NTDDK\INC\DDK.
在"Show directories for "下拉菜单中选择“Library files”菜单,添加目录“D:\WINDDK\2600.1106\LIB\W2K\I386”并置于最上端。
新增修改:在这一步,我在虚拟机windows 2000中的设置路径为C:\NTDDK\LIB\I386并置于最上端.
第6步编译
按下F7键。
新增修改:在虚拟机win2K中出错,LINK : fatal error LNK1181: cannot open input file "ntoskrnl.lib".没关系,到另一台装了DDK 2k3 机子上去把\WINDDK\ 3790.1830\lib\win2k\i386目录中的相应文件拷贝到C:\NTDDK\LIB\I386目录下就行了.现在再次按下F7,OK,编译通过.。