驱动简介.ppt

上传人:京东小超市 文档编号:6149380 上传时间:2020-09-13 格式:PPT 页数:30 大小:278.50KB
返回 下载 相关 举报
驱动简介.ppt_第1页
第1页 / 共30页
驱动简介.ppt_第2页
第2页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《驱动简介.ppt》由会员分享,可在线阅读,更多相关《驱动简介.ppt(30页珍藏版)》请在三一文库上搜索。

1、 驱动简介 石俊 QQ21659779 豫 抱 辗 括 雕 拄 籍 冀 呛 军 轰 第 彦 厨 掺 短 奔 畸 越 练 横 搬 匝 浸 等 蚀 淤 食 郧 勾 滴 惫 驱 动 简 介 驱 动 简 介 目标 驱动的基本概念 驱动的应用 n 作用 n 分类 n 开发环境的搭建 驱动程序示例 n NT驱动代码示例 n WDM驱动代码示例 绦 尧 衣 炕 循 特 趟 丝 开 羡 跟 迫 醛 毕 车 酬 舒 灼 示 店 芭 捐 莹 锰 条 啸 饲 辩 帐 胯 荐 杠 驱 动 简 介 驱 动 简 介 驱动的基本概念 驱动程序,英文名为“Device Driver”,全称为“设备驱动程序”,它是 一种特殊的

2、程序。首先其作用是将硬件本身的功能告诉操作系统,接 下来的主要功能就是完成硬件设备电子信号与操作系统及软件的高级 编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如: 让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程 序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让 声卡播放音乐。 所以简单的说驱动程序提供了硬件到操作系统的一个接口以及协调二 者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“ 驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称 为“硬件和系统之间的桥梁”。 摈 正 禄 拴 症 阮 庆 庞 茸 尾 骏 掣 硕 玫 耘 芦

3、峰 忘 敌 兹 稿 赤 械 懂 择 靛 耽 过 厌 环 咸 吨 驱 动 简 介 驱 动 简 介 驱动的应用 只有通过驱动程序,操作系统才能控制电脑上 的硬件设备,所以说电脑的每一个硬件都离不 开驱动程序 盼 沈 苍 开 抢 诌 智 撂 怖 姬 规 庄 苗 堤 歌 设 埔 悼 羌 裁 楼 奠 舱 吧 诡 短 丢 巾 耐 究 励 宇 驱 动 简 介 驱 动 简 介 疑问 CPU等设备为什么不用装驱动程序? 像U盘这种USB设备直接连接到电脑就可以使用了,这是为什么? 有了高版本的操作系统,我是否还需要安装驱动程序? 舜 词 滑 娱 葫 炔 潜 带 豌 概 潜 翘 房 歇 甄 忠 犊 瘩 伦 董 张

4、 返 卯 缚 旧 氢 绦 寡 绒 蝴 缄 蜒 驱 动 简 介 驱 动 简 介 驱动分类 驱动程序按其服务的不同硬件对象,可以分为主板驱 动、显卡驱动、声卡驱动等。 按操作系统的不同也可以分为For Windows XP、For Vista、For Win7、For Linux等。 根据设计标准和发行情况的不同可分为公版驱动程序 、非公版驱动程序和正式版驱动程序、非正式版驱动 程序。 根据安装、加载等方式的不同分成NT驱动和WDM驱 动。 n WDM是即插即用, 通过inf来加载 n NT式不支持即插即用,通过服务来加载 拽 焙 补 卯 屁 脸 茁 芝 聪 拖 豆 修 迟 轨 匠 寻 培 谷 殆

5、 韩 炙 弟 玻 欧 舜 异 绷 惧 耗 吠 班 忻 驱 动 简 介 驱 动 简 介 开发环境的搭建 VM Microsoft Visual C+ Windows Driver development kit(ddk) Compuware DriverStudio,WinDbj 夯 式 涤 瞻 管 陪 床 铅 病 船 剑 闯 佳 跺 侮 郴 砷 筷 镜 疮 横 迫 休 权 犀 馈 漆 倍 端 棕 敬 捞 驱 动 简 介 驱 动 简 介 DDK的安装 DDK也叫驱动程序开发包(Driver Development Kit)。 图1 DDK的安装 鸥 陈 徐 笋 扎 肄 骡 苦 冤 哲 鲸 铁 彤

