我在自己的博客园http://www.cnblogs.com/DotCpp/archive/2010/01/27/DotCpp.html和百度空间http://hi.baidu.com/anglecloudy/blog/item/9b8d841636c6b84321a4e901.html中已经讲的差不多了。只是内容有点乱,现在在这里面好好整理一下。为初学者提供学习方法及自己做个备份。【注:转载请注明出处,打这么多字不容易,呵呵:)】

一、开篇--工具下载与安装

1>> 我使用的是工具VC + XPDDK +DriverStudio 3.1(DriverStudio是为了用里面的几个测试工具,如DriverMonitor,而且还可以学一下WDM开发) 。很多人现在用的是DriverStudio 3.2,我开始也用的是3.2,只是有段时间学习武安河的那本《Windows 2000 XP WDM 开发》时他用的是3.1,与3.2界面差别有点大,而且当时对驱动不太了解,为了学习方便只能换3.1,找了很久的下载地址:http://blog.csdn.net/mobidogs/archive/2007/01/23/1491503.aspx

现在想想有些不值,武安河的那本书没能坚持下来。那本书一点都不适合初学者看。后来看的《Windows驱动开发技术详解》收获很大,学到了很多东西。建议初学者先那本书,再看其它书籍。

相关软件可以从网站http://www.moodisk.com/download_other_c.php下载,如:
         (1)·DriverStudio_3.2_CR.rar(解压DriverStudio_3.2_CR.rar,进入解压后的目录DriverStudio_3.2_CR,再把其中 driverstudio.3.2.crack.rar解压,产生目录driverstudio.3.2.crack,里面有两个文件SN.txt和 compuware.dat,前者包含序列号,后者是证书文件,这两个文件在安装过程中会用到。)
          (2)·Visual.C++.6.EN.zip;
          (3)·winxp_ddk.rar;
          (4)·ntstrsafe.lib+csq.lib.rar;

2>>安装,没啥好说的。安装顺序:--> VC6.0-->VC SP6补丁 --> WinXP_DDK (安装DDK时把Build Envirement里面的win 2000选中(默认的是没选中,要注意),不然以后编译DDK例子时,ntddk.h里面会出现很多错误,而且基本都是有些类型找不到定义,这时你把2000 DDK的头文件加在Directory的Include里面就行了,曾经我被搞的痛不欲生)-> DriverStudio3.x(1,2都行)

3>>配置:在Tool-> Options设置Include和Lib目录,注意是2000 DDK的(如果等下编译有什么问题,把XP DDK的一些头文件和LIB文件也加进来,基本就没问题了)。
            我的设置是Include目录:
             C:\WINDDK\2600\INC\W2K
             C:\WINDDK\2600\INC\DDK\W2K
             C:\WINDDK\2600\INC\DDK\WDM\W2K
            Lib目录:

C:\WINDDK\2600\LIB\W2K\I386

二、测试代码

1>>自己写的HelloDDK,其实和《Windows驱动开发技术详解》差不多。呵呵,大鸟不要见怪,我说的重点是第二点。

