驱动开发4.基本编程技术一
C语言设备驱动编程入门

C语言设备驱动编程入门C语言设备驱动编程是一项常见的技术,用于编写操作系统的设备驱动程序。
设备驱动程序是操作系统与硬件设备之间的桥梁,它负责将用户操作转化为硬件设备能够理解和执行的指令。
本文将介绍C语言设备驱动编程的基本概念和入门知识,帮助读者了解并入门这一重要的编程技术。
一、设备驱动程序概述设备驱动程序是操作系统的一部分,它与操作系统内核紧密结合,用于实现对硬件设备的控制和管理。
设备驱动程序通常由硬件设备制造商提供,或者由操作系统开发者开发。
它负责处理硬件设备与操作系统之间的通信,使得用户能够方便地操作硬件设备。
设备驱动程序可以分为字符设备驱动和块设备驱动两种类型。
字符设备驱动用于处理流式数据的设备,如键盘、鼠标等;块设备驱动用于处理以块为单位的数据的设备,如硬盘、U盘等。
不同类型的设备驱动程序在实现上有所不同,但都需要用C语言编写。
二、设备驱动程序的基本结构设备驱动程序的基本结构包括设备初始化、设备打开、设备关闭和设备读写等函数。
下面我们逐步介绍这些函数的作用和实现方法。
1. 设备初始化函数设备初始化函数负责对设备进行初始化,包括设备的寄存器配置、中断设置等。
在这个函数中,我们需要了解硬件设备的相关规格和特性,并根据需要进行适当的配置。
2. 设备打开函数设备打开函数在设备被用户程序打开时被调用,它负责向操作系统申请资源,并进行相应的设置,例如打开文件、分配内存等。
3. 设备关闭函数设备关闭函数在设备被用户程序关闭时被调用,它负责释放设备所占用的资源,如释放文件占用的内存、关闭文件等。
4. 设备读写函数设备读写函数是设备驱动程序的核心部分,它负责设备与用户程序之间的数据交换。
设备读函数用于从设备中读取数据,设备写函数用于向设备中写入数据。
三、设备驱动程序的编写步骤编写设备驱动程序需要经过以下几个步骤:1. 了解硬件设备在编写设备驱动程序之前,我们需要详细了解硬件设备的规格和特性,包括硬件寄存器的地址、中断向量等。
c语言打印机驱动编写教程

c语言打印机驱动编写教程C语言打印机驱动编写教程一、引言打印机是计算机外部设备中常用的输出设备之一,而编写打印机驱动程序则是实现计算机与打印机之间通信的关键。
本文将介绍如何使用C语言编写打印机驱动程序,以便正确地控制打印机的功能和输出。
二、了解打印机驱动程序的基本原理打印机驱动程序是连接计算机和打印机的桥梁,它负责将计算机发送的打印任务转化为打印机可以理解的指令,使其能够正确地输出打印结果。
通常,打印机驱动程序需要实现以下功能:1.与打印机建立通信连接;2.发送打印任务给打印机;3.控制打印机的各项功能,如纸张大小、打印质量等;4.处理打印机返回的状态信息。
三、编写打印机驱动程序的基本步骤1.了解打印机的通信协议不同品牌、型号的打印机通常采用不同的通信协议,因此首先需要了解目标打印机的通信协议,包括指令集和参数设置等。
可以通过查阅打印机的技术文档或者与厂家进行沟通来获取这些信息。
2.建立与打印机的通信连接在C语言中,可以使用串口或者USB等接口与打印机建立通信连接。
根据打印机的通信协议,编写相应的代码来实现与打印机的通信。
3.发送打印任务给打印机通过编写相应的代码,将需要打印的文档内容发送给打印机。
可以先将文档内容转化为打印机可以理解的格式,再发送给打印机。
常见的文档格式包括PDF、Word、Excel等。
4.控制打印机的各项功能根据打印机的功能和参数设置,编写相应的代码来控制打印机的各项功能,如选择纸张大小、设置打印质量等。
需要注意的是,不同型号的打印机可能支持的功能和参数设置有所不同,需要根据实际情况进行调整。
5.处理打印机返回的状态信息打印机通常会返回一些状态信息,如打印进度、错误提示等。
编写相应的代码来处理这些状态信息,以便及时反馈给用户或者进行错误处理。
四、编写示例代码下面是一个简单的示例代码,用于演示如何使用C语言编写打印机驱动程序:```#include <stdio.h>int main() {// 建立与打印机的通信连接// ...// 发送打印任务给打印机// ...// 控制打印机的各项功能// ...// 处理打印机返回的状态信息// ...return 0;}```五、总结本文简要介绍了如何使用C语言编写打印机驱动程序的基本步骤。
linux usb wifi驱动开发原理

