ImageVerifierCode 换一换
格式:DOC , 页数:4 ,大小:31.50KB ,
资源ID:3502279      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-3502279.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Windows2000驱动程序的设计.doc)为本站会员(sk****8)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

Windows2000驱动程序的设计.doc

1、Windows 2000驱动程序的设计2003-3-25 12:41:59 VCPROGRAM 谭章熹 阅读次数: 135961. 简介: - Windows 2000原名 Windows NT 5.0是继 Windows NT 4.0的新一代操作系统,它不但继承了 Windows NT 4.0的种种优点,而且在技术上又有了许多的突破,其中一项就是对驱动程序结构的变化,即引入了全新的 WDM (Win32 Driver Model)的驱动程序构架。说是新技术,其实早在 1997年 Microsoft就提出了该项技术并在 Windows 98中得到了充分的应用,换句话说,Windows 98 也

2、支持 WDM。这样 WDM就成为了一个跨平台的驱动程序模型,不仅如此 WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非 Intel平台上运行,可以不夸张的讲 WDM算得上是 21世纪的驱动程序构架。 2WDM 的工作原理: WDM是在 NT 4.0驱动程序结构上发展起来的,所以它与 NT 4.0的驱动程序极为相似,但是它却有了本质上的提高,比如它支持 USB、IEEE 1394、ACPI 等全新的硬件标准。虽然Windows 98与 Windows 2000都支持 WDM,可是并不意味着 Windows 98下的 VxD可以在Windows 2000下运行,而 NT下的 VDD却可

3、以在 Windows 98下运行。不过原先准备在两个平台上同时运行需要编写两个截然不同的驱动程序,而现在只需要编写一个 WDM驱动程序就可以了。同 NT 4.0驱动程序一样,WDM 驱动程序也是分层的,即不同层上的驱动程序有着不同的优先权,而 Windows 9x下的 VxD则没有此结构。另外,WDM 还引入了功能设备对象 FDO(functional device object)与物理设备对象 PDO(physical device object)两个新概念来描述硬件,一个 PDO代表一个真实硬件,在驱动程序看来则是一个 FDO,见图1。另外值得注意的是,一个硬件只允许有一个 PDO,但却可

4、以拥有多个 FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的 PDO与 FDO。在 Ring-3与 Ring-0通讯方面,操作系统为每一个用户请求打包成一个 IRP(IO Request Packet)结构,将其发送至驱动程序并通过识别 IRP中的 PDO来识别是发送给哪一个设备的。另外,在驱动程序的加载方面 WDM既不靠驱动程序名称也不靠一个具有某种特殊意义的 ID,而是依靠一个 128位的GUID来识别驱动程序(Windows 下许多东西都是靠此进行识别的)。 3具体实现: 同许多应用程序一样,WDM 驱动程序是 PE格式的,但是它却没有 WinMain或 main这样的入口,取而

5、代之的是 DriverEntry: NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, /不同于前面的 PDO IN PUNICODE_STRING RegistryPath) DriverObject- DriverExtension- AddDevice = AddDevice; / DriverExtension 中存放着驱动程序扩展信息,包括设备所需要的硬件资源等。 DriverObject- MajorFunctionIRP_MJ_CREATE = RequestCreate; DriverObject- MajorFunctio

6、nIRP_MJ_CLOSE = RequestClose; DriverObject- MajorFunctionIRP_MJ_DEVICE_CONTROL = RequestControl; DriverObject- MajorFunctionIRP_MJ_PNP = RequestPnp; return STATUS_SUCCESS; - 在 DriverEntry驱动程序要向操作系统登记并注册一些消息处理器,而且还要指明是否对驱动程序输入输出的数据进行缓冲,另外还要我们提供一个 AddDevice例程来把驱动程序添加到驱动程序堆栈中。其中,IRP_MJ_XXXXX 为驱动程序所收到的系

7、统消息,RequestXXXXX为相应的消息处理函数。在客户端程序中,我们一般要采用DeviceIoControl通过自定义的控制码与驱动程序通信(在 VxD中大多也采用这种方式)。看看驱动程序所收到的系统消息,我们不难发现当用户调用 DeviceIoControl时操作系统就会向驱动程序发出一条 IRP_MJ_DEVICE_CONTROL消息,以触发 RequestControl消息处理函数。 NTSTATUS RequestControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) PIO_STACK_LOCATION IrpStack; UL

8、ONG ControlCode; ULONG InputLength,OutputLength; NTSTATUS status; IrpStack=IoGetCurrentIrpStackLocation(Irp); /获取当前 IRP所在的 I/O堆栈 ControlCode=IrpStack- Parameters.DeviceIoControl. IoControlCode; /取得控制码 InputLength=IrpStack- Parameters.DeviceIoControl. InputBufferLength; /取输入缓冲区大小 OutputLength=IrpStac

9、k- Parameters.DeviceIoControl. OutputBufferLength;/取输出缓冲区大小 switch(ControlCode) case HELLOWDM_IOCTL_HELLO: DbgPrint (“Hello from WDM.n“);/向调试器输出字符串 status=STATUS_SUCCESS; /置返回值 break; default: status=STATUS_INVALID_DEVICE_REQUEST; /输入的控制码不支持 return CompleteRequest(Irp, status, 0); /调用 CompleteReques

10、t通知操作系统完成 IRP操作 - 在客户端方面,先调用 Setupapi.dll中的 SetupDiGetClassDevs 并用上面提到的128位 GUID 建立 Ring-0与 Ring-3接口: -HDEVINFO info=SetupDiGetClassDevs (LPGUID) 然后使用SetupDiEnumDeviceInterfaces 对所获得的接口进行枚举以获得接口数据,接着连续两次调用 SetupDiGetDeviceInterfaceDetail 获得接口详细信息,其中包括调用 CreateFil e所需的一个型为.0000000000000004# 3d93c5c0-

11、0085-11d1-821e-0080c88327ab 的字符串,最后调用方法和 VxD的调用大体相同这里就不赘述了。不过由于使用了Setupapi.dll中的 API所以还需要使用 SetupDiDestroyDeviceInfoList 来释放所申请的资源。 - 4几点说明: - 由于 WDM是跨平台和跨操作系统的的驱动程序模型,所以在编写时一定不要使用汇编。另外,在编写时还应注意对 IRP_MJ_PNP消息的响应以及其他系统消息的传递,这里的传递是向其它在驱动程序堆栈中的驱动程序而不是向客户端程序,详细的信息请参考本文所提供的例程。最后,由于笔者写此文章时 Windows 2000尚未正式发布,一切的编写工作都是在 Windows 98上用 98DDK与 VC6.0完成的,并且用 Numega SoftIce 4.0调试通过。 您编译后有什么意见欢迎来信告知: E-mail: 清华大学电子工程系 谭章熹

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。