首页 > 编程知识 正文

linux设备驱动开发,windows驱动开发技术详解 pdf

时间:2023-05-04 18:17:53 阅读:164561 作者:1379

本文主要介绍“如何入门Windows驱动程序开发”和“初学者需要掌握哪些知识和动手技能”,大部分是本人探索Windows驱动程序开发近一个月的经验之谈。 这些方面包括:

1、开发工具、调试工具、调试手段

2、Windows驱动开发框架

3、动因基本原则

4、PCIE驱动程序;

5、学习资料

以上内容在本文中仅作简要介绍,随后随着本人经验的增加,本文会不断更新,并对部分内容进行个别说明。

请参阅MSDN文档:单击打开链接

一.开发工具

1、虚拟机和操作系统

您使用的windows10OS中安装了“VMware Station11”。 虚拟机将暂时安装一个“windows7x64”操作系统,然后安装一个windows10虚拟机系统。 通常,我会在虚拟机操作中安装和调试驱动程序,以避免混淆本地操作系统。

然后尝试“使用本机winDbg调试虚拟机中的驱动程序”。 这是一种比较高级的调试方法,单击链接将其打开。

2、开发工具

本人主要使用“WDK7600”和“VS2015 wdk10”。 我把前者安装在“win7 X64”虚拟机上,后者安装在本机和实验室的电脑上。 因为我使用的教材《Windows驱动开发详解》和学习博客都是使用wdk7版本开发的,所以为了匹配环境,我决定在虚拟机中测试这些教材上的示例代码。

关于wdk7,请参照博客。 单击“打开链接”。

对于“VS2015 wdk10”,必须在windows10系统上安装VS2015,然后才能安装wdk10。 此外,还必须安装VS2015更新。 (winDbg已集成到wdk10中。 路径: c : 程序文件(x86 ) windows工具包(10 (debuggers ) x64 )。

注意事项:

1 )对于VS2015的默认安装,没有安装C和sdk,必须选择自定义安装

2 )如果默认安装,此时重新安装wdk10将发出警告

3 )此时,系统可能会提示您在VS2015中创建新的c项目,然后安装c部分的模块

4 )安装后,wdk10可以正常安装。 安装wdk10后,如果有编译问题,需要到VS下确认是否有C相关模块,并按照以上3所示完全安装。

另一个需要注意的是,编译报纸“Inf2Cat error -2: 'Inf2Cat,signabilitytestfailed.' doubleclicktoseethetooloutput”,

参考博客:单击打开链接

这是因为inf文件的“驱动程序服务器”的时间错误。 VS2015的缺省" Inf2cat "时间为UTF,必须通过选择“工程属性”-“INF 2cat”打开本地时间。

3 .调试工具

1 )调试

在驱动程序中,调用类似c语言printf的KdPrint函数,在debugview中显示打印信息。 这是最常见的调试方法。

需要注意的是,首先在" capture "菜单中选中" kernel "相关选项,以显示抓住内核的信息。 接下来,您必须以管理员身份运行该软件。 Debugview经常在windows10中报告错误:

必须在" c :windowssystem32drivers "中找到并删除" dbgv.sys ",然后以"管理员身份"运行软件。

2 )

4、调试手段

1 )要驱动安装阶段,可以在“c :windowssystem32drivers”目录中查看相应的“sys”文件是否正确。

2 ) cmd-regedit打开注册表,在“编辑”菜单下“搜索”相应的设备信息。

3 )使用KdPrint函数打印log和DebugView软件抓取log (最常用的手段);

4 )在二维码中写入log文件(理论上可行,探索);

5 )保存dump信息。 dump消息是操作系统在系统崩溃之前将当前调用栈记录为dump文件。 (要使用更多系统输出dump信息,请参阅《Windows驱动开发技术详解》最后一章或单击博客:打开链接。 设置dump文件后,遇到蓝屏,再放入WinDbg查看dump文件也是常用的调试手段。

6 ) IRPTrace,该软件可以跟踪IRP,但不能使用windows7或更高版本。 你自己写个程序跟踪一下。

7 ) PCI树,查看设备挂载;

8 ) WinObject,查看驱动中的各种对象信息。

9 ) WinDbg调试虚拟机。 这是高度的APP沟通。 与VS2015配合使用,可以查看“内存”、“调用栈”、“线程”和“反汇编”。

注:在驱动程序的开发过程中,需要掌握各种工具和调试手段。

p>

二、开发框架

        从我最近的浏览的资料来看,Windows驱动程序大致有三种类型:NT驱动、WDM驱动和WDF驱动。其中,NT驱动是非即插即用(Plug-in-and-Play,PNP)式的,它是一项系统服务,目前的设备类驱动大都不是这种类型,不是我的关注点,后面将不展开介绍。WDM驱动和WDF驱动都是即插即用的驱动,后者是前者的升级版。

1,WDM框架

        WDM是早前的Windows驱动开发框架,虽然现在微软推荐用WDF,但是,学习WDM一是能够更对地了解操作系统的内部机制(WDF是对WDM更高层次的封装),二是《Windows驱动开发技术详解》以及网上的很多博文都是用的WDM,从学习角度出发也需要掌握一定的WDM知识。

        WDM框架的基本知识,可以参考博文:点击打开链接。后续我也用单独的博文来讲解这方面的内容,主要包括:

1)驱动对象与设备对象(DriverObject vs Device Object);

2)物理设备对象(PDO)和功能设备对象(FDO);

3)驱动的层次结构:水平层次(eg:FDO之间)和垂直层次(FDO到PDO);

4)入口函数(DriverEntry);

5)设备扩展(DRIVER_EXTENSION);

6)重要的例程(routine):AddDevice

7)IRP机制(I/O Request Package):MajorFunction(可爱的睫毛膏))和MinorFunction(MN);


2,WDF框架

        对于WDF框架,可以参考《Window7设备驱动开发》这本书。WDF框架可以分为KMDF(Kernel Model Driver Frame)和UMDF(User Model Driver Frame),其驱动模型如下:

1)WDF对象(属性、方法和事件);

2)即插即用和电源管理的集成;

3)集成的I/O排队和取消(queue);

4)I/O模型。在Windows中,IRP的功能不仅仅是向驱动程序提供传统的I/O请求(读、写、创建等)。它是操作系统和驱动程序、驱动程序和驱动程序之间一种基于数据包的通信机制。


3,一个典型的KMDF驱动程序

        通过VS2015新建一个项目,选择“KMDF”,它会产生如下文件:


1)public.h中定义GUID和CTL_CODE,并提供给应用程序使用;

2)trace.h定义的调试宏和函数,暂不关注;

3)driver.h和driver.c定义了主要的框架代码。包括:入口函数(DriverEntry)、加载设备的例程(KMDFDriver1EvtDeviceAdd)和清理上下文区的函数。该文件都是框架性的代码,在驱动开发的过程中,可以选择一个框架,选定框架后,一般不在该文件中添加功能,而是放到“device.c”和“queue.c”。

4)device.h和device.c,主要处理设备相关的功能,与设备交互的实现放在该文件中。主要包括设备初始化和资源释放;

5)queue.h和queue.c,主要处理IRP,包括KMDFDriver1EvtIoDeviceControl;


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。