这个系列的文章在网上到处都是 这里也不清楚谁才是原文作者 我这里做个整理,标注一下希望大家能看的更加舒服一点

目录

(一)驱动开发一个简单的显示驱动

(二)驱动开发一个简单的显示驱动

(三)驱动开发一个简单的显示驱动

(四)驱动开发一个简单的显示驱动

(五)驱动开发一个简单的显示驱动

(六)驱动开发一个简单的显示驱动

理论:

本篇我们将介绍下如何写一个简单的显示驱动。显示驱动是一种特殊类型的驱动,必须要满足一个框架,它不像我们前面讲的那些驱动。

示例程序演示了如何写一个简单的显示驱动,这个驱动无需关联任何硬件。它能实现图形到内存,然后由一个应用程序来显示这些图形。

显示驱动的体系结构

首先介绍的是windows NT下显示驱动的体系结构。在这里要特别说明的是windows vista使用了一种新的显示驱动模型,叫做LDDM.它是vista最新桌面窗口管理器的核心部分。就兼容方面,vista仍然可以与老的窗口管理器一起协作支持老的显示驱动。

显示驱动模型包括两部分,迷你小端口驱动和显示驱动。迷你小端口驱动加载到系统空间,负责枚举设备和管理设备资源。显示驱动加载到会话空间,负责实现实际的GDI图形调用。显示驱动完全控制怎样划线或者怎样实现透明效果。

下面的图表显示了windows显示驱动的体系结构。

迷你小端口驱动

迷你小端口驱动加载到系统空间,负责管理显示设备资源和枚举设备。这个驱动使用其它的驱动(VIDEOPRT.SYS)作为它的框架。你的驱动会使用VIDEOPRT.SYS导出的API. 很奇怪驱动可以导出API吧?驱动使用pe格式,也有导入表和导出表。你可以从你的驱动中导出api,并且允许其他驱动链接使用它们,就像调用一个dll一样。实际上你使用的这些API连接着内核和其他驱动。

在这里要注意连接内核模式驱动和用户模式的驱动有些不同。如果一个驱动连接另一个驱动,而那个驱动当前没有加载到内存。那么那个驱动将会被加载进内存,然而那个驱动的DriverEntry不会被调用。DriverEntry自身不会被调用,只有使用ZwLoadDriver加载驱动,系统加载驱动或者使用我们前面展示过的服务api记载驱动才会调用DriverEntry。任何时候,你都可以从一个驱动中导出API,然后在另一个驱动中使用这些api. 在内核中没有类似于"GetProcAddress"的api,你需要自己写一个。

你的迷你小端口驱动会调用VideoPrt.SYS导出的api。VideoPrt.SYS驱动做了很少的事情,其中之一就是实现了通用代码。所以视频驱动的开发者就不需要重新再写同样的代码。这个代码包括在win32子系统(win32k.sys)和你的迷你小端口驱动之间进行视频设备枚举。VideoPrt.SYS还创建了一个显示用的设备对象,当你调用这个初始化例程时,他会使你的驱动对象入口点指向VideoPrt.SYS

所有的VideoPrt.SYS API都是"VideoPort"开头的。你第一个调用的API应该是"VideoPortInitialize".如果你注意的话,可以看到开头的两个参数就是传递给你的DriverEntry例程的,他们被称作"Context1"和"Context2",仿佛你的视频迷你小端口驱动是特别的。不要被这些迷惑,第一参数"Context1"实际上就是你的驱动对象。一旦你传递你的驱动对象给VideoPortInitialize,所有你的驱动入口点都会指向VideoPrt.Sys的。除此之外,你还要传递给VIDEO_HW_INITIALIZATION_DATA结构不同的函数指针,VideoPrt.SYS在需要的时候会用到这些。

这意味着你不要直接处理在视频迷你小端口驱动中的IRP. VideoPrt.SYS会处理他们。你需要处理的是"VRP"(视频请求包),本质上讲它其实是一种简化的用不同数据结构的IRP版本。你需要简单的返回,不需要像IRP那样对这个数据结构进行处理。

在迷你小端口驱动中,你除了使用"VideoPort"开头的api外,由于它是系统层的驱动,你还可以使用内核的api.

由于我们没有任何硬件,因此我们的迷你小端口驱动会比较简单,下面的代码演示了如何编写视频迷你小端口驱动DriverEntry。

