热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PCI/PCIe接口卡Windows驱动程序(2)开发者需要了解的WDF中的一些重要的概念

本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCIPCIe接口卡的驱动程序方法。在上一篇简要介绍了WDF和开发环境搭建后,本篇将讲述几个WDF中的概念,对开发者

本科毕业设计是这方面的工作,所以想开几篇博客来介绍使用WDF开发PCI/PCIe接口卡的驱动程序方法。

在上一篇简要介绍了WDF和开发环境搭建后,本篇将讲述几个WDF中的概念,对开发者了解WDF非常有帮助,属于“内功部分”;

本篇文章结构将没那么清晰,当句句都是作者通过看书、看论文、看MSDN提炼出来的,希望对读者能够有所帮助。

1、WinDBG是唯一的内核驱动调试利器,但是开发PCIe的WDF驱动可以采用“黑盒”方式,所以windbg不是必须的;

2、WDF比WDM好,别再用WDM了;

3、驱动程序编译成的二进制文件是sys类型,和EXE一样都是Portable Executable File Format;DLL也是PE格式

4、微软提供的内核接口只有C/C++

5、驱动程序开发时,需要为每一个函数指定其是分页内存还是非分页内存

6、PAGE标识是指此函数能在驱动运行时被交换到磁盘上;如果不指定,编译器默认为非分页内存;一般情况下,我们不许要考虑这些问题。但有些特殊的情况,代码是不允许被交换到硬盘上的,否则导致操作系统蓝屏或者自动重启;

7、驱动开发一定要关注warnning!!!除非你对这个warnning带来的影响非常了解;

8、派遣函数又可称为回掉函数,提供给操作系统调用。这些派遣函数是我们的主要工作重点;

9、创建设备时要判断设备是否创建成功,比进行必要的失败处理。驱动程序中这样的处理对于驱动程序的健壮性起着不容忽视的作用;

10、驱动程序的设备名称对应用程序来说是透明的,只能应用于内核,这也是为什么要创建设备符号链接、GUID的原因;

为了不给读者带来疲劳,再从1开始计数吧~

1、用户模式应用程序的虚拟地址空间除了为专用空间以外,还会受到限制。在用户模式下运行的处理器无法访问为该操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并且可能损坏关键的操作系统数据;

2、在内核模式下运行的所有代码都共享单个虚拟地址空间。这表示内核模式驱动程序未从其他驱动程序和操作系统自身独立开来。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到损坏。如果内核模式驱动程序损坏,则整个操作系统会损坏;

3、最正式的设备堆栈的定义:设备堆栈为(设备对象、驱动程序)对的有序列表,设备堆栈中创建的第一个设备对象位于底部,创建并附加到设备堆栈的最后一个设备对象位于顶部;

4、安装设备驱动时,安装程序使用信息(INF)文件中的信息来确定哪个驱动程序为函数驱动程序、哪个驱动程序为筛选器。这样安装后,PnP管理器就能通过注册表来确定设备的函数驱动程序和筛选器驱动程序了;

5、发送到设备的请求大部分都打包在I/O数据请求包中(IRP),IRP结构体:http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff550694%28v=vs.85%29.aspx;

6、IRP包含驱动程序处理I/O请求所需的全部信息;

7、驱动程序拆分为两个部分:一部分处理通用处理,另一部分处理特殊设备的处理,通用部分由Microsoft编写;特定部分由Microsoft或者硬件提供商编写;

8、通用部分称为“框架”,特定部分称为KMDF驱动程序;

9、”框架“可以处理I/O请求队列、线程同步以及很大一部分的电源管理任务;因此当某人将IRP发送到对时,IRP会转至框架。如果框架可以处理IRP,则不会涉及到KMDF驱动程序;如果框架处理不了就通过调用KMDF驱动程序来实现事件处理程序来获取帮助;

10、WDK中的头文件包含的条件语句指定编程元素仅在某些版本的Windows操作系统中才可用

技术分享

技术分享

好吧,还没有写完~

1、创建驱动程序时,可以指定Windows 7为基本的目标操作系统,在这种情况下,驱动程序会在Win7或更高的Windows上运行;

2、KMDF为驱动程序提供基于对象的接口,对象接口包括:
对象方法(驱动程序在对某个对象执行操作或者获取设置对象属性时可调用的函数)
对象事件回调函数(驱动程序提供的函数)
对象属性(属性是驱动程序可获取和设置的的存储在对象中的值)
对象句柄(基于框架的驱动程序)

3、每个基于框架的驱动程序都包括:一个DriverEntry例程,可在加载驱动程序时调用,一组事件回调函数,框架将在发生特定于对象的事件时调用这些函数;

4、基于 Windows 的驱动程序分为三种类型:总线驱动程序、功能驱动程序和筛选器驱动程序;

5、I/O 管理器通过创建 I/O 请求数据包 (IRP),将应用程序的 I/O 请求发送到驱动程序。IRP 可包含执行 I/O 操作(如读/写操作)的请求或执行 I/O 控制 (IOCTL) 操作(如返回状态)的请求。此外,PnP 管理器还会创建表示驱动程序必须执行的 PnP 和电源管理操作的 IRP,并将这些 IRP 发送到驱动程序;

6、I/O 管理器通常在用户应用程序请求读取或写入操作时创建读取或写入 IRP;

7、回调函数一定要返回STATUS_SUCCESS (如果操作成功)否则,回调函数将返回错误信息(定义在Ntstatus.h);

8、KMDF修订历史记录:http://msdn.microsoft.com/zh-cn/library/windows/hardware/ff544309(v=vs.85).aspx

9、驱动程序项目是生成驱动程序二进制文件(如 .sys 文件)以及可能驱动程序的 INF 文件的 Microsoft Visual Studio 项目。驱动程序是用于安装驱动程序的文件集合。驱动程序包中包含一个 INF 文件,以及由该 INF 引用的文件和二进制文件。如果使用驱动程序模板创建驱动程序解决方案,该模板应自动创建一个包含两个项目的解决方案。一个用于驱动程序,另一个用于驱动程序包;

10、内核模式下的驱动程序在从用户地址中读取或写入这些地址时必须非常小心!

1)用户应用程序发起设备读取请求,程序提供缓冲区的起始地址以接受数据;

2)内核驱动程序启动读取操作并将控制权返回到其调用程序;

3)设备中断当前运行的任何线程以显示读取操作完成。中断由此线程上运行的内核驱动程序进行处理;
4)驱动程序不得将数据写入用户应用程序在1)中提供的地址,此地址位于发起请求的进程的虚拟地址空间,该进程很大可能不同于当前进程。
 
 
好吧,先写到这里吧,想到后再补充,下一篇应该就会介绍WDF驱动程序中的几个重要的例程了。

PCI/PCIe接口卡Windows驱动程序(2)-开发者需要了解的WDF中的一些重要的概念


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
  • 在project.properties添加#Projecttarget.targetandroid-19android.library.reference.1..Sliding ... [详细]
  • 本文内容为asp.net微信公众平台开发的目录汇总,包括数据库设计、多层架构框架搭建和入口实现、微信消息封装及反射赋值、关注事件、用户记录、回复文本消息、图文消息、服务搭建(接入)、自定义菜单等。同时提供了示例代码和相关的后台管理功能。内容涵盖了多个方面,适合综合运用。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何将CIM_DateTime解析为.Net DateTime,并分享了解析过程中可能遇到的问题和解决方法。通过使用DateTime.ParseExact方法和适当的格式字符串,可以成功解析CIM_DateTime字符串。同时还提供了关于WMI和字符串格式的相关信息。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
author-avatar
yeeling610
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有