linux usb wifi驱动开发原理Linux USB WiFi驱动开发原理一、引言随着无线网络的普及,WiFi成为了人们生活中不可或缺的一部分。
而在Linux操作系统中,为了支持各种WiFi设备,需要进行对应的驱动开发。
本文将介绍Linux USB WiFi驱动开发的原理和过程。
二、USB WiFi驱动开发的基本原理1. USB接口USB(Universal Serial Bus)是一种通用的串行总线标准,用于连接计算机与外部设备。
USB WiFi设备通过USB接口与计算机通信,传输数据和控制命令。
2. 驱动程序驱动程序是用于操作和控制硬件设备的软件。
USB WiFi驱动程序负责与USB WiFi设备进行通信,实现数据的传输和接收。
驱动程序需要与操作系统紧密结合,通过操作系统提供的API接口与设备进行交互。
三、USB WiFi驱动开发的过程1. 设备识别与初始化USB WiFi设备插入计算机后,操作系统会通过USB子系统进行设备的识别和初始化。
在Linux系统中,USB设备的识别和初始化由USB核心驱动完成。
核心驱动会根据设备的VID(Vendor ID)和PID (Product ID)来匹配对应的驱动程序。
2. 驱动程序注册驱动程序需要在Linux系统中进行注册,以便系统能够正确识别和加载驱动。
注册过程通常包括向系统注册设备类型、设备ID等信息。
3. 设备操作接口的实现驱动程序需要实现设备操作接口,包括设备的打开、关闭、读取数据、写入数据等功能。
这些操作接口是通过USB子系统提供的API 来实现的。
4. 数据传输与控制USB WiFi驱动程序需要实现数据的传输和控制功能。
数据传输主要包括从设备读取数据和向设备写入数据,而控制功能包括设置设备参数、配置网络等操作。
5. 错误处理与调试在USB WiFi驱动开发中,错误处理和调试是非常重要的一部分。
驱动程序需要处理各种异常情况,如设备断开连接、传输错误等。
驱动开发面试题目及答案