ULONG DriverEntry(PVOID pContext1, PVOID pContext2){VIDEO_HW_INITIALIZATION_DATA hwInitData;VP_STATUS vpStatus;VideoPortZeroMemory(&hwInitData, sizeof(VIDEO_HW_INITIALIZATION_DATA));hwInitData.HwInitDataSize                = sizeof(VIDEO_HW_INITIALIZATION_DATA);hwInitData.HwFindAdapter                 = FakeGfxCard_FindAdapter;hwInitData.HwInitialize                  = FakeGfxCard_Initialize;hwInitData.HwStartIO                     = FakeGfxCard_StartIO;hwInitData.HwResetHw                     = FakeGfxCard_ResetHW;hwInitData.HwInterrupt                   = FakeGfxCard_VidInterrupt;hwInitData.HwGetPowerState               = FakeGfxCard_GetPowerState;hwInitData.HwSetPowerState               = FakeGfxCard_SetPowerState;hwInitData.HwGetVideoChildDescriptor     =FakeGfxCard_GetChildDescriptor;vpStatus = VideoPortInitialize(pContext1, pContext2, &hwInitData, NULL);return vpStatus;}

将VideoPortInitialize的返回值作为DriverEntry函数的返回值,返回调用者。

在你直接简单的传递DriverObject给VideoPrt.SYS之前,你还需要填充一个数据结构,这个数据结构中包含了你驱动中的入口点,这些入口点会被VideoPrt.SYS驱动调用来执行不同的动作。"HwStartIO"是指你可以处理IOCTLs,在显示驱动和视频迷你小端口驱动之间,你可以使用IOCTLs。显示驱动只需要简单调用"EngDeviceIoControl",迷你小端口驱动中的HwStartIO就会处理IOCTL。代码如下:

#pragma alloc_text(PAGE, FakeGfxCard_GetPowerState)
#pragma alloc_text(PAGE, FakeGfxCard_SetPowerState)
#pragma alloc_text(PAGE, FakeGfxCard_GetChildDescriptor)
#pragma alloc_text(PAGE, FakeGfxCard_FindAdapter)
#pragma alloc_text(PAGE, FakeGfxCard_Initialize)
#pragma alloc_text(PAGE, FakeGfxCard_StartIO)BOOLEAN FakeGfxCard_ResetHW(PVOID HwDeviceExtension,ULONG Columns, ULONG Rows)
{return TRUE;
}BOOLEAN FakeGfxCard_VidInterrupt(PVOID HwDeviceExtension)
{return FALSE;
}VP_STATUS FakeGfxCard_GetPowerState(PVOID HwDeviceExtension,ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl)
{            return NO_ERROR;
}VP_STATUS FakeGfxCard_SetPowerState(PVOID HwDeviceExtension,ULONG HwId, PVIDEO_POWER_MANAGEMENT VideoPowerControl)
{
return NO_ERROR;}ULONG FakeGfxCard_GetChildDescriptor (PVOID HwDeviceExtension,PVIDEO_CHILD_ENUM_INFO ChildEnumInfo, PVIDEO_CHILD_TYPE pChildType,PVOID pChildDescriptor, PULONG pUId, PULONG pUnused){return ERROR_NO_MORE_DEVICES;}VP_STATUS FakeGfxCard_FindAdapter(PVOID HwDeviceExtension,PVOID HwContext, PWSTR ArgumentString,PVIDEO_PORT_CONFIG_INFO ConfigInfo, PUCHAR Again){return NO_ERROR;}BOOLEAN FakeGfxCard_Initialize(PVOID HwDeviceExtension){return TRUE;}BOOLEAN FakeGfxCard_StartIO(PVOID HwDeviceExtension,PVIDEO_REQUEST_PACKET RequestPacket){RequestPacket->StatusBlock->Status      = 0;RequestPacket->StatusBlock->Information = 0;return TRUE;}

由于我没有任何硬件,对于迷你小端口驱动,简单实现就足够了。如果我需要在系统上访问或者执行一个操作,显示驱动靠它自己有限的API函数集是不能做到的。我会用到的唯一的API就是"StartIO"。可是在这个实现中,我们不需要做什么。记住,迷你小端口驱动的主要用途就是枚举硬件设备/资源和管理他们。如果你没有什么硬件设备/资源,那么为了让驱动模型高兴,除了必需的外删除其他的。

