`
dotcpp
  • 浏览: 60172 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

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

阅读更多

我在自己的博客园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;
	// 完成IRP
	pIrp->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

 

1
0
分享到:
评论

相关推荐

    VC6.0开发驱动设备程序配制方法

    在VC6.0环境下开发驱动设备程序,首先要理解驱动程序的基本概念,它是操作系统与硬件设备之间的桥梁,负责处理硬件的初始化、数据传输等任务。在本文中,我们将探讨如何配置VC6.0来构建驱动程序。 一、准备工作 1....

    Windows XP + VC 6.0 + WinXP_DDK + DriverStudio 3.2 .doc

    本文将详细介绍如何安装和配置一个完整的 DDK 开发环境,包括 Windows XP、VC 6.0、WinXP_DDK 和 DriverStudio 3.2。 首先,需要卸载 360 杀毒软件,并下载并解压以下软件: * DriverStudio_3.2_CR.rar * Visual....

    VC6.0编译驱动时的配置

    本文详细介绍了如何使用VC6.0编译NT式驱动和WDM式驱动,包括设置编译器选项、链接器选项以及环境变量等步骤。这些步骤对于初学者来说非常重要,有助于理解驱动程序开发的基本流程。虽然现在大多数开发者都转向了更...

    用VC6.0集成环境快速开发VxD

    本文将详细介绍如何利用VC6.0进行VxD的开发工作。 #### 准备工作 1. **环境配置**:首先需要安装VC6.0和Win98 DDK。注意,VC6.0可能需要额外的设置才能支持VxD的开发。 2. **工具选择**:本文推荐使用VtoolsD3.0,...

    基于VC+DDK的USB开发

    本项目“基于VC+DDK的USB开发”是关于如何利用Microsoft的Visual C++(VC6.0)结合Windows Driver Development Kit(DDK)来实现USB设备的驱动程序开发。下面将详细讲解这一主题的相关知识点。 首先,DDK是微软提供...

    vc6ddk用vc6编译ddk驱动的设置

    - `/driver`:进行驱动程序优化。 - `/SECTION:INIT,D`:对初始化段进行丢弃优化。 - `/RELEASE`:设置校验和。 - `/IGNORE:4078`:忽略链接器警告4078,该警告指出存在多个具有不同属性的初始化段。 #### 七、...

    .软件的安装顺序:VC6.0 -> DDK_XP -> DriverStudio3.2 ,如果装错了,把DS3.2删除再重装就OK了.

    软件的安装顺序:VC6.0 -&gt; DDK_XP -&gt; DriverStudio3.2 ,如果装错了,把DS3.2删除再重装就OK了. 2.编译库文件: (1).启动VC6.0,进入菜单DriverStudio&gt;&gt;DDK Build Settings指向DDK安装位置; (2).进入菜单Open Workspace...

    DDK虚拟键盘鼠标驱动VC6.0源码

    1、DDK模式 2、虚拟键盘鼠标驱动源码 3、过HP、NP、盛大等主流游戏保护 4、虚拟驱动只支持32位windows操作系统

    VC驱动开发环境配置

    本文将详细介绍如何使用Microsoft Visual C++(简称VC)进行驱动开发环境的配置,主要关注NT和WDM驱动开发。 首先,让我们理解NT驱动开发。NT驱动是为Windows NT内核系列操作系统(包括Windows 2000、XP、Server ...

    VC6+DDK环境下编译驱动设置

    本文将详细介绍如何在VC6+DDK环境下进行驱动编译设置。 首先,你需要确保已经安装了VC6和对应版本的DDK。DDK通常与特定的Windows版本相对应,如Windows XP DDK或Windows Server 2003 DDK等。安装完毕后,你需要将...

    目录切换器(用于vc6.0)

    然而,在使用VC6.0进行SDK(Software Development Kit)和DDK(Device Driver Development Kit)编程时,频繁地在不同的开发目录之间切换可能会成为一项繁琐的任务。这时,“目录切换器”便应运而生,为开发者提供了...

    在VC6中配置DDK的开发环境

    在VC6中配置DDK(Device Driver Kit)的开发环境是一项关键任务,因为这将允许开发者在Microsoft Visual Studio 6.0的集成开发环境中编写和调试设备驱动程序。DDK是微软提供的一套工具和库,用于创建和维护Windows...

    驱动程序开发配置VC+DDK+Compuware DriverStudio

    本文将详细介绍如何配置这套开发环境,帮助读者更好地进行驱动程序开发。 #### 一、VC的选择与安装 VC是Microsoft Visual C++的简称,它是微软提供的一款功能强大的C/C++集成开发环境。在驱动开发领域,VC6.0因其...

    驱动程序开发DDK VC DriverStudio3.2安装与配置

    ### 驱动程序开发DDK VC DriverStudio3.2安装与配置详解 #### 一、软件安装顺序及注意事项 在驱动程序开发领域,DDK(Driver Development Kit)、VC(Visual C++)以及DriverStudio3.2是重要的开发工具组合。正确...

    DDK驱动开发工具集合

    这个压缩包文件“DDK驱动开发工具集合”包含了多个关键的工具,这些工具对于理解Windows操作系统内部工作原理以及进行驱动程序开发至关重要。让我们一一探讨这些工具的功能和用途。 1. DebugView DebugView是一款...

    VC6_DDK_xp_DS3.2_study.rar_VC DDK DS_ddk_XP

    【VC6_DDK_xp_DS3.2_study.rar_VC DDK DS_ddk_XP】这个压缩包文件聚焦于使用Visual C++ 6.0(简称VC6)开发USB上位机驱动程序,结合Windows XP的Driver Development Kit(DDK)以及Device Stage 3.2的相关技术。...

    DDK开发协议驱动程序.zip

    通过"DDK开发协议驱动程序.txt"这个文本文件,开发者可以获取关于如何使用DDK进行WDM驱动开发的详细指南,包括步骤、最佳实践和常见问题的解决方案。67940DDK.rar可能包含了更具体的示例代码和工具,帮助开发者实际...

    vc6能用的SDK和库列表及下载地址

    此外,IFS DDK还专门针对文件系统驱动程序的开发进行了优化。获取DDK/IFS DDK的地址为:[Microsoft官方网站](http://www.microsoft.com/whdc/devtools/ddk/default.mspx) #### 其他重要库和SDK - **WTL (Windows ...

    在VC中导入DDK方法

    在VC中导入DDK是为了进行驱动程序开发,DDK(Driver Development Kit)是微软提供的用于创建设备驱动程序的工具集。下面将详细解释如何在VC(Visual C++)环境中配置DDK并将其集成到工程中。 首先,你需要下载并...

Global site tag (gtag.js) - Google Analytics