驱动开发面试题目及答案1. 什么是驱动开发(Driver Development)?驱动开发是指为操作系统提供硬件设备的控制程序。
驱动程序与硬件设备之间通过操作系统的驱动模块进行交互,实现设备的初始化、数据传输、中断处理和错误处理等功能。
2. 驱动开发的基本要求有哪些?- 具备良好的编程基础和扎实的操作系统原理知识- 熟悉硬件电路和设备的工作原理- 熟悉特定硬件设备的相关规范和协议- 具备调试和故障排除的能力- 具备团队合作和沟通能力3. 驱动开发的流程包括哪些步骤?- 需求分析和规划:确定需要开发的驱动类型、支持的硬件设备和操作系统版本,制定开发进度和计划。
- 硬件适配和端口配置:了解硬件设备的接口特征和相关寄存器,编写初始化代码和配置驱动程序与设备的通信接口。
- 设备驱动程序编写:根据硬件设备的规范和操作系统的驱动接口,编写设备驱动程序,包括设备初始化、数据传输、中断处理等。
- 调试和测试:通过调试工具和测试用例验证驱动程序的正确性和性能,修复错误和优化程序。
- 集成和发布:将开发好的驱动程序集成到操作系统中,并进行安装和发布,确保程序能够正常运行。
4. 驱动开发中常见的编程语言有哪些?- C语言:大部分驱动程序都是使用C语言编写的,因为其具有良好的效率和可移植性。
- 汇编语言:部分特定的硬件设备驱动程序可能需要使用汇编语言编写,以直接操作硬件寄存器和指令。
- C++语言:在一些需要更高级别的抽象和封装的场景下,可以选择使用C++语言开发驱动程序。
5. 驱动开发中涉及的常用接口和框架有哪些?- Windows驱动程序框架(WDF):用于开发驱动程序的框架,提供了一系列的函数和模型,简化了驱动程序的开发和维护。
- Linux设备模型(Device Model):用于将设备抽象为设备树的形式,并提供一组API进行设备驱动程序的开发。
- Android驱动开发框架:用于在Android操作系统上开发设备驱动程序的框架,提供了一系列Java和C/C++函数库。
VC编写驱动方法

VC编写驱动方法编写VC驱动方法在VC开发中,驱动方法是一种非常重要的处理方式。
它可以帮助程序员更好地管理代码,增加代码的可读性以及可维护性。
下面将介绍一些常用的VC驱动方法。
1.初始化方法初始化方法是驱动程序启动时最先调用的方法,在这个方法中可以进行一些初始化操作,比如初始化一些全局变量、分配内存等。
在VC中,一般使用WinMain函数或者OnInitDialog方法来实现初始化。
2.事件处理方法事件处理方法是用来处理操作系统或者用户输入的事件的方法,比如鼠标点击事件、键盘按键事件等。
在VC中,可以通过添加事件响应函数来实现事件处理方法。
在这些方法中,可以根据事件的类型和参数来做出不同的反应。
3.获取数据方法获取数据方法是用来从外部或者数据库中获取数据的方法,比如从文件中读取配置信息、从网络中获取数据等。
这些方法可以根据需要进行适当的封装,例如提供参数来指定从哪个文件中读取配置信息,或者提供一个回调函数来处理网络数据。
4.更新数据方法更新数据方法是用来向外部或者数据库中写入数据的方法,比如向文件中写入日志信息、向数据库中插入新的记录等。
这些方法可以根据需要进行适当的封装,例如提供参数来指定要写入的文件或者数据库的位置,或者提供一个回调函数来处理写入的结果。
5.计算方法计算方法是用来进行一些数学或者逻辑计算的方法,比如计算两个数的和、判断一个数是否为质数等。
在VC中,可以将这些方法放在一个单独的类或者模块中,方便调用。
另外,为了增加代码的可读性,可以添加注释来说明计算的过程和结果。
6.绘制方法绘制方法是用来在屏幕上绘制图形或者文本的方法,比如绘制一个按钮、一个文本框等。
在VC中,可以通过使用GDI+库来实现绘制方法。
在这些方法中,可以使用各种图形和绘制函数来实现特定的绘制效果。
7.保存方法保存方法是用来将程序状态或者数据保存到磁盘或者其他设备中的方法,比如保存程序的配置信息、保存用户输入的数据等。
Windows下设备驱动程序的开发方法