驱动开发之六 --- 一个简单的显示驱动之一 [译文]相关推荐

  1. 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动

    目录 0.测试环境说明 1.设备树的修改 2.设备驱动框架 3.I2C数据传输过程 3.1 struct i2c_msg 3.2 SHT20的数据收发 4.I2C适配器超时等待时间的修改 本文资源 参 ...

  2. [stm32] 一个简单的stm32vet6驱动的天马4线SPI-1.77寸LCD彩屏DEMO

    书接上文<1.一个简单的nRF51822驱动的天马4线SPI-1.77寸LCD彩屏DEMO> 我们发现用16MHz晶振的nRF51822驱动1.77寸的spi速度达不到要求 本节主要采用7 ...

  3. Windows驱动开发学习笔记(二)—— 驱动调试内核编程基础

    Windows驱动开发学习笔记(二)-- 驱动调试&内核编程基础 基础知识 驱动调试 PDB(Program Debug Database) WinDbg 加载 PDB 实验:调试 .sys ...

  4. STM32MP157驱动开发——设备树下的LED驱动

    STM32MP157驱动开发--设备树下的LED驱动 主要内容:将之前章节中使用新设备设备驱动编写的LED驱动改成设备树形式 文章目录 STM32MP157驱动开发--设备树下的LED驱动 一.主要步 ...

  5. i.MX 6ULL 驱动开发 十四:LED(paltform驱动框架)

    一.驱动设计思想(机制.策略.分离.分层) 驱动设计思想(机制.策略.分离.分层)_正在起飞的蜗牛的博客-CSDN博客_机制与策略分离 二.驱动开发框架 三.platform 基本概念 Linux 驱 ...

  6. python小项目实例流程-Python小项目:快速开发出一个简单的学生管理系统

    原标题:Python小项目:快速开发出一个简单的学生管理系统 本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: ...

  7. python小项目案例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  8. python项目开发实例-Python小项目:快速开发出一个简单的学生管理系统

    本文根据实际项目中的一部分api 设计抽象出来,实例化成一个简单小例子,暂且叫作「学生管理系统」. 这个系统主要完成下面增删改查的功能: 包括: 学校信息的管理 教师信息的管理 学生信息的管理 根据A ...

  9. 逆变器方案(高频 工频)正弦波逆变驱动开发板,完全兼容EG8010驱动板

    逆变器方案(高频 工频)正弦波逆变驱动开发板,完全兼容EG8010驱动板,高频机工频机通用,资料包含源代码,带中文注释,原理图,PCB图,高质量开发板代码,可以直接上机运行 ID:4215006632 ...

最新文章

  1. 关于yarn.nodemanager.vmem-pmem-ratio的通俗解释
  2. 使用 .NET Core模板引擎创建自定义的模板和项目
  3. python两个线程交替打印_三线程按顺序交替打印ABC的四种方法
  4. mfc的WM_PAINT笔记
  5. 跟我一起学docker(15)--监控日志和日志管理
  6. 大数据_Flink_Java版_数据处理_流处理API_Sink操作_把数据存储到ElasticSearch---Flink工作笔记0040
  7. 信息系统项目管理06——项目进度管理
  8. [导入]你的网站被订阅了吗(浅谈RSS2.0)续
  9. rdkit Kekulize
  10. opencv 摄像头偏色问题 自动变亮问题 解决办法
  11. 记开发过的一款无线音箱解决方案
  12. 同方有云,加速领跑信创新时代
  13. 详解word2vec
  14. 4.4 给单元格快速添加斜线 [原创Excel教程]
  15. 空间尺寸对迭代次数的影响
  16. 新版标准日本语高级_第19课
  17. 初学者如何吃透一个Java项目
  18. ubuntu更新源及添加方法
  19. stm32 CANOpen
  20. 【Effective C++】item20: Prefer pass-by-reference-to-const to pass-by-value

热门文章

  1. “云淮杯”程序设计竞赛
  2. 西克VT12T-2P430光电传感器
  3. 2021年中国医疗卫生机构数量达103.1万个,诊疗人次达85.3亿次[图]
  4. 计算机毕业设计|外文文献翻译-BBS论坛介绍
  5. Supporting Multiple Screens(支持Android各种屏幕尺寸)
  6. 移动咪咕盒子红外遥控驱动
  7. 分子量(Molar Mass)
  8. 去视频、图片水印免费工具/软件
  9. 【法律适用】将微信记录作为打官司证据的最全攻略(2020法院版)
  10. TI AM335x继任者?AM6254性能解析