spice qxl-dod windows驱动笔记1

KMOD驱动是微软提供的一个Display Only驱动。
Windows驱动的入口函数是 DriverEntry ,所以显示Mini小端口驱动程序也不例外。 和其它Mini小端口驱动的入口函数实现一致,在其 DriverEntry 只做一件事,就是分配系统指定的一个结构体,然后调用框架提供的接口函数即可。
extern "C"
NTSTATUS DriverEntry(_In_  DRIVER_OBJECT*  pDriverObject, _In_  UNICODE_STRING* pRegistryPath)
{PAGED_CODE();WPP_INIT_TRACING(NULL, NULL);DbgPrint(TRACE_LEVEL_FATAL, ("---> KMDOD build on on %s %s\n", __DATE__,  __TIME__));RTL_OSVERSIONINFOW versionInfo;versionInfo.dwOSVersionInfoSize = sizeof(versionInfo);RtlGetVersion(&versionInfo);// VSync control is NOT planned to be enabled on Win10 builds// before RS1. Enabling it on DOD driver causes OS to stop the driver// with error 43 when the system turns off display due to idle setting.// On Windows 8.1 (9200 and 9600) till now no problem observed// (OS does not send VSync enable command)// On Windows 10RS1 (14393) enabling VSync control activates// watchdog policy and creates high sensitivity to long (> 2 sec)// processing in PresentDisplayOnly callback (stop with error 43)if (versionInfo.dwBuildNumber >= 14393 || versionInfo.dwBuildNumber <= 9600){// we will uncomment the line below after we address all the problems// related to enabled VSync control in Win10RS1//g_bSupportVSync = TRUE;// for support/troubleshooting be able to disable VSync on specific machineQueryVSyncSetting(g_bSupportVSync, pRegistryPath);}DbgPrint(TRACE_LEVEL_WARNING, ("VSync support %sabled for %d.%d.%d\n",g_bSupportVSync ? "en" : "dis",versionInfo.dwMajorVersion, versionInfo.dwMinorVersion,  versionInfo.dwBuildNumber));// Initialize DDI function pointers and dxgkrnlKMDDOD_INITIALIZATION_DATA InitialData = {0};InitialData.Version = DXGKDDI_INTERFACE_VERSION;//1、关于PNP处理的回调函数:这些回调函数用于处理设备创建,起始,停止,电源相关和子设备的相关回调。InitialData.DxgkDdiAddDevice                    = DodAddDevice;InitialData.DxgkDdiStartDevice                  = DodStartDevice;InitialData.DxgkDdiStopDevice                   = DodStopDevice;InitialData.DxgkDdiResetDevice                  = DodResetDevice;InitialData.DxgkDdiRemoveDevice                 = DodRemoveDevice;InitialData.DxgkDdiUnload                       = DodUnload;InitialData.DxgkDdiDispatchIoRequest            = DodDispatchIoRequest;InitialData.DxgkDdiInterruptRoutine             = DodInterruptRoutine;InitialData.DxgkDdiDpcRoutine                   = DodDpcRoutine;//2、与总线子设备上报相关的:类示总线设备的IRP_MN_QUERY_DEVICE_RELATIONS及有PNP子设备InitialData.DxgkDdiQueryChildRelations          = DodQueryChildRelations;InitialData.DxgkDdiQueryChildStatus             = DodQueryChildStatus;InitialData.DxgkDdiQueryDeviceDescriptor        = DodQueryDeviceDescriptor;InitialData.DxgkDdiSetPowerState                = DodSetPowerState;InitialData.DxgkDdiQueryAdapterInfo             = DodQueryAdapterInfo;InitialData.DxgkDdiQueryInterface               = DodQueryInterface;//3、为与硬件相关的IRP处理:如中断及DPC处理的DxgkDdiInterruptRoutine和DxgkDdiDpcRoutine,有获取设备属性,读写设备帧内存、显示桌面内容(Present)等函数。if (g_bSupportVSync){InitialData.DxgkDdiControlInterrupt = DodControlInterrupt;InitialData.DxgkDdiGetScanLine = DodGetScanLine;}InitialData.DxgkDdiPresentDisplayOnly           = DodPresentDisplayOnly;InitialData.DxgkDdiSystemDisplayEnable          = DodSystemDisplayEnable;InitialData.DxgkDdiSystemDisplayWrite           = DodSystemDisplayWrite;//4、与显卡输出相关的操作,如包括对鼠标位置的更新,显示器Mode的枚举和设置等函数:InitialData.DxgkDdiSetPointerPosition           = DodSetPointerPosition;InitialData.DxgkDdiSetPointerShape              = DodSetPointerShape;InitialData.DxgkDdiQueryVidPnHWCapability       = DodQueryVidPnHWCapability;InitialData.DxgkDdiEscape                       = DodEscape;InitialData.DxgkDdiIsSupportedVidPn             = DodIsSupportedVidPn;InitialData.DxgkDdiRecommendFunctionalVidPn     = DodRecommendFunctionalVidPn;InitialData.DxgkDdiEnumVidPnCofuncModality      = DodEnumVidPnCofuncModality;InitialData.DxgkDdiSetVidPnSourceVisibility     = DodSetVidPnSourceVisibility;InitialData.DxgkDdiCommitVidPn                  = DodCommitVidPn;InitialData.DxgkDdiUpdateActiveVidPnPresentPath =  DodUpdateActiveVidPnPresentPath;InitialData.DxgkDdiRecommendMonitorModes        = DodRecommendMonitorModes;InitialData.DxgkDdiStopDeviceAndReleasePostDisplayOwnership =  DodStopDeviceAndReleasePostDisplayOwnership;NTSTATUS Status = DxgkInitializeDisplayOnlyDriver(pDriverObject,  pRegistryPath, &InitialData);if (!NT_SUCCESS(Status)){DbgPrint(TRACE_LEVEL_ERROR, ("DxgkInitializeDisplayOnlyDriver failed with  Status: 0x%X\n", Status));}DbgPrint(TRACE_LEVEL_INFORMATION, ("<--- %s\n", __FUNCTION__));return Status;
}
主要过程
* 操作系统调用display miniport驱动程序的DriverEntry函数。
* DriverEntry分配一个 DRIVER_INITIALIZATION_DATA 结构,并初始化其成员变量 Version为DXGKDDI_INTERFACE_VERSION 和其它指针变量(主要是回调函数)。
* DriverEntry调用DxgkInitialize函数来加载Microsoft DirectX图形内核子系统(DXGKNL.sys)并为DirectX图形内核子系统提供指向显示微型端口驱动程序的其他入口点函数的指针。
* DxgkInitialize返回后,DriverEntry将DxgkInitialize的返回值传播回操作系统。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/48241.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Github遇到的问题解决方法总结(持续更新...)

