阅读:2719回复:1
驱动开发学习(一)_驱动开发环境的搭建vs2008
小牛(鄙人)最近一直在努力学习驱动相关知识,在学习道路上难免遇到困难,在这里得到各位大牛提供的学习资料,代码,鄙人很是感激,感激之余,认为有必要把自己学习驱动开发的点滴记录下来,由于鄙人是驱动开发新人,所以在学习驱动开发过程中遇到的许多问题,也许是多数驱动开发新人遇到的,因此,这些问题的解答,也许能够帮助与鄙人一样的新人度过学习难关,激发新人继续学习的兴趣。
在此,首先声明,鄙人所发帖的文字内容,并非完全出自鄙人之笔,有很多是转载的,当然这些转载的在网上大家同样可以找的到,之所以转载,是因为很有价值,能够帮助新人解疑释惑,提高学习效率,少走弯路。 以下文字皆是转载,主要简述如何架构驱动开发环境,希望对您有帮助。 Visual Studio 2008配置DDK驱动开发环境 1.首先下载ddk开发包 Windows DDK 3790.1830 下载 安装DDK后,去http://ddkwizard.assarbad.net/ 下载ddkwizard_setup_v1.2.0a、ddkbuild_bat.zip、ddkbuild_cmd.zip。 2.拷贝 DDKBUILD.bat 和 DDKBUILD.cmd 到DDK安装根目录,如我的是D:\WinDDK. 3.. 将上述文件(DDKBUILD.bat 和 DDKBUILD.cmd )的路径添加到系统的path变量(右击我的电脑,系统属性/高级/环境变量/系统变量/path变量双击修改值)。 4. 根据你所安装的DDK的不同版本添加不同的变量到系统变量中。 右击我的电脑,系统属性/高级/环境变量/系统变量/新建: 2000 DDK则变量名为: W2KBASE XP DDK则变量名为: WXPBASE 2003 sp1 DDK则变量名为: WNETBASE 这里我的是WNETBASE(值为D:\WinDDK\3790.1830) 5. 启动vs2008 打开菜单中的工具——选项,弹出选项对话框。选择左边的项目和解决方案——VC++目录,在右边的显示以下内容的目录下拉列表中选择可执行文件,在下面列表框中添加上面DDKBuild.bat文件所在的路径(这里是D:\WinDDK),同样设置包含文件和库文件 如下图: 设置可执行文件 设置包含文件(D:\WINDDK\3790.1830\inc\wnet D:\WINDDK\3790.1830\inc\ddk\wnet ) 设置库文件(D:\WINDDK\3790.1830\lib\wnet\i386) 6. 开始安装DDKWizard,在安装的最后一步你可以选择编辑ddkwizard的配置文件。 7. 现在重新打开VC2008就会发现在新建项目里面有DDK Project的选项了,里面就可以建立驱动工程来编写驱动程序了。 8. 验证你做的工作,你可以直接新建一个Driver工程按F7编译,编译看看。 建立EmptyDriver时, 要在sources文件的第4行TARGETTYPE=后面加DRIVER 加入[源文件]后还要在sources文件里的SOURCES=后面加上[源文件名]。比如: SOURCES=DriverDemo.cpp \ DriverDemo.h VS2008集成DDKWizard遇到的问题>>>>>>>>>>>>>>>>>>>>> ———————————————————————————— ▲建立EmptyDriver时, 要在sources文件的第4行TARGETTYPE=后面加DRIVER 加入[源文件]后还要在sources文件里的SOURCES=后面加上[源文件名]。比如: SOURCES=DriverDemo.cpp \ DriverDemo.h ▲Cannot open include file: \'NTDDK.h\': No such file or directory 解决方案:VS2005/工具/选项/VC++目录/, [显示以下内容的目录]为[包含文件],把DDK包含文件加进目录—— [D:\WINDDK\3790.1830\inc\ddk\wnet]和[D:\WINDDK\3790.1830\inc\wnet]。 [显示以下内容的目录]为[库文件],把DDK库文件加进目录—— [D:\WINDDK\3790.1830\LIB\WNET\I386] 以上DDK的路径要放到最先。 参考自:http://blog.csdn.net/jamesandy/archive/2008/03/17/2192267.aspx 结果: ▲编译提示错误: BufferOverflowK.lib(gs_support.obj) : error LNK2019: unresolved external symbol _DriverEntry@8 referenced in function _GsDriverEntry@8 objchk_w2K_x86\i386\Helloworld.sys : fatal error LNK1120: 1 unresolved externals 解决方案: 把[入口函数DriverEntry]前加上extern "C": extern "C"{ NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString) { /*DriverEntry函数内容*/ } }//extern "C" 结果:OK。编译通过,才。我靠!终于啊! 另:据说改成.c文件也可。理论上是这样,但测试失败。 测试代码如下 // sources文件 # $Id$ TARGETNAME=HelloWorld TARGETPATH=obj TARGETTYPE=DRIVER # Create browse info #BROWSER_INFO=1 #BROWSERFILE=<some path> # Additional defines for the C/C++ preprocessor C_DEFINES=$(C_DEFINES) SOURCES=HelloWorld.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 components of the Windows NT DDK # !INCLUDE $(NTMAKEENV)\makefile.def //HelloWorld.h文件 #ifndef __HELLOWORLD_H__ #define __HELLOWORLD_H__ #include <ntddk.h> #define DEVICE_HELLO_INDEX 0x860 #define START_HELLOWORLD CTL_CODE( FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX,METHOD_BUFFERED,FILE_ANY_ACCESS) #define STOP_HELLOWORLD CTL_CODE(FILE_DEVICE_UNKNOWN,DEVICE_HELLO_INDEX+1,METHOD_BUFFERED,FILE_ANY_ACCESS) #define NT_DEVICE_NAME L"\\Device\\HelloWorld" #define DOS_DEVICE_NAME L"\\DosDevices\\HelloWorld" NTSTATUS HelloWorldDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp); VOID HelloWorldUnload(IN PDRIVER_OBJECT DriverObject); #endif // HelloWorld.c文件 #ifndef __HELLOWORLD_C__ #define __HELLOWORLD_C__ #define DEBUGMSG #include "HelloWorld.h" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath) { NTSTATUS ntStatus=STATUS_SUCCESS; PDEVICE_OBJECT IpDeviceObject=NULL; UNICODE_STRING DeviceNameString; UNICODE_STRING DeviceLinkString; #ifdef DEBUGMSG DbgPrint("hi, Starting DriverEntry()\n"); #endif RtlInitUnicodeString(&DeviceNameString,NT_DEVICE_NAME); ntStatus=IoCreateDevice(DriverObject,0,&DeviceNameString,FILE_DEVICE_UNKNOWN,0,FALSE,&IpDeviceObject); if(!NT_SUCCESS(ntStatus)) { #ifdef DEBUGMSG DbgPrint("hi, Error IoCreateDevice()\n"); #endif goto Error; } RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME); ntStatus=IoCreateSymbolicLink(&DeviceLinkString,&DeviceNameString); if(!NT_SUCCESS(ntStatus)) { #ifdef DEBUGMSG DbgPrint("hi, Error IoCreateSymbolicLink()\n"); #endif goto Error; } DriverObject->MajorFunction[IRP_MJ_CREATE]=HelloWorldDispatch; DriverObject->MajorFunction[IRP_MJ_CLOSE]=HelloWorldDispatch; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=HelloWorldDispatch; DriverObject->DriverUnload=HelloWorldUnload; return ntStatus; Error: #ifdef DEBUGMSG DbgPrint("hi, Error DriverEntry()\n"); #endif return ntStatus; } NTSTATUS HelloWorldDispatch(IN PDEVICE_OBJECT DeviceObject,IN PIRP pIrp) { NTSTATUS ntStatus=STATUS_SUCCESS; ULONG IoControlCodes=0; PIO_STACK_LOCATION IrpStack=NULL; pIrp->IoStatus.Status=STATUS_SUCCESS; pIrp->IoStatus.Information=0; #ifdef DEBUGMSG DbgPrint("hi, Starting HelloWorldDispatch()\n"); #endif IrpStack=IoGetCurrentIrpStackLocation(pIrp); switch(IrpStack->MajorFunction) { case IRP_MJ_CREATE: #ifdef DEBUGMSG DbgPrint("hi, IRP_MJ_CREATE\n"); #endif break; case IRP_MJ_CLOSE: #ifdef DEBUGMSG DbgPrint("hi, IRP_MJ_CLOSE\n"); #endif break; case IRP_MJ_DEVICE_CONTROL: #ifdef DEBUGMSG DbgPrint("hi, IRP_MJ_DEVICE_CONTROL\n"); #endif IoControlCodes=IrpStack->Parameters.DeviceIoControl.IoControlCode; switch(IoControlCodes) { case START_HELLOWORLD: DbgPrint("hi, Starting \"Hello World \"\n"); break; case STOP_HELLOWORLD: DbgPrint("hi, Stoping \"Hello World \"\n"); break; default: pIrp->IoStatus.Status=STATUS_INVALID_PARAMETER; break; } break; default: break; } ntStatus=pIrp->IoStatus.Status; IoCompleteRequest(pIrp,IO_NO_INCREMENT); return ntStatus; } VOID HelloWorldUnload(IN PDRIVER_OBJECT DriverObject) { UNICODE_STRING DeviceLinkString; PDEVICE_OBJECT DeviceObjectTemp1=NULL; PDEVICE_OBJECT DeviceObjectTemp2=NULL; #ifdef DEBUGMSG DbgPrint("hi,Starting HelloWorldUnload()\n"); #endif RtlInitUnicodeString(&DeviceLinkString,DOS_DEVICE_NAME); IoDeleteSymbolicLink(&DeviceLinkString); if(DriverObject) { DeviceObjectTemp1=DriverObject->DeviceObject; while(DeviceObjectTemp1) { DeviceObjectTemp2=DeviceObjectTemp1; DeviceObjectTemp1=DeviceObjectTemp1->NextDevice; IoDeleteDevice(DeviceObjectTemp2); } } } #endif 手动编译命令如下: 打开:开始/程序/……/Windows Server 2003 Checked x86 Build Environment 输入如下: D:\WINDDK\3790~1.183>cd ..//uu D:\WINDDK\uu>build |
|
沙发#
发布于:2009-08-17 21:52
不错 再放点图片就更好了
|
|