目录一、驱动开发环境的搭建 (1)1.1 关于DDK (1)1.2 关于驱动程序的编译 (1)1.3关于驱动程序的运行 (2)二、驱动程序的结构 (3)2.1 驱动程序的头文件 (3)2.2 驱动程序的入口点 (3)2.3 创建设备例程 (4)2.4 卸载驱动例程 (5)2.5 派遣例程 (6)三、编写驱动程序的基础知识 (6)3.1 内核模式下的字符串操作 (6)3.2 内核模式下各种开头函数的区别 (8)3.3 一个示例程序 (10)3.4 补充说明 (10)四、在驱动中使用链表 (10)4.1 内存的分配与释放 (10)4.2 使用LIST_ENTRY (12)4.3 使用自旋锁 (12)五、在驱动中读写文件 (15)5.1 使用OBJECT_ATTRIBUTES (15)5.2 创建、打开文件 (16)5.3 读写文件操作 (16)5.4 文件的其它相关操作 (18)六、在驱动中操作注册表 (18)6.1 创建、打开注册表 (19)6.2 读写注册表 (20)6.3 枚举注册表 (21)七、在驱动中获取系统时间 (21)7.1 获取启动毫秒数 (21)7.2 获取系统时间 (22)八、在驱动中创建内核线程 (23)8.1 创建内核线程 (23)8.2 关于线程同步 (24)九、初探IRP (25)9.1 IRP的概念 (25)9.2 IRP的处理 (26)9.3 IRP派遣例程示例 (27)十、驱动程序与应用层的通信 (29)10.1 使用WriteFile通信 (29)10.2 使用DeviceIoControl进行通信 (32)十二、驱动程序开发实例 (33)12.1 NT驱动程序 (33)12.2 WDM驱动程序 (35)十三、参考资料 (41)一、驱动开发环境的搭建1.1 关于DDK开发驱动程序必备的一个东西就是DDK(Device Development Kit,设备驱动开发包),它跟我们在ring3常听到的SDK差不多,只不过它们分别支持开发不同的程序而已。
c语言驱动代码怎么写代码驱动电脑的基本步骤

c语言驱动代码怎么写代码驱动电脑的基本步骤C语言驱动代码:如何编写代码驱动电脑的基本步骤在计算机科学中,驱动程序是指用于控制硬件设备的程序,它充当了计算机操作系统与硬件之间的桥梁。
C语言是一种功能强大的编程语言,用于编写高效的驱动程序。
本文将介绍编写C语言驱动代码的基本步骤。
1. 确定驱动目标在编写驱动程序之前,需要明确驱动的目标是什么。
驱动可以是针对不同硬件设备的,如打印机、鼠标等。
在本文中,我们将以一个简单的案例来说明,即键盘驱动程序。
这个驱动程序将使计算机能够识别和响应键盘输入。
2. 学习设备相关文档在编写驱动程序之前,需要详细了解被驱动设备的特点和功能。
这通常通过查阅设备的技术文档或供应商提供的开发者文档来实现。
对于键盘驱动程序,需要查阅键盘的通信协议和按键编码等信息。
3. 编写初始化代码初始化代码用于准备驱动程序与设备之间的通信。
键盘驱动程序通常需要打开设备的接口,并设置设备的初始状态,以便能够接收按键输入。
这可能涉及到与设备进行握手的通信过程。
4. 编写中断处理程序键盘驱动程序需要能够实时响应用户的按键操作。
为了实现这一点,中断处理程序被用来处理从键盘设备发出的中断信号。
中断处理程序负责解析按键事件,并根据用户的输入进行相应的操作。
例如,当用户按下某个键时,中断处理程序可以将该按键的字符发送给操作系统或其他应用程序。
5. 实现设备控制功能驱动程序还可以提供一些额外的设备控制功能,以便于用户与设备进行交互。
例如,在键盘驱动程序中,可以实现控制LED灯的功能,通过向设备发送控制指令,来控制键盘上的灯光。
6. 进行测试和调试编写完驱动程序后,需要进行测试和调试,以确保其能够正常工作。
这可以通过连接设备并运行相应的应用程序来完成。
在测试过程中,需要验证驱动程序是否能够正确地解析键盘输入,并对其做出正确的响应。
在编写C语言驱动代码时,还有一些编码规范和最佳实践需要遵循。
例如,应避免使用与已有库函数或全局变量相同的命名,以防止命名冲突。
高一vb知识点总结