#ifdef __cplusplus
extern "C"
{
#endif
#include <NTDDK.h>
#ifdef __cplusplus
}
#endif #define PAGEDCODE code_seg("PAGE")
#define LOCKEDCODE code_seg()
#define INITCODE code_seg("INIT")#define arraysize(p) (sizeof(p)/sizeof((p)[0]))typedef struct _DEVICE_EXTENSION {PDEVICE_OBJECT pDevice;UNICODE_STRING ustrDeviceName;   //设备名称UNICODE_STRING ustrSymLinkName;   //符号链接名
} DEVICE_EXTENSION, *PDEVICE_EXTENSION;/************************************************************************
* 函数名称:CreateDevice
* 功能描述:初始化设备对象
* 参数列表:pDriverObject:从I/O管理器中传进来的驱动对象
* 返回 值:返回初始化状态
*************************************************************************/
#pragma INITCODE
NTSTATUS CreateDevice (IN PDRIVER_OBJECT    pDriverObject)
{NTSTATUS status;PDEVICE_OBJECT pDevObj;PDEVICE_EXTENSION pDevExt;//创建设备名称UNICODE_STRING devName;RtlInitUnicodeString(&devName,L"\\Device\\MyDDKDevice");//创建设备status = IoCreateDevice( pDriverObject,sizeof(DEVICE_EXTENSION),&(UNICODE_STRING)devName,FILE_DEVICE_UNKNOWN,0, TRUE,&pDevObj );if (!NT_SUCCESS(status))return status;pDevObj->Flags |= DO_BUFFERED_IO;pDevExt = (PDEVICE_EXTENSION)pDevObj->DeviceExtension;pDevExt->pDevice = pDevObj;pDevExt->ustrDeviceName = devName;//创建符号链接UNICODE_STRING symLinkName;RtlInitUnicodeString(&symLinkName,L"\\??\\HelloDDK");pDevExt->ustrSymLinkName = symLinkName;status = IoCreateSymbolicLink( &symLinkName,&devName );if (!NT_SUCCESS(status)) {IoDeleteDevice( pDevObj );return status;}return STATUS_SUCCESS;
}/************************************************************************
* 函数名称:HelloDDKUnload
* 功能描述:负责驱动程序的卸载操作
* 参数列表:pDriverObject:驱动对象
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject)
{PDEVICE_OBJECT pNextObj;KdPrint(("Enter DriverUnload\n"));pNextObj = pDriverObject->DeviceObject;while (pNextObj != NULL) {PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION)pNextObj->DeviceExtension;//删除符号链接UNICODE_STRING pLinkName = pDevExt->ustrSymLinkName;IoDeleteSymbolicLink(&pLinkName);pNextObj = pNextObj->NextDevice;IoDeleteDevice( pDevExt->pDevice );}
}/************************************************************************
* 函数名称:HelloDDKDispatchRoutine
* 功能描述:对读IRP进行处理
* 参数列表:pDevObj:功能设备对象pIrp:从IO请求包
* 返回 值:返回状态
*************************************************************************/
#pragma PAGEDCODE
NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
{KdPrint(("Enter HelloDDKDispatchRoutine\n"));NTSTATUS status = STATUS_SUCCESS;// 完成IRPpIrp->IoStatus.Status = status;pIrp->IoStatus.Information = 0;    IoCompleteRequest( pIrp, IO_NO_INCREMENT );KdPrint(("Leave HelloDDKDispatchRoutine\n"));return status;
}/************************************************************************
* 函数名称:DriverEntry
* 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
* 参数列表:pDriverObject:从I/O管理器中传进来的驱动对象pRegistryPath:驱动程序在注册表的中的路径
* 返回 值:返回初始化驱动状态
*************************************************************************/
#pragma INITCODE
extern "C" NTSTATUS DriverEntry (IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath )
{NTSTATUS status;KdPrint(("Enter DriverEntry\n"));//注册其他驱动调用函数入口pDriverObject->DriverUnload = HelloDDKUnload;pDriverObject->MajorFunction[IRP_MJ_CREATE] = HelloDDKDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_CLOSE] = HelloDDKDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_WRITE] = HelloDDKDispatchRoutine;pDriverObject->MajorFunction[IRP_MJ_READ] = HelloDDKDispatchRoutine;//创建驱动设备对象status = CreateDevice(pDriverObject);KdPrint(("DriverEntry end\n"));return status;
}

2>>设置编译环境

*开始C/C++选项卡里的设置。
 1)Preprocessor definitions中设置为:WIN32=100,_X86_=1,WINVER=0x500,DBG=1
WIN32=100:不是很清楚。
_X86_=1:这个最重要,否则无法编译通过。代表CPU类型为X86
WINVER=0x500,是因为你是for 2K的。XP的是0x501。
DGB=1表示调试版本。
2)C++ Language里面去掉Enable exeception handling,否则会出现error LNK2001: unresolved external symbol ___CxxFrameHandler。
3)Code Generation调用习俗设置成__stdcall。
4)Project Options中去掉/GZ【注意是大写的GZ,目的是编译的时候不会自动加入__chkesp。
5)Precompiled Headers里面选Not using Precompiled headers,毕竟驱动程序都不会太大,不在乎节省那点时间。

*设置Link选项卡
1)输出改成*.sys
2)lib添加ntoskrnl.lib

3)勾上Ignore all default libraries,否则会链接libc,报告没有main函数。
4)Base address:0x10000
Entry-point sysmbol:DriverEntry
Statck Reverse:0x400000,缺省是1MB,但为什么要设成4MB?
Commit:0x1000
5)Customize去掉Link incrementally,否则会和/RELEASE冲突。
6)link的 Project Options:加入/subsystem:native /driver /SECTION:INIT,D /RELEASE /IGNORE:4078
/subsystem:native:PE格式文件其中有个地方要填写这个。
/driver是对驱动做一些优化。
/SECTION:INIT,D:对INIT section进行discard
/RELEASE (Set the Checksum)
/IGNORE:4078 忽略4078错误,否则会出现LINK : warning LNK4078: multiple "INIT" sections found with different attributes (E2000020)

3>> 配置好后,生成相关的sys文件即可,用DriverMonitor加载一下就可以看到效果了。祝大家成功

附:本文没有讲WDM,如果学习WDM,可以去我的百度空间和博客园看一下。不过建议初学者先别学那个,怎么一个痛苦了得

written by .cpp

