注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

^_^ china.ygw的博客

软件开发/c/c++/数据库/开源/linux/windows/安全/网络...

 
 
 

日志

 
 
 
 

DDKWizard配置驱动开发环境  

2008-09-18 22:45:38|  分类: windows |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
0、安装DDK后,去http://ddkwizard.assarbad.net/ 下载ddkwizard_setup.exeddkbuild_bat.zipddkbuild_cmd.zip(奇怪啊 安装DDK时自动选择了A:\x86\kitsetup.exe而非amd64,我的不是AM2CPU)

1. 拷贝 DDKBUILD.bat DDKBUILD.cmd DDK安装根目录,如我的是D:\WinDDK.
 
2.
将上述文件(DDKBUILD.bat DDKBUILD.cmd )的路径添加到系统的path变量(右击我的电脑,系统属性/高级/环境变量/系统变量/path变量双击修改值)

3.
根据你所安装的DDK的不同版本添加不同的变量到系统变量中。
  
右击我的电脑,系统属性/高级/环境变量/系统变量/新建:
   2000 DDK
则变量名为: W2KBASE
   XP DDK
则变量名为: WXPBASE
   2003 sp1 DDK
则变量名为: WNETBASE
  
这里我的是WNETBASE(值为D:\WinDDK\3790.1830)
 
4.
启动VS2005,打开Tools->Options,选择Projects and Solutions->VC++ Directories,Show directories for Executable files中添加上面DDKBuild.bat文件所在的路径(这里是D:\WinDDK)
 
5.
开始安装DDKWizard,在安装的最后一步你可以选择编辑ddkwizard的配置文件.
 
final,
好了,现在你就可以启动VS2005,用它来编译驱动了,咔咔(如果编译时出现不能spawing cmd.exe错误,那就是你把上述的变量添加到了你自己的帐户环境下了)


————————————————————————————
VS2005
集成DDKWizard遇到的问题>>>>>>>>>>>>>>>>>>>>>
————————————————————————————
建立EmptyDriver时,

要在sources文件的第4TARGETTYPE=后面加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文件也可。理论上是这样,但测试失败。

————————————————————————————
直接用DDK的命令行工具编译>>>>>>>>>>>>>>>>>>>>>>>>>
————————————————————————————
1
D:\WINDDK下建立工程目录:D:\WINDDK\uu
2
D:\WINDDK\uu下文件清单:
DriverDemo.cpp
代码:

//////////////////////////////////////////////////
// DriverDemo.cpp文件

//---------------------------DriverDemo.cpp
文件--------------------------------------//
extern "C"
{
    #include <ntddk.h>
}

// 自定义函数的声明
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
void DriverUnload(PDRIVER_OBJECT pDriverObj);

// 驱动内部名称和符号连接名称
#define DEVICE_NAME L"\Device\devDriverDemo"
#define LINK_NAME L"\??\slDriverDemo"

// 驱动程序加载时调用DriverEntry例程
extern "C"{
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
    NTSTATUS status = STATUS_SUCCESS;

    DbgPrint(" DriverDemo: DriverEntry...  ");

    
// 初始化各个派遣例程
    pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreateClose;
    pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
    pDriverObj->DriverUnload = DriverUnload;

        
// 创建、初始化设备对象
    // 
设备名称
    UNICODE_STRING ustrDevName;
    RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
    
// 创建设备对象
    PDEVICE_OBJECT pDevObj;
    status = IoCreateDevice(pDriverObj, 
                0,
                &ustrDevName, 
                FILE_DEVICE_UNKNOWN,
                0,
                FALSE,
                &pDevObj);
    
if(!NT_SUCCESS(status))
    {
        
return status;
    }

        
// 创建符号连接名称
    // 
符号连接名称
    UNICODE_STRING ustrLinkName;
    RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
    
// 创建关联
    status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);  
    
if(!NT_SUCCESS(status))
    {
        IoDeleteDevice(pDevObj);  
        
return status;
    }
    
return STATUS_SUCCESS;
}
}

void DriverUnload(PDRIVER_OBJECT pDriverObj)
{    
    DbgPrint(" DriverDemo: DriverUnload...  ");

    
// 删除符号连接名称
    UNICODE_STRING strLink;
    RtlInitUnicodeString(&strLink, LINK_NAME);
    IoDeleteSymbolicLink(&strLink);
    
// 删除设备对象
    IoDeleteDevice(pDriverObj->DeviceObject);
}

// 处理IRP_MJ_CREATEIRP_MJ_CLOSE功能代码
NTSTATUS DispatchCreateClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
    DbgPrint(" DriverDemo: DispatchCreateClose...  ");

    pIrp->IoStatus.Status = STATUS_SUCCESS;
    
// 完成此请求
    IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    
return STATUS_SUCCESS;
}


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


sources
代码:

TARGETNAME=DriverDemo
TARGETTYPE=DRIVER
DRIVERTYPE=WDM
TARGETPATH=OBJ

INCLUDES=$(DDKROOT)incddkwnet;
         $(DDKROOT)incwnet;

SOURCES=DriverDemo.cpp

打开:开始/程序/……/Windows Server 2003 Checked x86 Build Environment
输入如下:
D:\WINDDK\3790~1.183>cd ..//uu
D:\WINDDK\uu>build

 

原文件地址:http://blog.csdn.net/xiaou_is_me/archive/2008/05/13/2441117.aspx
  评论这张
 
阅读(901)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018