6、 洒 刮 夕 憨 又 聘 湖 猎 蹿 衙 翁 簿 袒 弘 乘 努 冗 烽 热 驱 动 简 介 驱 动 简 介 图2 DDK安装 峨 磕 许 催 轩 奉 撰 疵 警 痒 涡 贤 浊 笔 少 羞 蔗 粒 峙 晒 弗 吕 呛 氯 案 唬 浙 蛇 镑 颗 线 贝 驱 动 简 介 驱 动 简 介 NT驱动代码示例分析 NT驱动头文件说明 NT驱动入口函数 创建设备例程 卸载驱动例程 默认派遣例程 狄 蛹 施 魁 呢 体 碧 渝 舟 聊 缄 投 遍 宝 肮 略 肮 甫 坎 亡 医 睦 左 稍 陛 涟 皋 恿 线 辊 怖 址 驱 动 简 介 驱 动 简 介 NT驱动头文件说明 #ifdef _cpluspl

7、us extern “C“/如果直接包含ntddk.h,函数的符号表会导入错误 #endif #include #ifdef _cplusplus #endif typedef struct _DEVICE_EXTENSION PDEVICE_OBJECT pDevice;/设备对象的指针 UNICODE_STRING ustrDeviceName;/设备名称 UNICODE_STRING ustrSymLinkName;/符号链接名 DEVICE_EXTENSION, *PDEVICE_EXTENSION; / 函数声明 NTSTATUS CreateDevice (IN PDRIVER_O

8、BJECT pDriverObject);/创建设备例程 VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject);/驱动卸载例程 NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);/默认派遣例程 疮 剃 侯 介 右 拧 浩 宫 滴 泵 呀 矫 抉 恒 震 已 交 桂 葛 淮 晦 烩 呆 财 连 巫 钾 理 蚜 榔 栖 绚 驱 动 简 介 驱 动 简 介 NT驱动入口函数 extern C NTSTATUS DriverEntry ( IN PDRI

9、VER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath ) NTSTATUS status; KdPrint(Enter DriverEntryn); /注册其他驱动调用函数入口 pDriverObject-DriverUnload = HelloDDKUnload; pDriverObject-MajorFunctionIRP_MJ_CREATE = HelloDDKDispatchRoutine; pDriverObject-MajorFunctionIRP_MJ_CLOSE = HelloDDKDispatchRoutine;

10、 pDriverObject-MajorFunctionIRP_MJ_WRITE = HelloDDKDispatchRoutine; pDriverObject-MajorFunctionIRP_MJ_READ = HelloDDKDispatchRoutine; /创建驱动设备对象 status = CreateDevice(pDriverObject); KdPrint(DriverEntry endn); return status; 盛 漱 杜 越 奉 脖 佰 刮 向 喉 澈 哥 胰 膀 留 蔬 压 豹 俯 攻 杆 课 哦 洗 殆 柔 劲 掌 绪 寸 郡 揖 驱 动 简 介 驱 动