1.github每次push都需要输入用户名和token的解决方法 push前&#xff0c;执行下面命令 &#xff1a; git config --global credential.helper store 之后再输入一次用户名和token之后&#xff0c;就不用再输入了。 2.git push时遇到“fatal: unable to access https://githu…

Meta发布最强AI模型,扎克伯格公开信解释为何支持开源?

凤凰网科技讯 北京时间7月24日&#xff0c;脸书母公司Meta周二发布了最新大语言模型Llama 3.1&#xff0c;这是该公司目前为止推出的最强大开源模型&#xff0c;号称能够比肩OpenAI等公司的私有大模型。与此同时&#xff0c;Meta CEO马克扎克伯格(Mark Zuckerberg)发表公开信&a…

Spring Boot + Shiro 实现 Session 持久化实现思路及遗留问题

目录 引言 项目场景 应用技术 实现思路 问题暴露 解决方案 本人理解 引言 Session 为什么需要持久化? Session 持久化的应用场景很多,诸如: 满足分布式:Session 作为有状态会话,体现在 Sessionid 与生成 Session 的服务器参数相关,在实现机理上不支持分布式部署…

opencv grabCut前景后景分割去除背景

参考&#xff1a; https://zhuanlan.zhihu.com/p/523954762 https://docs.opencv.org/3.4/d8/d83/tutorial_py_grabcut.html 环境本次&#xff1a; python 3.10 提取前景&#xff1a; 1、需要先把前景物体框出来 需要坐标信息&#xff0c;可以用windows自带的画图简单提取像素…

Concat() Function-SQL-字符串拼接函数

Concat() Function-SQL 在SQL中&#xff0c;CONCAT() 函数用于将两个或多个字符串连接在一起。 不同数据库管理系统可能有些许差异&#xff0c;但基本用法和语法通常是相似的。 语法 CONCAT(string1, string2, ...)string1, string2, …: 这些是需要连接的字符串参数。可以…

089、Python 读取Excel文件及一些操作(使用openpyxl库)

对于低版本的Excel文件&#xff0c;我们可以使用xlwt/xlrd库&#xff0c;对于高版本的Excel文件(.xlsx)&#xff0c;xlwt/xlrd库从版本2.0.0开始不再支持&#xff0c;所以要读取.xlsx文件&#xff0c;我们需要单独使用openpyxl第三方库。 首先是安装&#xff1a; pip install…

【时序约束】读懂用好Timing_report

一、静态时序分析&#xff1a; 静态时序分析&#xff08;Static Timing Analysis&#xff09;简称 STA&#xff0c;采用穷尽的分析方法来提取出整个电路存在的所有时序路径&#xff0c;计算信号在这些路径上的传播延时&#xff0c;检查信号的建立和保持时间是否满足时序要求&a…

Java并发编程实战读书笔记(二)

对象的组合 在设计线程安全的类时&#xff0c;确保数据的一致性和防止数据竞争是至关重要的。这通常涉及三个基本要素&#xff1a;确定构成对象状态的所有变量&#xff0c;明确约束这些状态变量的不变性条件&#xff0c;以及建立管理对象状态并发访问的策略。 要确定构成对象…