详细讲解vc 6.0进行DDK驱动开发【原创】相关推荐

  1. VS2012+WDK8.0搭建WDF驱动开发环境

    根据目前资料,如果要调试ReactOS源码,有很多工作要做:安装RosBE,下载ReactOS源码,生成VS工程,由源码生成镜像文件,等步骤:然后VS还要搭建驱动开发环境:然后由虚拟机装载运行镜像,V ...

  2. vs2012+wdk8.0 搭建wdf驱动开发环境

    开发环境搭建: 系统:win7 x64 工具:vs2012 + WDK8.0 插件:wdfcoinstaller.msi (1)先安装vs2012,再安装wdk8.0,这样在打开vs2012时可以创建 ...

  3. vc 写c语言程序步骤,VC++ 6.0编写程序的详细步骤

    想知道VC++ 6.0工具如何编写程序吗,可能有些朋友还不熟悉,我们一起去了解一下VC++ 6.0编写程序的详细步骤吧. VC++ 6.0编写程序的详细步骤 vc++6.0的菜单简洁,工具明了,这里以 ...

  4. 客户端开发 Windows驱动开发(1)SDK WDK DDK WDM的关系

    尽管Windows平台的SDK.DDK与WDK都包含了WinDBG工具包,但是用户获取WinDBG工具包的最主要方式还是从微软网站自由下载,因为这样获得的版本最新. 最近因为工作需要,尝试去了解WIN ...

  5. c语言中文网 vc++6.0下载量_【新手必看】C语言开发环境,请查收!

    C语言开发环境的选择, 貌似是告诉我们,工欲善其事,必先利其器. 01.Visual Studio Visual Studio(简称 VS),它是 Windows 下的标准 IDE,VS系列为IDE( ...

  6. vue-trtc多人视频开发(从零开始)-有手就行篇-最详细讲解

    大家花个几分钟把帖子详细看完  新手也能做直播集成开发!一步到位  相信小编 最效率最省力最通透的文档! 甚至直接可以copy使用的哦!!但是记得给小编一个赞吧 孩子天天熬夜加班 还写博客确实不容易 ...

  7. 庖丁解牛:USB 驱动开发技术彻底解密

    我们知道如果开发工程师不懂RS232 肯定会让人笑话可以想象面向未来USB 接口无处不在 因此掌握USB 的原理固件编程及其驱动开发技术势必成为当务之急 USB 即插即用的优点和灵活性运用于各种电子产 ...

  8. Linux学习笔记 驱动开发篇

    ARM Linux 驱动开发篇 本篇我们将会详细讲解 Linux 中的三大类驱动:字符设备驱动.块设备驱动和网络设备驱动. 字符设备最多,从最简单的点灯到 I2C.SPI.音频等都属于字符设备驱动的类 ...

  9. NXP LS1046A及飞腾新四核 FT2004 PCIE EP端LINUX设备驱动开发

    文章目录 前言 一.PCIE 硬件简介 二.PCIE EP地址映射原理介绍 1. PCI总线的各种域(存储器域.PCI总线域) 2. 开发EP设备驱动要做的事 三.NXP LS1046A PCIE E ...

最新文章

  1. maven配置阿里云仓库镜像
  2. python自动化教程_Python自动化开发实战视频课程-全新基础篇_Python教程
  3. pyspark读取hdfs 二进制文件
  4. Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)...
  5. netty4.0.x源码分析—bootstrap
  6. android+mvp+登录案例,android mvp实现登录
  7. pythonidea_idea集成python插件
  8. Spring对JNDI的支持方法
  9. yara 模式匹配 android,YARA——恶意软件模式匹配利器
  10. jquery 文件上传 触发两次_点击三次input按钮,前两次不选择任何文件,第三次选择一个文件,结果上传了3个文件,即发生了三次请求...
  11. linux实现防止恶意扫描 PortSentry
  12. Mock Server基本使用方法
  13. 如何设计微信公众号的封面图?教你设计自己的专属公众号封面
  14. 网页设计配色应用实例剖析——蓝色系
  15. 历年数学界菲尔兹奖及其得主简介
  16. HTML5 新特性: Web Worker 的创建与使用(webpack + TS 环境)
  17. Android实现NFC芯片制造商识别
  18. 去中心化通信简易方案
  19. 使用Android Studio 开发地图案例之二(展示普通图、卫星图、交通流量图和百度城市热力图)
  20. 从新手到高手c++全方位学习 pdf + 视频教程 共18章

热门文章

  1. 武田公布2019财年第一季度强劲业绩并上调全年指引
  2. 版本发布 | IvorySQL Release - 2.2
  3. ASP.NET Core2.1 你不得不了解的GDPR(Cookie处理)
  4. 美国研究生院计算机数据科学排名,2021美国硕士计算机专业排名
  5. mysql火焰图_Linux 性能分析利器 -火焰图 flame graph
  6. VS 2022 C++ 自定义头文件示例
  7. FPA软件评估方法论
  8. 犹太人的经典成功智慧
  9. Java 异步方法转同步
  10. Android四大组件和启动模式(面试总结)