vs2008配置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