Windows 2000驱动程序的设计

[日期:2005-1-22] 来源:网友上载  作者:未知 [字体:大 中 小]

1. 简介:

---- Windows 2000原名Windows NT 5.0是继Windows NT 4.0的新一代操作系统,它不但继承了Windows NT 4.0的种种优点,而且在技术上又有了许多的突破,其中一项就是对驱动程序结构的变化,即引入了全新的WDM (Win32 Driver Model)的驱动程序构架。说是新技术,其实早在1997年Microsoft就提出了该项技术并在Windows 98中得到了充分的应用,换句话说,Windows 98也支持WDM。这样WDM就成为了一个跨平台的驱动程序模型,不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行,可以不夸张的讲WDM算得上是21世纪的驱动程序构架。
    2.WDM的工作原理:

WDM是在NT 4.0驱动程序结构上发展起来的,所以它与NT 4.0的驱动程序极为相似,但是它却有了本质上的提高,比如它支持USB、IEEE 1394、ACPI等全新的硬件标准。虽然Windows 98与Windows 2000都支持WDM,可是并不意味着Windows 98下的VxD可以在Windows 2000下运行,而NT下的VDD却可以在Windows 98下运行。不过原先准备在两个平台上同时运行需要编写两个截然不同的驱动程序,而现在只需要编写一个WDM驱动程序就可以了。同NT 4.0驱动程序一样,WDM驱动程序也是分层的,即不同层上的驱动程序有着不同的优先权,而Windows 9x下的VxD则没有此结构。另外,WDM还引入了功能设备对象FDO(functional device object)与物理设备对象PDO(physical device object)两个新概念来描述硬件,一个PDO代表一个真实硬件,在驱动程序看来则是一个FDO,见图1。另外值得注意的是,一个硬件只允许有一个PDO,但却可以拥有多个FDO,而在驱动程序中我们不是直接操作硬件而是操作相应的PDO与FDO。在Ring-3与Ring-0通讯方面,操作系统为每一个用户请求打包成一个IRP(IO Request Packet)结构,将其发送至驱动程序并通过识别IRP中的PDO来识别是发送给哪一个设备的。另外,在驱动程序的加载方面WDM既不*驱动程序名称也不*一个具有某种特殊意义的ID,而是依*一个128位的GUID来识别驱动程序(Windows下许多东西都是*此进行识别的)。

3.具体实现:

同许多应用程序一样,WDM驱动程序是PE格式的,但是它却没有WinMain或main这样的入口,取而代之的是DriverEntry:

NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,    
    //不同于前面的PDO
                      
IN PUNICODE_STRING RegistryPath)
{
DriverObject- >DriverExtension- >AddDevice =
AddDevice;    // DriverExtension

中存放着驱动程序扩展信息,包括设备所需要的硬件资源等。
DriverObject- >MajorFunction[IRP_MJ_CREATE]
= RequestCreate;
DriverObject- >MajorFunction[IRP_MJ_CLOSE]
= RequestClose;
DriverObject- >MajorFunction[IRP_MJ_DEVICE_CONTROL]
= RequestControl;
DriverObject- >MajorFunction[IRP_MJ_PNP]
= RequestPnp;
    return STATUS_SUCCESS;
}

---- 在DriverEntry驱动程序要向操作系统登记并注册一些消息处理器,而且还要指明是否对驱动程序输入输出的数据进行缓冲,另外还要我们提供一个AddDevice例程来把驱动程序添加到驱动程序堆栈中。其中,IRP_MJ_XXXXX为驱动程序所收到的系统消息,RequestXXXXX为相应的消息处理函数。在客户端程序中,我们一般要采用DeviceIoControl通过自定义的控制码与驱动程序通信(在VxD中大多也采用这种方式)。看看驱动程序所收到的系统消息,我们不难发现当用户调用DeviceIoControl时操作系统就会向驱动程序发出一条IRP_MJ_DEVICE_CONTROL消息,以触发RequestControl消息处理函数。

NTSTATUS RequestControl(IN PDEVICE_OBJECT
DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION IrpStack;
    ULONG ControlCode;
    ULONG InputLength,OutputLength;
    NTSTATUS status;

IrpStack=IoGetCurrentIrpStackLocation(Irp);    
//获取当前IRP所在的I/O堆栈
ControlCode=IrpStack- >Parameters.DeviceIoControl.
IoControlCode;       //取得控制码
InputLength=IrpStack- >Parameters.DeviceIoControl.
InputBufferLength;  //取输入缓冲区大小
OutputLength=IrpStack- >Parameters.DeviceIoControl.
OutputBufferLength;//取输出缓冲区大小
switch(ControlCode)
    {
case HELLOWDM_IOCTL_HELL    DbgPrint
("Hello from WDM./n");//向调试器输出字符串
    status=STATUS_SUCCESS;         //置返回值    
                break;
default:        status=STATUS_INVALID_DEVICE_REQUEST;
            //输入的控制码不支持
    }
    return CompleteRequest(Irp, status, 0);
//调用CompleteRequest通知操作系统完成IRP操作
}

---- 在客户端方面,先调用Setupapi.dll中的 SetupDiGetClassDevs并用上面提到的128位 GUID建立Ring-0与Ring-3接口:

---- HDEVINFO info=SetupDiGetClassDevs ((LPGUID)&GUID_HELLOWDM,NULL, //GUID_HELLOWDM 是128位GUID NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE); 然后使用SetupDiEnumDeviceInterfaces 对所获得的接口进行枚举以获得接口数据,接着连续两次调用SetupDiGetDeviceInterfaceDetail 获得接口详细信息,其中包括调用CreateFil e所需的一个型为//./0000000000000004# {3d93c5c0-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调试通过。
<script event=onload for=window type=text/javascript>ImgLoad(document.getElementById("BodyLabel"));</script>

阅读:179 次
录入:录入员001
【 评论 】 【 推荐 】

Windows 2000驱动程序的设计相关推荐

  1. Windows 2000和WindowsXP中神秘的数字签名

    大家知道吗?微软发布的具有数字签名的SP2才是正式版本(右击打开文件属性窗口可以查看到图1所示的数字签名信息),这是怎么一回事呢? 图1 一.Windows的文件保护功能 在Windows 2000以 ...

  2. 在Windows 2000下优化Oracle9i性能[转]

    一.优化磁盘配置 Oracle是一个磁盘I/O强烈的应用,要确保你恰当地配置磁盘和文件系统: 1.在磁盘上建立数据文件前首先运行磁盘碎片整理程序 为了安全地整理磁盘碎片,需关闭打开数据文件的实例,并且 ...

  3. 服务器群集:Windows 2000 和 Windows Server 2003 网络配置的最佳做法(转自Technet)

    摘要 本文为 Microsoft Windows 2000 或 Windows Server 2003 服务器群集的网络基础结构提供了服务器群集要求和最佳做法.若要群集可以正常运行,必须满足这些要求. ...

  4. Windows 2000的电源管理

    Windows 2000(包括Microsoft Windows 2000 Professional.Microsoft Windows 2000 Server.Microsoft Windows 2 ...

  5. 在Windows 2000下优化Oracle9i性能

    导读:  一.优化磁盘配置  Oracle是一个磁盘I/O强烈的应用,要确保你恰当地配置磁盘和文件系统:  在磁盘上建立数据文件前首先运行磁盘碎片整理程序  为了安全地整理磁盘碎片,需关闭打开数据文件 ...

  6. 第一章 Windows 2000对调试技术的支持

    第一章  Windows 2000对调试技术的支持 翻译:Kendiv 更新: Friday, January 14, 2005 内核调试器的命令 尽管调试器的命令已经注意了易记性,但有时总是难以回忆 ...

  7. 《Undocumented Windows 2000 Secrets》翻译 --- 第一章(2)

    第一章  Windows 2000对调试技术的支持 翻译:Kendiv(fcczj@263.net) 更新: Friday, January 18, 2005 声明:转载请注明出处,并保证文章的完整性 ...

  8. WINDOWS 2000下如何获得用户登录名和密码

    --  WINDOWS 2000下如何获得用户登录名和密码 WINDOWS 2000下如何获得用户登录名和密码 作者:moonstone 下载本文示例源代码一.原理 在NT/2000中交互式的登陆支持 ...

  9. Windows 2000系统编程 (1)

    第1章纵览Windows 2000 毫不隐瞒地说,我是一个科幻迷.但是,我认为现实中的科幻描述很荒谬可笑.虽然我能 接受存在生物圈和星系帝国的事实,甚至可以接受超光速的星际飞行器,但是我不能接受的是 ...

最新文章

  1. PDF文字怎么编辑,PDF文档编辑方法
  2. C语言 | 使用牛顿法求非线性方程的一个实根(附代码)
  3. linux ora 01092,ORA-01173的模拟与故障处理
  4. 高嘌呤食物搜索引擎_“高嘌呤”的食物已发现,尿酸高的人,要尽量挑着吃!...
  5. Oracle数据库 invalid character问题解决
  6. java jar 版本号,比较两个jar包的版本号
  7. 普联技术java工程师_【普联技术(TP-LINK)工资】java开发工程师待遇-看准网
  8. 2020 美国大选在即,又到了 AI 花式打击假新闻的季节
  9. 混淆Android JAR包的方法
  10. 第五章 多个消费者监听同一个队列
  11. Kafka权威指南,初识 Kafka
  12. wuyun知识库目录
  13. erp系统实施方案会遇到哪些问题?
  14. google书签删除了怎么恢复?谷歌浏览器删除的书签怎么恢复?
  15. matlab用直接三角分解法求解方程式,数值分析中直接三角分解法matlab程序.pdf
  16. 1.2折半查找法的使用
  17. 大道至简 知易行难 JAVA 完成WebSocket demo 用GoEasy实现Hello world
  18. 简述人工神经网络的作用,简述人工神经网络
  19. 小白站QQ资料库网站查询源码
  20. 计算机与外设维修初级,计算机的外设维修实例论文.docx

热门文章

  1. 怎么才能制作一个比较好的网站
  2. spring事务的传播行为的讲解(笔记 侵删)
  3. 蓝桥杯2017国赛 瓷砖样式 dfs+map
  4. android扇形动画弹出icon的功能
  5. 微信小程序中显示换行、空格
  6. c语言任意整数正序输出,C语言—正序,逆序输出任意整数的每一个数字
  7. matlab绘图崩溃,重新采用硬件加速绘图
  8. 提升网站关键词排名的技巧
  9. js 精确判断对象的类型
  10. PS 图像调整算法——饱和度调整