11、简 介 创建设备例程 NTSTATUS CreateDevice ( IN PDRIVER_OBJECTpDriverObject) NTSTATUS status; PDEVICE_OBJECT pDevObj; PDEVICE_EXTENSION pDevExt; /创建设备名称 UNICODE_STRING devName; RtlInitUnicodeString( /创建设备 status = IoCreateDevice( pDriverObject, sizeof(DEVICE_EXTENSION), if (!NT_SUCCESS(status) return status;

12、肚 捐 黔 衡 傻 禽 愉 皋 褥 蜗 蝴 豁 价 唤 滞 瞬 千 棘 窑 塞 索 碑 澜 末 颂 抵 好 贝 从 咙 漾 桶 驱 动 简 介 驱 动 简 介 pDevObj-Flags |= DO_BUFFERED_IO; pDevExt = (PDEVICE_EXTENSION)pDevObj-DeviceExtension; pDevExt-pDevice = pDevObj; pDevExt-ustrDeviceName = devName; /创建符号链接 UNICODE_STRING symLinkName; RtlInitUnicodeString( pDevExt-ustrSy

13、mLinkName = symLinkName; status = IoCreateSymbolicLink( if (!NT_SUCCESS(status) IoDeleteDevice( pDevObj ); return status; return STATUS_SUCCESS; 徘 岔 廓 县 缝 新 辕 竣 创 刃 将 源 豹 袄 擒 村 敷 洽 广 素 嗽 咎 漆 机 等 臆 蕉 咽 灭 暇 呈 滓 驱 动 简 介 驱 动 简 介 卸载驱动例程 VOID HelloDDKUnload (IN PDRIVER_OBJECT pDriverObject) PDEVICE_OBJECT

14、pNextObj; KdPrint(Enter DriverUnloadn); pNextObj = pDriverObject-DeviceObject; while (pNextObj != NULL) PDEVICE_EXTENSION pDevExt = (PDEVICE_EXTENSION) pNextObj-DeviceExtension; /删除符号链接 UNICODE_STRING pLinkName = pDevExt-ustrSymLinkName; IoDeleteSymbolicLink( pNextObj = pNextObj-NextDevice; IoDelete

15、Device( pDevExt-pDevice ); 拴 钉 婆 纹 牛 须 吞 柿 啸 钒 挝 葵 舶 牌 彰 酶 祈 咸 母 犁 侍 淳 溃 耍 飞 膜 诡 洗 檀 酌 颐 掳 驱 动 简 介 驱 动 简 介 默认派遣例程 NTSTATUS HelloDDKDispatchRoutine(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp) KdPrint(Enter HelloDDKDispatchRoutinen); NTSTATUS status = STATUS_SUCCESS; / 完成IRP pIrp-IoStatus.Status = status

16、; pIrp-IoStatus.Information = 0;/ bytes xfered IoCompleteRequest( pIrp, IO_NO_INCREMENT ); KdPrint(Leave HelloDDKDispatchRoutinen); return status; 胖 棍 瞬 颜 适 慕 咖 牛 滦 感 宜 板 敝 谓 骸 踊 佐 橡 祥 浸 蛆 快 纪 衍 墅 章 尔 绩 菩 荧 烙 惠 驱 动 简 介 驱 动 简 介 WDM驱动代码示例分析 WDM头文件 WDM驱动入口函数 AddDevice例程 处理PNP的回调函数 对PNP的默认处理 对IRP_MN_REM

17、OVE_DEVICE的处理 其他IRP的回调函数 卸载例程 贫 际 汇 贯 洞 增 泊 猎 铜 杉 骋 搐 摄 换 佣 痞 社 恭 杜 禁 头 氟 财 懊 陈 炯 印 疲 春 兄 聋 续 驱 动 简 介 驱 动 简 介 WDM头文件 #ifdef _cplusplus extern C #endif #include #ifdef _cplusplus #endif typedef struct _DEVICE_EXTENSION PDEVICE_OBJECT fdo;/功能设备对象 PDEVICE_OBJECT NextStackDevice;/下层驱动设备 UNICODE_STRING u

18、strDeviceName;/ 设备名 UNICODE_STRING ustrSymLinkName;/ 符号链接名 DEVICE_EXTENSION, *PDEVICE_EXTENSION; #define arraysize(p) (sizeof(p)/sizeof(p)0) NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath); /入口函数 NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject,IN PDEVIC

19、E_OBJECT PhysicalDeviceObject); /AddDevice例程 NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo,IN PIRP Irp); /处理PNP的回调函数 NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx, PIRP Irp); /对PNP的默认处理 NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx, PIRP Irp); /对IRP_MN_REMOVE_DEVICE的处理 NTSTATUS HelloWDMDispatchR

20、outine(IN PDEVICE_OBJECT fdo,IN PIRP Irp); /对其他IRP的回调函数 void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject);/卸载例程 绅 壕 致 柯 相 骑 奖 椎 索 芬 一 遁 返 瞩 情 砰 凉 即 碘 厘 注 亩 铃 锁 蛔 友 渭 陈 僳 垫 客 微 驱 动 简 介 驱 动 简 介 WDM驱动的入口函数 extern C NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING pRegistryPath

21、) KdPrint(Enter DriverEntryn); pDriverObject-DriverExtension-AddDevice = HelloWDMAddDevice; pDriverObject-MajorFunctionIRP_MJ_PNP = HelloWDMPnp; pDriverObject-MajorFunctionIRP_MJ_DEVICE_CONTROL = pDriverObject-MajorFunctionIRP_MJ_CREATE = pDriverObject-MajorFunctionIRP_MJ_READ = pDriverObject-MajorF

22、unctionIRP_MJ_WRITE = HelloWDMDispatchRoutine; pDriverObject-DriverUnload = HelloWDMUnload; KdPrint(Leave DriverEntryn); return STATUS_SUCCESS; 惦 困 议 楚 耐 硼 哮 匪 扭 叁 樱 爱 氟 叛 七 较 瓜 侈 价 惨 敏 缀 头 晴 泪 噶 谊 传 喂 遇 棺 榴 驱 动 简 介 驱 动 简 介 AddDevice例程 NTSTATUS HelloWDMAddDevice(IN PDRIVER_OBJECT DriverObject, IN PD

23、EVICE_OBJECT PhysicalDeviceObject) PAGED_CODE(); KdPrint(Enter HelloWDMAddDevicen); NTSTATUS status; PDEVICE_OBJECT fdo; UNICODE_STRING devName; RtlInitUnicodeString( status = IoCreateDevice( DriverObject, sizeof(DEVICE_EXTENSION), if( !NT_SUCCESS(status) return status; PDEVICE_EXTENSION pdx = (PDEV

24、ICE_EXTENSION)fdo-DeviceExtension; pdx-fdo = fdo; pdx-NextStackDevice = IoAttachDeviceToDeviceStack(fdo, PhysicalDeviceObject); UNICODE_STRING symLinkName; RtlInitUnicodeString( 单 然 延 吊 吱 摹 卞 窥 筷 臭 窿 忍 君 应 童 祸 庐 垛 杉 贼 凭 眷 韩 偿 银 盘 迷 喇 廉 择 失 额 驱 动 简 介 驱 动 简 介 pdx-ustrDeviceName = devName; pdx-ustrSymL

25、inkName = symLinkName; status = IoCreateSymbolicLink( if( !NT_SUCCESS(status) IoDeleteSymbolicLink( status = IoCreateSymbolicLink( if( !NT_SUCCESS(status) return status; fdo-Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE; fdo-Flags KdPrint(Leave HelloWDMAddDevicen); return STATUS_SUCCESS; 腺 鹏 倾 缉 哟 江 阮

26、饭 燥 缝 阮 厉 汀 合 骏 肝 对 班 瞥 掳 仁 腔 富 刨 蛰 疹 勇 氟 奋 吨 令 填 驱 动 简 介 驱 动 简 介 处理PNP的回调函数 NTSTATUS HelloWDMPnp(IN PDEVICE_OBJECT fdo, IN PIRP Irp) PAGED_CODE(); KdPrint(Enter HelloWDMPnpn); NTSTATUS status = STATUS_SUCCESS; PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION) fdo-DeviceExtension; PIO_STACK_LOCATION stack

27、 = IoGetCurrentIrpStackLocation(Irp); static NTSTATUS (*fcntab)(PDEVICE_EXTENSION pdx, PIRP Irp) = DefaultPnpHandler,/ IRP_MN_START_DEVICE DefaultPnpHandler,/ IRP_MN_QUERY_REMOVE_DEVICE HandleRemoveDevice,/ IRP_MN_REMOVE_DEVICE DefaultPnpHandler,/ IRP_MN_CANCEL_REMOVE_DEVICE DefaultPnpHandler,/ IRP_

28、MN_STOP_DEVICE DefaultPnpHandler,/ IRP_MN_QUERY_STOP_DEVICE DefaultPnpHandler,/ IRP_MN_CANCEL_STOP_DEVICE DefaultPnpHandler,/ IRP_MN_QUERY_DEVICE_RELATIONS DefaultPnpHandler,/ IRP_MN_QUERY_INTERFACE DefaultPnpHandler,/ IRP_MN_QUERY_CAPABILITIES DefaultPnpHandler,/ IRP_MN_QUERY_RESOURCES DefaultPnpHa

29、ndler,/ IRP_MN_QUERY_RESOURCE_REQUIREMENTS DefaultPnpHandler,/ IRP_MN_QUERY_DEVICE_TEXT DefaultPnpHandler,/ IRP_MN_FILTER_RESOURCE_REQUIREMENTS DefaultPnpHandler,/ DefaultPnpHandler,/ IRP_MN_READ_CONFIG DefaultPnpHandler,/ IRP_MN_WRITE_CONFIG DefaultPnpHandler,/ IRP_MN_EJECT DefaultPnpHandler,/ IRP_

30、MN_SET_LOCK DefaultPnpHandler,/ IRP_MN_QUERY_ID DefaultPnpHandler,/ IRP_MN_QUERY_PNP_DEVICE_STATE DefaultPnpHandler,/ IRP_MN_QUERY_BUS_INFORMATION DefaultPnpHandler,/ IRP_MN_DEVICE_USAGE_NOTIFICATION DefaultPnpHandler,/ IRP_MN_SURPRISE_REMOVAL ; 纂 爪 醒 啼 荆 凡 弓 怂 眠 佩 雌 入 睛 螟 滨 屉 丸 寄 惶 仙 斩 吗 盯 踏 这 抽 稽

31、妥 共 惕 伴 释 驱 动 简 介 驱 动 简 介 ULONG fcn = stack-MinorFunction; if (fcn = arraysize(fcntab) status = DefaultPnpHandler(pdx, Irp); / some function we dont know about return status; #if DBG static char* fcnname = IRP_MN_START_DEVICE, IRP_MN_QUERY_REMOVE_DEVICE, IRP_MN_REMOVE_DEVICE, IRP_MN_CANCEL_REMOVE_DE

32、VICE, IRP_MN_STOP_DEVICE, IRP_MN_QUERY_STOP_DEVICE, IRP_MN_CANCEL_STOP_DEVICE, IRP_MN_QUERY_DEVICE_RELATIONS, IRP_MN_QUERY_INTERFACE, IRP_MN_QUERY_CAPABILITIES, IRP_MN_QUERY_RESOURCES, IRP_MN_QUERY_RESOURCE_REQUIREMENTS, IRP_MN_QUERY_DEVICE_TEXT, IRP_MN_FILTER_RESOURCE_REQUIREMENTS, , IRP_MN_READ_CO

33、NFIG, IRP_MN_WRITE_CONFIG, IRP_MN_EJECT, IRP_MN_SET_LOCK, IRP_MN_QUERY_ID, IRP_MN_QUERY_PNP_DEVICE_STATE, IRP_MN_QUERY_BUS_INFORMATION, IRP_MN_DEVICE_USAGE_NOTIFICATION, IRP_MN_SURPRISE_REMOVAL, ; 计 廖 芽 盯 荧 向 臻 衫 剿 桌 喧 溺 变 冬 韦 辣 讫 砰 频 岗 脓 颖 否 商 颇 勒 峡 事 逾 芦 钉 吼 驱 动 简 介 驱 动 简 介 KdPrint(PNP Request (%s

34、)n, fcnnamefcn); #endif / DBG status = (*fcntabfcn)(pdx, Irp); KdPrint(Leave HelloWDMPnpn); return status; 腾 见 柜 维 鼓 墟 怖 票 翅 颇 瑞 慷 讲 域 为 料 啸 伦 培 光 燃 记 镊 徽 祷 拔 敏 格 龚 丧 遵 井 驱 动 简 介 驱 动 简 介 对PNP的默认处理 NTSTATUS DefaultPnpHandler(PDEVICE_EXTENSION pdx, PIRP Irp) PAGED_CODE(); KdPrint(Enter DefaultPnpHandl

35、ern); IoSkipCurrentIrpStackLocation(Irp); KdPrint(Leave DefaultPnpHandlern); return IoCallDriver(pdx-NextStackDevice, Irp); 湛 闸 引 汕 买 卫 琵 唐 涌 臀 雏 镑 雄 教 辈 蹄 瞻 鲁 缀 水 授 百 呆 几 径 遁 扼 颤 肌 贩 莎 净 驱 动 简 介 驱 动 简 介 对IRP_MN_REMOVE_DEVICE的处理 NTSTATUS HandleRemoveDevice(PDEVICE_EXTENSION pdx, PIRP Irp) PAGED_CODE

36、(); KdPrint(Enter HandleRemoveDevicen); Irp-IoStatus.Status = STATUS_SUCCESS; NTSTATUS status = DefaultPnpHandler(pdx, Irp); IoDeleteSymbolicLink( /调用IoDetachDevice()把fdo从设备栈中脱开: if (pdx-NextStackDevice) IoDetachDevice(pdx-NextStackDevice); /删除fdo: IoDeleteDevice(pdx-fdo); KdPrint(Leave HandleRemove

37、Devicen); return status; 锭 缆 囊 蕾 韶 刑 涨 续 华 错 哀 纽 次 育 乘 南 规 楼 名 惋 阎 爸 操 濒 腹 沼 痹 酣 牧 海 扇 牟 驱 动 简 介 驱 动 简 介 对其他IRP的回调函数 NTSTATUS HelloWDMDispatchRoutine(IN PDEVICE_OBJECT fdo, IN PIRP Irp) PAGED_CODE(); KdPrint(Enter HelloWDMDispatchRoutinen); Irp-IoStatus.Status = STATUS_SUCCESS; Irp-IoStatus.Informat

38、ion = 0;/ no bytes xfered IoCompleteRequest( Irp, IO_NO_INCREMENT ); KdPrint(Leave HelloWDMDispatchRoutinen); return STATUS_SUCCESS; 晨 赋 昼 晾 净 咨 昌 跋 痢 巷 狞 菱 媚 漠 蹄 非 差 缅 匡 运 汹 堕 旗 坝 借 擒 蛇 爽 右 特 辜 赊 驱 动 简 介 驱 动 简 介 卸载例程 void HelloWDMUnload(IN PDRIVER_OBJECT DriverObject) PAGED_CODE(); KdPrint(Enter He

39、lloWDMUnloadn); KdPrint(Leave HelloWDMUnloadn); 匙 糠 暮 蹿 晨 磅 相 掂 君 轩 嫡 闻 德 因 蠢 挂 紫 她 狸 抱 墅 瓶 赎 汲 郡 垢 免 难 小 钞 婪 面 驱 动 简 介 驱 动 简 介 总结 驱动是什么。 驱动有什么用。 驱动的分类。 针对开发人员,NT驱动和WDM驱动的代码基 本示例与说明。初步了解他们之间的区别(编 写代码)。 练习与手动编写。 澄 曰 篆 褐 斟 话 笆 兔 鞭 篓 袋 被 装 肚 缩 汕 渺 拱 谣 父 线 艰 缆 哪 轰 撮 锨 涩 螺 豁 醉 鹰 驱 动 简 介 驱 动 简 介 瞅 舜 缸 宁 恋 际 驶 逸 赎 迭 萧 骚 东 痰 闻 瑚 瞎 嗽 式 夺 斧 颊 创 帘 陷 冻 迢 撼 观 鲍 壹 攻 驱 动 简 介 驱 动 简 介

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1