定时器+外部中断实现NEC红外线协议解码

一、前言 1.1 功能介绍 随着科技的进步和人们生活水平的提高&#xff0c;红外遥控器已经成为了日常生活中不可或缺的电子设备之一&#xff0c;广泛应用于电视、空调、音响等多种家电产品中。 传统的红外遥控器通常只能实现预设的有限功能&#xff0c;无法满足用户对设备更加智…

创建vue2/vue3项目

目录 创建一个Vue2项目创建一个Vue3项目 创建一个Vue2项目 ## 安装Vue-Cli &#xff1a; npm install -g vue/cli // Vue CLI 4.x 需要 Node.js v8.9 或更高版本 (推荐 v10 以上)vue --version // 检测版本是否正确## 创建一个项目&#xff1a; vue create hello-world // hel…

TCP客户端connect断线重连

文章目录 TCP客户端connect断线重连1、为什么要断线重连2、实现代码 TCP客户端connect断线重连 1、为什么要断线重连 客户端会面临服务器崩溃的情况&#xff0c;我们可以试着写一个客户端重连的代码&#xff0c;模拟并理解一些客户端行为&#xff0c;比如游戏客户端等. 考虑到…

实战篇(十二):如何使用 Processing 创建一个多功能的简易吃豆人游戏

如何使用 Processing 创建一个多功能的简易吃豆人游戏 文章目录 如何使用 Processing 创建一个多功能的==简易==吃豆人游戏引言准备工作第一步:设置基本框架第二步:创建 Pacman 类第三步:创建 Obstacle 类第四步:添加分数系统第五步:运行游戏完整代码结论参考资料引言 吃…

c++中的哈希查找(Hash Search)和B树查找(B-Tree Search)

前言 hello大家好啊&#xff0c;我是文宇&#xff0c;不是文字&#xff0c;是文宇哦&#xff0c;这期也是关于查找算法的。 哈希查找&#xff08;Hash Search&#xff09; 哈希查找&#xff08;Hash Search&#xff09;是一种基于哈希表的查找算法&#xff0c;它可以在常数时…

STL常用算法——常用查找算法

自定义类型都要用仿函数判断 1.find() class Person { public:Person(string name,int age){this->m_Name name;this->m_Age age;}bool operator(const Person &p)//重载operator{if (this->m_Name p.m_Name && this->m_Age p.m_Age){return true;…

【云原生】NameSpace名称空间详解

名称空间 文章目录 名称空间一、名字空间二、何时使用多个名称空间三、初始名称空间3.1、default3.2、kube-node-lease3.3、kube-public3.4、kube-system 四、通过名称空间共享集群4.1、查看名称空间4.2、获取名称空间详细信息4.3、名称空间的两种状态4.4、创建名称空间4.5、删…

NVIDIA 全面转向开源 GPU 内核模块

NVIDIA 全面转向开源 GPU 内核模块 文章目录 NVIDIA 全面转向开源 GPU 内核模块支持的 GPU安装程序更改使用带有 CUDA 元包的包管理器 使用运行文件使用安装帮助脚本包管理器详细信息dnf&#xff1a;Red Hat Enterprise Linux、Fedora、Kylin、Amazon Linux 或 Rocky Linuxzypp…

网络安全等级保护:什么是网络安全等级保护?(非常详细)零基础入门到精通,收藏这一篇就够了

关键词&#xff1a; 网络安全等级保护 等级保护 网络 信息系统 旧话重提&#xff0c;一直以来&#xff0c;我们不断强调“等级保护”制度是我国的网络安全领域的基本制度、基本策略和基本方法&#xff0c;是促进信息化健康发展&#xff0c;维护国家安全、社会秩序和公共利益的…

数字图像处理中的常用特殊矩阵及MATLAB应用

一、前言 Matlab的名称来源于“矩阵实验室&#xff08;Matrix Laboratory&#xff09;”&#xff0c;其对矩阵的操作具有先天性的优势&#xff08;特别是相对于C语言的数组来说&#xff09;。在数字图像处理中&#xff0c;为了提高编程效率&#xff0c;我们可以使用多种方式来创…

Mysql数据库和Sql语句

数据库管理&#xff1a; sql语句&#xff1a;数据库用来增删改查的语句&#xff08;重要&#xff09; 备份&#xff1a;数据库的数据进行备份 主从复制、读写分离、高可用&#xff08;重要&#xff09; Mysql数据库和Sql语句 一、Mysql数据库 1、数据库&#xff1a;组织、…

Java基础(四) 内部类详解

Java 内部类详解 一. 内部类概述 内部类是嵌套在类内部进行定义的类&#xff0c;其外部的类则被称为外部类&#xff1b;按照内部类的定义位置&#xff0c;内部类可进一步划分为成员内部类、静态内部类、局部内部类和匿名内部类四种类型。内部类的出现实际上是进一步丰富了类的…