没有合适的资源?快使用搜索试试~ 我知道了~
首页驱动开发windwos入门
驱动开发windwos入门
需积分: 10 24 下载量 155 浏览量
更新于2023-03-16
评论
收藏 1.15MB DOC 举报
Windows驱动程序的编写,往往需要开发人员对Windows内核有深入了解和大量的内核调试技巧,稍有不慎,就会造成系统的崩溃。因此,初次涉及Windows驱动程序开发的程序员,即使拥有大量Win32程序的开发技巧,往往也很难入门。 本章向读者呈现两个最简单的Windows驱动程序,一个是NT式的驱动程序,另一个是WDM式的驱动程序。这两个驱动程序没有操作具体的硬件设备,只是在系统里创建了虚拟设备。在随后的章节中,它们会作为基本驱动程序框架,被本书其他章节的驱动程序开发所复用。笔者将带领读者编写代码、编译、安装和调试程序。相信对第一次编写驱动程序的读者来说,这将是非常激动和有趣的。代码的具体讲解将分散在后面的章节论述。现在请和笔者一起,开始Windows驱动编程之旅吧!
资源详情
资源评论
资源推荐
1.1 DDK 的安装
第 1 章从两个最简单的驱动谈起
Windows 驱动程序的编写,往往需要开发人员对 Windows 内核有深入了解和大量
的内核调试技巧,稍有不慎,就会造成系统的崩溃。因此,初次涉及 Windows 驱动程序
开发的程序员,即使拥有大量 Win32 程序的开发技巧,往往也很难入门。
本章向读者呈现两个最简单的 Windows 驱动程序,一个是 NT 式的驱动程序,另一
个是 WDM 式的驱动程序。这两个驱动程序没有操作具体的硬件设备,只是在系统里创建
了虚拟设备。在随后的章节中,它们会作为基本驱动程序框架,被本书其他章节的驱动程
序开发所复用。笔者将带领读者编写代码、编译、安装和调试程序。相信对第一次编写驱
动程序的读者来说,这将是非常激动和有趣的。代码的具体讲解将分散在后面的章节论述。
现在请和笔者一起,开始 Windows 驱动编程之旅吧!
1.1 DDK 的安装
在编写第一个驱动之前,需要先安装微软公司提供的 Windows 驱动程序开发包
DDK(Driver Development Kit)。笔者计算机里安装的是 Windows XP 2462 版本的
DDK,建议读者安装同样版本或者更高版本的 DDK,如图 1-1 所示。
在安装的时候请选择完全安装,即安装 DDK 的所有部件,如图 1-2 所示。因为除了
DDK 的基本编译环境外,DDK 还提供了大量的源代码和实用工具,这对于 Windows 驱
动程序的初学者进行学习和编写驱动程序将是非常有用的。
安装完毕后,会在开始菜单中出现相应的项目。其中,主要用到的是 Build
Environment,如图 1-3 所示。该版本的 DDK 会同时安装上 Windows 2000 和
Windows XP 的编译环境。
1.2.1 HelloDDK 的头文件
1.2 第一个驱动程序 HelloDDK 的代码分析
Windows 驱动程序分为两类,一类是不支持即插即用功能的 NT 式驱动程序,另一类
是支持即插即用功能的 WDM 驱动程序。本节介绍的 HelloDDK 是一个最简单的 NT 式驱
动程序。在 1.4 节中将给出一个 WDM 式的驱动程序。
1.2.1 HelloDDK 的头文件
HelloDDK 的头文件主要是为了导入驱动程序开发所必需的 NTDDK.h 头文件,此头文
件里包含了对 DDK 的所有导出函数的声明。NT 式的驱动程序要导入的头文件是
NTDDK.h,而 WDM 式的驱动程序要导入的头文件为 WDM.h。另外,此头文件中定义了
几个标签,分别在程序中指明函数和变量分配在分页内存中或非分页内存中(分页和非分
页内存的概念将在第 3 章中讲述)。最后,该头文件给出了此驱动的函数声明。
#001
/************************************************************************
#002 * 文件名称:Driver.h
#003 * 作 者:张帆
#004 * 完成日期:2007-11-1
#005
*************************************************************************/
#006 #pragma once
#007
#008 #ifdef __cplusplus
#009 extern "C"
#010 {
#011 #endif
#012 #include <NTDDK.h>
#013 #ifdef __cplusplus
#014 }
#015 #endif
#016
#017 #define PAGEDCODE code_seg("PAGE")
#018 #define LOCKEDCODE code_seg()
#019 #define INITCODE code_seg("INIT")
#020
#021 #define PAGEDDATA data_seg("PAGE")
#022 #define LOCKEDDATA data_seg()
#023 #define INITDATA data_seg("INIT")
#024
#025 #define arraysize(p) (sizeof(p)/sizeof((p)[0]))
#026
#027 typedef struct _DEVICE_EXTENSION {
#028 PDEVICE_OBJECT pDevice;
#029 UNICODE_STRING ustrDeviceName;//设备名称
#030 UNICODE_STRING ustrSymLinkName;//符号链接名
#031 } DEVICE_EXTENSION, *PDEVICE_EXTENSION;
#032
#033 // 函数声明
#034
#035 NTSTATUS CreateDevice (IN PDRIVER_OBJECT pDriverObject);
#036 VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);
#037 NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,
#038 IN PIRP pIrp);
#039
此段代码可以在配套光盘中本章的 NT_Driver 目录下找到。
$
代码 6~15 行,包含 ddk.h 头文件,所有的 NT 式驱动程序都要包含此头文件。因为这里
采用的是 C++语言编写,如果直接包含 ntddk.h,函数的符号表会导入错误,所以需要
加入 extern "C",这样可以保证符号表正确导入。关于 C++编写驱动需要注意的地方,
将在第 3 章进行论述。
$
代码 17~23 行,定义分页标记、非分页标记和初始化内存块。在 Windows 驱动程序的
开发中,所有程序的函数和变量要被指明被加载到分页内存中还是在非分页内存中。程序
代码中加入这里定义的宏,就会被指明函数和变量是位于分页或非分页内存中。另外,有
一个特殊的函数 DriverEntry 需要放在 INIT 标志的内存中。INIT 标志指明该函数只是在
加载的时候需要载入内存,而当驱动程序成功加载后,该函数可以从内存中卸载掉。
$
代码 27~31 行,指定一个设备扩展结构体,这种结构体广泛应用于驱动程序中。根据不
同驱动程序的需要,它负责补充定义设备的相关信息。
$
代码 33~38 行是函数的声明。
1.2.2 HelloDDK 的入口函数
和普通的应用程序不同,Windows 驱动程序的入口函数不是 main 函数,而是一个叫做
DriverEntry 的函数,代码将在下面列出。DriverEntry 函数由内核中的 I/O 管理器负责调用,
其函数有两个参数:pDriverObject 和 pRegistryPath。其中,pDriverObject 是 I/O 管理器传递
进来的驱动对象,pRegistryPath 是一个 Unicode 字符串,指向此驱动负责的注册表。
#001
/************************************************************************
#002 * 文件名称:Driver.cpp
#003 * 作 者:张帆
#004 * 完成日期:2007-11-1
#005
*************************************************************************/
#006
#007 #include "Driver.h"
#008
#009
/************************************************************************
#010 * 函数名称:DriverEntry
#011 * 功能描述:初始化驱动程序,定位和申请硬件资源,创建内核对象
#012 * 参数列表:
#013 pDriverObject:从 I/O 管理器中传进来的驱动对象
#014 pRegistryPath:驱动程序在注册表的中的路径
#015 * 返回值:返回初始化驱动状态
#016
*************************************************************************/
#017 #pragma INITCODE
#018 extern "C" NTSTATUS DriverEntry (
#019 IN PDRIVER_OBJECT pDriverObject,
#020 IN PUNICODE_STRING pRegistryPath )
#021 {
#022 NTSTATUS status;
#023 KdPrint(("Enter DriverEntry\n"));
#024
#025 //注册其他驱动调用函数入口
#026 pDriverObject->DriverUnload = HelloDDKUnload;
#027 pDriverObject->MajorFunction[IRP_MJ_CREATE] =
HelloDDKDispatchRoutine;
#028 pDriverObject->MajorFunction[IRP_MJ_CLOSE] =
HelloDDKDispatchRoutine;
剩余40页未读,继续阅读
yuyin86
- 粉丝: 801
- 资源: 20
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- 2022年中国足球球迷营销价值报告.pdf
- 房地产培训 -营销总每天在干嘛.pptx
- 黄色简约实用介绍_汇报PPT模板.pptx
- 嵌入式系统原理及应用:第三章 ARM编程简介_3.pdf
- 多媒体应用系统.pptx
- 黄灰配色简约设计精美大气商务汇报PPT模板.pptx
- 用matlab绘制差分方程Z变换-反变换-zplane-residuez-tf2zp-zp2tf-tf2sos-sos2tf-幅相频谱等等.docx
- 网络营销策略-网络营销团队的建立.docx
- 电子商务示范企业申请报告.doc
- 淡雅灰低面风背景完整框架创业商业计划书PPT模板.pptx
- 计算模型与算法技术:10-Iterative Improvement.ppt
- 计算模型与算法技术:9-Greedy Technique.ppt
- 计算模型与算法技术:6-Transform-and-Conquer.ppt
- 云服务安全风险分析研究.pdf
- 软件工程笔记(完整版).doc
- 电子商务网项目实例规划书.doc
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0