高一vb知识点总结在高中的计算机教育课程中,学生可能会学习Visual Basic(VB)编程语言。
VB是一种广泛用于Windows平台上的事件驱动编程语言,它易学易懂,非常适合初学者。
在VB中,学生们将学习如何创建GUI(图形用户界面)应用程序,处理用户输入,以及编写代码来实现各种功能。
下面将对高一学生需要了解的VB知识点进行总结。
1. VB的概述VB是由微软公司推出的一种编程语言,它的全称是Visual Basic。
VB是一种事件驱动的语言,这意味着程序的执行流程是由用户的操作或者系统的事件所驱动的。
与一些其他编程语言相比,VB更注重于开发图形用户界面应用程序。
2. VB的开发环境在学习VB编程时,学生需要通过Visual Studio这样的集成开发环境(IDE)来进行编码。
Visual Studio提供了一个友好的用户界面,集成了编辑器、编译器和调试器等功能模块,使得编程过程更加高效和便捷。
3. VB的基本语法VB的语法与许多其他编程语言相似,学生需要掌握的基本语法包括:- 变量的声明和赋值- 基本的数据类型(整数、浮点数、字符串等)- 运算符和表达式- 控制流程语句(条件语句、循环语句等)- 过程和函数的定义与调用4. VB的GUI设计VB是一门专门用于创建GUI应用程序的语言,因此学生需要掌握如何设计并创建各种窗体、按钮、文本框、标签等GUI控件,以及如何设置这些控件的属性和事件处理程序。
同时,学生还需要了解布局管理、对话框的使用以及界面美化等方面的知识。
5. VB中的事件处理在VB中,事件是一种用户操作或系统触发的动作。
学生需要了解如何注册和处理各种事件,比如鼠标点击事件、键盘输入事件、窗口关闭事件等。
通过编写事件处理程序,学生可以实现用户与应用程序之间的交互。
6. VB中的数据库操作在实际开发中,许多应用程序都需要与数据库进行交互。
学生需要了解如何连接数据库、执行SQL查询、更新数据库记录等基本操作,并且掌握等数据库访问技术的使用。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
错误处理
To err is human; to recover is part of software engineering. 程序中总会发生异常情况,其中一些源自 程序中的Bug,或者在我们的代码中或者在 调用我们代码的用户模式应用程序中。 另一些涉及到系统装载或硬件的瞬间状 态。无论什么原因,代码必须能对不寻常 的情况作出恰当的反应。
核心模式编程环境
内存管理器(Mm前缀) 控制页表,页表定义 了虚拟内存到物理内存之间的映射。如 MmMapIoSpace 把物理地址映射为虚拟地 址 执行支持 (Ex前缀) 提供堆管理和同步服 务。 如ExAllocatePoolWithTag 从内存池 中分配内存,ExAcquireFastMutex获取一 个快速互斥对象
核心模式编程环境
Windows NT内核(Ke前缀) 所有多线程和多处理 器的低级同步活动都发生在内核中。这种Ke函 数使用的最多,如KeInitializeDeviceQueue 在操作系统的最底层是硬件抽象层(HAL,Hal前 缀)。操作系统把所有关于计算机硬件如何连接 的信息都存放在HAL中。HAL了解如何在特定平 台上实现中断操作,如何实现自旋锁,如何寻 址I/O或内存映射设备,等等。 WDM驱动程序不 直接与硬件对话,它通过调用HAL中的函数来达 到目的。所以WDM驱动程序能够实现平台无关和 总线无关。
内核模式的使用
在许多情况下,WDM驱动程序例程接收到的 参数都是经过其它代码严格检验的,一般 不会成为导致异常的原因。 但我们仍要遵循这样基本原则:对用户模 式虚拟内存直接引用的代码段应该用结构 化异常保护起来。 这样的引用通常发生在调用 MmProbeAndLockPages、ProbeForRead,和 ProbeForWrite函数时。
状态代码
不仅要检测调用例程的返回状态,还要向调用你 的例程返回状态代码。 在前面,讲述的两个驱动程序例程,DriverEntry 和AddDevice,它们都定义了NTSTATUS返回代码。 所以,如果这些例程成功,则应返回 STATUS_SUCCESS。如果在某个地方出错,应返回 一个适当的错误状态代码。 有时函数返回的状态代码就是出错函数返给你的 状态代码。 前面AddDevice函数,加入了错误检测
结构化异常处理
结构化异常(SEH)? 结构化异常.doc 结构化异常处理与编译器的代码生成器紧密集成,它允许 你在自己的代码段周围加上保护语句,如果被保护代码段 中的任何语句出现异常,系统将自动调用异常处理程序。 为什么要引入? MS在windows中引入SEH的动机是为了便于操作系统的开 发,使得操作系统更加强壮。 SEH使得程序员可以集中精力处理眼前的工作,将可能发 生的错误处理放在后面处理。 SEH使得程序更加容易理解,代码更加容易维护,如果使 用得当,具有最小的系统开销。
核心模式编程环境
I/O管理器(Io前缀) 包含许多驱动程序可 以使用的服务函数,后面将有很多对这些 函数的描述。 例如IoCallDriver 调用把 IRP交给下层驱动程序处理。 进程结构模块(Ps前缀) 创建并管理内核 模式线程。普通的WDM驱动程序应使用一 个独立的线程来循环检测无中断生成能力 的设备。如PsCreateSystemThread 创建 一个内核模式线程
错误处理
下面将描述三种错误处理形式:状态代码、结构 化异常处理,和bug check 一般,内核模式支持例程通过返回状态代码来报 告意外错误。对于正常情况,它们将返回布尔值 或者数值而不是正式的状态代码。 结构化异常处理为异常事件发生后的清除工作提 供了一个标准化方法,它可以避免因为异常事件 而导致系统崩溃,异常事件是指诸如被零除或参 考无效指针等的意外错误。 Bug check实际上就是致命错误的内部名称,对于 这种错误,唯一的解决办法就是重启动系统。
常用的核心模式状态代码和用户模 式状态代码的对应关系
Kernel-Mode Status Code STATUS_SUCCESS STATUS_INVALID_PARAMETER STATUS_NO_SUCH_FILE STATUS_ACCESS_DENIED STATUS_INVALID_DEVICE_REQU EST ERROR_BUFFER_TOO_SMALL STATUS_DATA_ERROR User-Mode Error Code NO_ERROR (0) ERROR_INVALID_PARAMETER ERROR_FILE_NOT_FOUND ERROR_ACCESS_DENIED ERROR_INVALID_FUNCTION ERROR_INSUFFICIENT_BUFFER ERROR_CRC
几种异常
核心模式和用户模式的SEH处理机制差不 多。 用户模式try finally try except ?主要 区别? C++异常处理catch throw? C++异常处理是针对语言的,SEH是能够应 用于任何语言的操作系统特性,在Visual c++中的C++异常也是通过一个try except 实现的
核心模式编程环境
对象管理器(Ob前缀) 集中控制Windows NT中的各种数据对象。WDM驱动程序仅需 要对象管理器维护对象的参考计数,以防 止对象被意外删除。 如 ObReferenceObject 增加一个指定对象的 参考计数 安全参考监视器(Se前缀) 使文件系统驱 动程序执行安全检测。I/O请求到达WDM驱 动程序前已经做完了安全检测。
基本编程技术
sigang@
内容
核心模式编程环境 错误处理 内存管理 字符串处理 访问注册表 访问文件 浮点运算 有关调试
普通的Windows程序编程环境
用到了哪些函数? 由谁来提供这些函数的服务? 内核模式编程环境呢?
核心模式编程环境
右图显示 了Windows NT操作系 统的某些 组成部 分。每个 部分都输 出一些服 务函数
核心模式状态代码和用户模式状态 代码
关于和应用程序接口部分的状态代码。 以错误状态完成一个IRP,通常会导致一个Win32 函数调用错误返回。应用程序可以调用 GetLastError得到出错的原因。 如果在驱动程序中IRP失败时的客户位 (customer)置1,GetLastError函数将把错误代 码直接返回,不作任何修改。反之,客户位 (customer)置0(Microsoft定义的标准错误代 码都是这种情况),GetLastError函数返回一个 在WINERROR_try{
<guarded body>
} __finally {
<termination handler>
}
Try-Finally块
语法上,try-finally按下面方式工作。首 先,计算机执行被保护体。由于某种原因控制 离开被保护体,计算机执行终止处理程序 。 如下图:
状态代码检测方法
我们应该总是检测例程的返回状态。 如果状态码高位为0,那么不管其它位是否 设置,该状态代码仍旧代表成功。所以, 绝对不要用状态代码与0比较来判断操作是 否成功,应该使用NT_SUCCESS宏: NTSTATUS status = SomeFunction(...); if(!NT_SUCCESS(status)){ <handle error>}
运行时间库
运行时间库:系统提供两套运行时间库,一个是 为用户模式程序,一个是为内核模式。 DDK文档指出内核模式驱动程序仅应调用DDK中公 开的函数。所以我们应该使用Rtl开头的内核模式 运行时间库,例如不要在驱动程序中调用wcscmp 函数,而应该调用RtlCompareUnicodeString。 但是,还是有很多人使用用户模式运行时间库, 因为他们知道很多的内部细节,他们知道哪些情 况下可以使用哪些函数。
错误和警告
平时编程如何对待错误和警告? 错误和警告之间的差别有时候是很明显的。 内核如何处理? 在METHOD_BUFFERED的控制操作中,如果你以 STATUS_BUFFER_OVERFLOW完成一个IRP――这是一 个警告,I/O管理器会把数据拷贝回用户缓冲区。 但是如果你以STATUS_BUFFER_TOO_SMALL完成一个 IRP――这是一个错误,I/O管理器不会把数据拷 贝回用户缓冲区。
内核模式的结构化异常特点
结构化异常机制可以使内核模式代码在访 问一个非法的用户模式地址后避免系统崩 溃 不能捕捉其它处理器异常,例如被零除或 试图访问非法的内核模式地址。 这种机制在内核模式中不象在用户模式中 那样具有通用性
如何实现?
内核模式程序通过在内存堆栈上建立异常 帧来实现结构化异常(这个堆栈就是程序 用于参数传递、子程序调用,和分配自动 变量所使用的内存堆栈。) 每个异常帧都指定一个过滤函数 ,当异常 发生时,操作系统通过扫描堆栈异常帧来 寻找相应的异常处理程序
侧效(Side effects)
#define min(x,y) (((x)<(y)) ? (x) : (y)) int a = 2, b = 42, c; c = min(a++, b); 最后 c结果是什么? 还有哪些表达式有侧效?
侧效(Side effects)
通常,不知道DDK什么时候使用宏,什么时 候使用真正的外部函数。有时候,一个特 殊的服务函数在某些平台上是宏而在其它 平台上却是外部函数。此外,Microsoft也 可能在将来改变想法。所以,当写WDM驱动 程序时应坚守下面原则: 决不在内核模式服务函数的参数中使用 带有侧效的表达式。
核心模式编程环境
运行时间库部件(Rtl前缀) 包含工具例程,例如串管理 例程,内核模式驱动程序可以用这些例程来替代常规的 ANSI标准例程。大部分例程可以从其名字上直接看出它 的功能。 如RtlAnsiStringToUnicodeSize Win32子系统存在于用户模式中,所以用户模式中的应 用程序可以容易地调用其例程。为了方便,Windows NT 在内核模式中实现了一些有Zw前缀名的函数,这些函数 可以使驱动程序调用Win32子系统例程。Windows 2000 DDK中仅暴露很少一部分这样的函数给驱动程序使用, 包括访问文件和注册表的函数。 如ZwCreateFile ZwQueryValueKey