window NT - WDM - WDF 驱动概念

NT是驱动模型:

NT式驱动程序模型是一种比较老式的驱动程序模型,但适用于现有的Windows系统。NT式驱动模型没有固定的形式,最简单的NT式驱动程序模型这一特点,程序开发者可以编写一个完全不支持硬件工作的驱动程序,却可以将代码运行在内核模式中。

NT设备驱动程序的动态加载主要是由服务控制管理程序组件来完成的。Windows服务可以在系统启动时加载,用户也可以按需在服务控制平台开启或者关闭服务。程序员可以通过Windows提供的相关服务函数进行加载或者卸载该服务等。服务程序更是可以在用户还没有登录系统时,就载入系统并且被执行。

NT驱动一般分为4个步骤:

1、调用OpenSCManager打开SCM管理器;

2、调用OpenService打开此项服务

3、调用ControlService传递SERVICE_CONTROL_STOP来停止服务;

4、调用DeleteService卸载此项服务;

5、关闭句柄;

WDM驱动程序模型:

WDM式驱动程序在NT式驱动程序的基础上,还必须:

1、包括wdm.h头文件,问不是ntddk.hwdm.hntddk.h的一部分)

2、被设计为一种WDM驱动程序类型,如总线驱动、功能驱动,过滤驱动等;

3、创建设备对线属于WDM设备对象类型(物理设备对象、功能设备对象、过滤设备对象);

4、支持即插即用;

5、支持电源管理;

6、支持Windows管理规范

NT式驱动不同,WDM式驱动程序不是被当作服务来加载的,因此不能简单地依靠修改注册表来架子驱动。WDM式驱动比NT式驱动增加了对即插即用的支持,这需要安装的时候提供一个INF文件行配合。

里增加了一个AddDevice回调函数,此回调函数的作用是创建设备对象并由PNP(即插即用)管理器调用。并设置对IRP_MJ_PNPIRP的回调函数。这都是NTWDM驱动最大的不同点。而且在WDM驱动中,大部分卸载工作都不是由DriverUnload来处理,而是放在对IRP_MN_REMOVE_DEVICEIRP的处理函数中处理。

NT式的驱动程序要导入的头文件时NTDDK.H,而WDM式的驱动要导入的头文件为WDM.H.

通俗点NT式驱动,以服务的形式启动在系统里,WDM驱动加载需要inf文件,在C:Windows下有一个名为INF的隐藏文件夹,我们可以找到很多??.INF??.pnf格式的文件,前者即所谓的设备信息文件,后者是预编译信息文件。用记事本可以打开INF文件,其中记录了必要的硬件安装信息,包括设备类型、设备生产厂商名称、适用产品等信息,Windows可以据此自动安装驱动程序。

WDF驱动程序模型

WDMWin32设备驱动程序体系结构,Windows设备驱动程序,过去是WDMWindows Driver Model)框架,编程复杂,初学者难以掌握其编程要领。为了解决这一问题,微软对WDM驱动程序的架构做了改进,形成了全新的WDFWindows Driver Foundation)框架结构。它提供了面向对象和事件驱动的驱动程序开发框架,大大降低了开发难度。从现在开始,掌握Windows设备驱动程序的开发人员,由过去的专业人士,将变为普通大众。
 WDF驱动程序包括两个类型,一个是内核级的,称为KMDFKernel-Mode Driver Framework),为SYS文件;另一个是用户级的,称为UMDFUser-Mode Driver Framework),为DLL文件。

WDM驱动模型和WDF驱动模型的区别:

1)wdf驱动框架对WDM进行了一次封装,WDF框架就好像C++中的基类一样,且这个基类中的model,IO model ,pnp和电源管理模型;且提供了一些与操作系统相关的处理函数,这些函数好像C++中的虚函数一样,WDF驱动中能够对这些函数进行override;特别是Pnp管理和电源管理!基本上都由WDF框架做了,而WDF的功能驱动几乎不要对它进行特殊的处理;

2)WDF驱动模型 与WDM驱动模型的另外一个主要区别是:

WDF驱动采用队列进行IO处理,而WDM中将所有的IO操作都用默认的队列进行处理,如果要进行IRp同步,必须使用StartIO

3)WDF是面向对象的,而WDM是面向过程的,WDF提供对象的封装,如将IRP封装成WDFREQUEST,对象提供方法和Event

感谢大家的支持,如要问题欢迎提问指正

### Arduino NT35510 显示屏驱动代码示例 对于Arduino平台下的NT35510显示屏,通常会使用特定库来简化编程工作。下面是一个简单的初始化显示测试图案的例子: #### 初始化与基本配置 为了使NT35510正常工作,需要先安装相应的库文件并完成必要的硬件连接设置。 ```cpp #include <Adafruit_GFX.h> #include <Adafruit_ST7735.h> #define TFT_CS 10 #define TFT_RST 9 #define TFT_DC 8 // 创建ST7735对象实例化屏幕 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_MOSI, TFT_CLK, TFT_RST); void setup(void) { Serial.begin(9600); // 初始化TFT显示器 tft.initR(INITR_REDTAB); // 使用红色标签初始化 tft.fillScreen(ST77XX_BLACK);// 填充黑色背景 // 设置文本颜色、大小其他属性 tft.setTextColor(ST77XX_WHITE); tft.setTextSize(2); } ``` 这段代码展示了如何创建一个基于`Adafruit_ST7735`类的对象`tft`,并通过调用其成员函数来进行初始化操作[^1]。 #### 绘制图形与文字 一旦完成了上述的基础设定之后就可以开始绘制各种形状以及输出字符串了。 ```cpp void loop() { drawTestPattern(); } void drawTestPattern(){ uint16_t color; for (int16_t x=0; x<tft.width(); x+=6){ for (int16_t y=0; y<tft.height(); y+=12){ color = tft.Color565(x % 255, y % 200, (x+y)%100); tft.fillRect(x,y,5,10,color); } } delay(1000); tft.fillScreen(ST77XX_BLACK); tft.setCursor(0, 0); tft.print("Hello World!"); } ``` 此部分实现了在一个循环里不断刷新屏幕内容的功能,在每次迭代过程中都会清除旧的画面再重新画上新的图案或字符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

指掀涛澜天下惊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值