当前位置: 首页 > news >正文

WinX86内核02-驱动程序

把昨天的程序改用 c++ 编译,改成 .cpp ,发现编译报错

image.png

原因是名称粉碎,因此可以直接 extern “C”声明一下这个函数 或者用 头文件(推荐)

因为 在头文件中 可以把 头文件一起包含进去

 

 #pragma once  extern "C" {  #include <Ntddk.h>  ​   /*驱动入口函数*/  NTSTATUS DriverEntry(__in struct _DRIVER_OBJECT* DriverObject,          __in PUNICODE_STRING  RegistryPath);  ​  /*驱动卸载函数*/  VOID Unload(__in struct _DRIVER_OBJECT* DriverObject);  ​  }

api

在驱动编程里面也可以面向对象编程,可以用class ,但是有很多功能是禁止的 ,例如 try catch 这是3环的机制,内核处理的方法不一样, malloc , printf ,scanf,new 等 基本的库函数 和 3环 的 api都不行 因为 内核有一套独立的内核空间,必须用微软提供的独立的内核api去申请 .操作系统会提供一套独立的 内核专用的 内核 api

Reference 里面就是所有的api

image.png

image.png

WDM(NT)驱动框架

我们前面写的算一个一个驱动程序 (有打印功能),但不具备交互性,即不能跟驱动沟通

那么怎么让驱动具备交互性呢(跟3环程序作交互)

内核驱动一般不做界面功能,有3环程序来做,因为内核不能中出bug

因此 内核驱动开发有一个原则,驱动里面3环能解决的问题就在3环解决,驱动里面只做内核才能做的事

  • 1.

    想要跟3环做交互,那就要按操作系统的设计来做这个框架

  • 2.

    如果不需要跟3环程序交互,可能不需要 按 操作系统的设计来

  • 3.

    卸载函数必须有,不然装上了就无法卸载 (因为有些驱动可能是系统一定要用的,防止被误卸载了)如果是开机启动,重启也无法卸载,除非进安全模式

image.png

步骤
  • 1.

    实现驱动入口函数 DriverEntry

  • 2.

    创建设备

  • 3.

    注册派函数

  • 4.

    注册卸载函数 Unload

系统 =》 驱动接口 =》 硬件

因为将来的硬件我们也知道有什么,所以驱动接口必须支持现在的硬件,还要支持将来的硬件,因此驱动接口的设计就十分重要,必须抽象

驱动接口 => 抽象 =》 硬件共同的特点 => 文件

应用程序 =》 文件API => 系统 => 驱动操作接口(open read write close) Dispatch Routines =》 硬件

写驱动就是想操作系统提供 open read write close 的接口,就是文件指针,这些函数就是派遣函数

设备对象 DEVICE_OBJECT 存放 open read write close 的接口

绑定

驱动对象 DRIVER_OBJECT 虚拟出来的,当操作系统加载驱动的时候,就会创建一个驱动对象来描述加载的驱动的所有信息 DriverObject

3环程序只需要 操作设备对象 ,设备对象自然会跟驱动对象绑定

image.png

实现
实现驱动入口函数 DriverEntry
 

 /*驱动入口函数*/  NTSTATUS DriverEntry(      __in struct _DRIVER_OBJECT* DriverObject,      __in PUNICODE_STRING  RegistryPath)  {  ​      return STATUS_SUCCESS;  }

添加设备

操作系统会提供内核API 实现王操作系统添加一个设备

ms-help://MS.WDK.v10.7600.091201/Kernel_r/hh/Kernel_r/k104_1e38a631-7e65-4b4b-8d51-3150a8073511.xml.htm

image.png

最常用的就是 IoCreateDevice

image.png


参数:

  • 1.

    驱动对象 (一个驱动可以创建多个设备对象,他就会挂链表)

  • 2.

    设备口拓展大小 (驱动对象结构体有一个空指针成员,可以用来存放用户申请的地址,对结构体进行拓展,用来取代全局变量),一般定义一个结构体,也可以不用

  • 3.

    设备名字 (在内核中基本不用 3环的字符串格式char* 即不是'\0'结尾的字符串,而是用 UNICODE_STRING 结构体),名字有要求 前面必须要有 \Device\ 。而且必须唯一,不可以与其他设备相同

  • 4.

    设备种类,不能为NULL

  • 5.

    是否独占 一般是false true表示独占:该软件使用时,其他软件无法使用

  • 6.

    返回的设备对象

不用char* 是因容易字符串一处造成漏洞

内核中有些库函数还是可以用的 如: strlen strcpy但不推荐,因为不是 "\0" 结尾

windows整个操作系统是由C语言 + 汇编写的,但他整个设计用的是面向对象的思想的

内核里面基本返回值统一,这样调 api 可以统一检查 ,通过宏 NT_SUCCESS 检查

驱动卸载下次在安装将创建不了,因为名称被占用了,因此需要在upload 中 删除对象设备

 

#define DEVICE_NAME L"\\Device\\CR42" UNICODE_STRING ustrDevName; //ustrDevName.Length = 8; //ustrDevName.MaximumLength = 10; //ustrDevName.Buffer = L"CR42"; RtlInitUnicodeString(&ustrDevName, DEVICE_NAME); //该函数就是实现上面3 行代码 PDEVICE_OBJECT pDevObj = NULL; NTSTATUS Status = IoCreateDevice(DriverObject, sizeof(MyDeviceExt), &ustrDevName, FILE_DEVICE_UNKNOWN, //不知道的设备类型 FILE_DEVICE_SECURE_OPEN, FALSE, //独占 &pDevObj); if (!NT_SUCCESS(Status)) { //检查错误 DbgPrint("[51asm] IoCreateDevice Status:%p\n", Status); return Status; //失败返回 状态码 }

注册派遣函数

驱动对象最后一项是一个函数指针数组,我们驱动有什么功能就填什么功能,而且通过宏说明了每个下标分别放什么功能

image.png

一般对一内核驱动来说 必须提供 打开 关闭 控制 3个功能

这些函数就是派遣函数,也可以称回调函数

 

 NTSTATUS DispatchCreate(    _In_ struct _DEVICE_OBJECT* DeviceObject,    _Inout_ struct _IRP* Irp  );  ​  NTSTATUS DispatchClose(    _In_ struct _DEVICE_OBJECT* DeviceObject,    _Inout_ struct _IRP* Irp  );  ​  NTSTATUS DispatchRead(    _In_ struct _DEVICE_OBJECT* DeviceObject,    _Inout_ struct _IRP* Ir

相关文章:

WinX86内核02-驱动程序

把昨天的程序改用 c++ 编译,改成 .cpp ,发现编译报错 原因是名称粉碎,因此可以直接 extern “C”声明一下这个函数 或者用 头文件(推荐) 因为 在头文件中 可以把 头文件一起包含进去 #pragma once extern "C" { #include <Ntddk.h> ​ /*驱动入口函…...

基于SpringBoot+Vue的体育馆场地预约系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

【WebGIS】Cesium:天地图加载

天地图是中国国家基础地理信息系统&#xff0c;由中国测绘地理信息局和国家地理信息公共服务平台共同开发和运营。它提供多项地理信息服务&#xff0c;包括地图数据、地理编码、路径规划以及地理搜索等。天地图的目标是为各行业提供高质量、全面的地理信息数据和解决方案。 天…...

[产品管理-46]:产品组合管理中的项目平衡与管道平衡的区别

目录 一、项目平衡 1.1 概述 1.2 项目的类型 1、根据创新程度和开发方式分类 2、根据产品开发和市场周期分类 3、根据风险程度分类 4、根据市场特征分类 5、根据产品生命周期分类 1.3 产品类型的其他分类 1、按物理形态分类 2、按功能或用途分类 3、按技术或创新程…...

【MySQL】MySQL的简单了解详解SQL分类数据库的操纵方法

一、mysql定义 mysql是数据库服务的客户端&#xff0c;mysqld是数据库服务的服务器端。mysql的本质就是基于CS模式下的一种网络服务。数据库一般指的是在磁盘中或内存中存储的特定结构组织的数据&#xff0c;将来就是在磁盘上存储的一套数据库方案。 创建数据库&#xff0c;本质…...

【Python爬虫实战】正则:从基础字符匹配到复杂文本处理的全面指南

&#x1f308;个人主页&#xff1a;https://blog.csdn.net/2401_86688088?typeblog &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、正则表达式 &#xff08;一&#xff09;正则表达式的基本作用 &#xf…...

10.18Python基础迭代器生成器_函数式编程

Python迭代器与生成器 1. 迭代器 Iterator 什么是迭代器 迭代器是访问集合元素的一种方式。迭代器是一个可以记住遍历的位置的对象。迭代器可以重复使用&#xff0c;而不会像列表那样在迭代时被修改。 迭代器函数iter和next 函数说明iter(iterable)从可迭代对象中返回一个迭…...

HttpPost 类(构建 HTTP POST 请求)

HttpPost 类是 Apache HttpClient 库中的一个类&#xff0c;用于构建 HTTP POST 请求。以下是 HttpPost 类的一些常用方法和代码案例&#xff1a; 常用方法 构造方法&#xff1a; HttpPost(String uri)&#xff1a;创建一个 HttpPost 对象&#xff0c;并将请求的 URI 作为参数…...

xtu oj 原根

文章目录 回顾杂思路c 语言代码 回顾 AB III问题 H: 三角数问题 G: 3个数等式 数组下标查询&#xff0c;降低时间复杂度1405 问题 E: 世界杯xtu 数码串xtu oj 神经网络xtu oj 1167 逆序数&#xff08;大数据&#xff09; 杂 有一些题可能是往年的程设的题&#xff0c;现在搬到…...

Java Spring 中常用的 @PostConstruct 注解使用总结

引言 在最近的学习中&#xff0c;我发现了一个非常实用的注解 —— PostConstruct。通过深入学习&#xff0c;逐步发现这个注解在实际开发中可以帮助我们更轻松地解决不少原本复杂的问题&#xff0c;特别是在项目启动时自动执行一些必要的初始化操作。相比于手动调用&#xff…...

Visual Studio--VS安装配置使用教程

Visual Studio Visual Studio 是一款功能强大的开发人员工具&#xff0c;可用于在一个位置完成整个开发周期。 它是一种全面的集成开发环境 (IDE)。对新手特别友好&#xff0c;使用方便&#xff0c;不需要复杂的去配置环境。用它学习很方便。 Studio安装教程 Visual Studio官…...

什么叫CMS?如何使用CMS来制作网站?

CMS是什么&#xff1f; 内容管理系统&#xff08;Content Management System&#xff0c;CMS&#xff09;&#xff0c;是一种位于WEB前端&#xff08;Web 服务器&#xff09;和后端办公系统或流程&#xff08;内容创作、编辑&#xff09;之间的软件系统。内容的创作人员、编辑人…...

如何获取谷歌浏览器窗口句柄并将其设置为Qt的父窗口

1、首先&#xff0c;确保你在项目的 .pro 文件中加入对WinAPI的支持&#xff1a; win32: LIBS -luser322、步骤概述&#xff1a; 使用WinAPI获取谷歌浏览器窗口的句柄。获取Qt窗口的句柄。使用SetParent函数&#xff0c;将Qt窗口设置为谷歌浏览器窗口的子窗口。调整Qt窗口的…...

牛客小白月赛102:最短?路径(分层bfs)

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 给定一个 nnn 个点 mmm 条边的无向图&#xff0c;LH 打算从点 111 出发去点 nnn。 假如 LH 到达了一个点 iii&#xff0c;那么他可以选择在这个点花费 aia_iai​ 的时间休息后继续赶…...

JSON字符串转成java的Map对象

要将这个JSON字符串转换成Java对象&#xff0c;你可以定义一个Element类来表示每个要素&#xff0c;然后使用一个Map来存储这些要素。以下是具体的实现步骤&#xff1a; 步骤 1: 定义 Element 类 首先&#xff0c;定义一个Element类来表示每个要素的结构&#xff1a; public…...

重读《人月神话》(8)-为什么巴比伦塔会失败?(Why Did the Tower of Babel Fail?)

据《创世纪》记载&#xff0c;巴比伦塔是人类继诺亚方舟之后的第二大工程壮举&#xff0c;但巴比伦塔同时也是第一个彻底失败的工程。 巴比伦塔的管理教训 这个项目具备了几乎所有成功的先决条件&#xff1a; 有清晰的目标&#xff0c;尽管目标理想化到了近乎不可实现的地步&…...

STL源码剖析:Hashtable

hashtable 概述 哈希表是一种数据结构&#xff0c;它提供了快速的数据插入、删除和查找功能。它通过使用哈希函数将键&#xff08;key&#xff09;映射到表中的一个位置来实现这一点&#xff0c;这个位置称为哈希值或索引。哈希表使得这些操作的平均时间复杂度为常数时间&…...

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四&#xff0c;五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的&#xff0c;包名 实体类的定义…...

《案例》—— OpenCV 实现2B铅笔填涂的答题卡答案识别

文章目录 一、案例介绍二、代码解析 一、案例介绍 下面是一张使用2B铅笔填涂选项后的答题卡 使用OpenCV 中的各种方法进行真确答案识别&#xff0c;最终将正确填涂的答案用绿色圈出&#xff0c;错误的答案不圈出&#xff0c;用红色圈出错误题目的正确答案最终统计正确的题目数…...

新员工入职流程指南_完整入职流程解析

文章介绍了新员工入职流程的重要性、步骤及持续时间&#xff0c;并推荐ZohoPeople软件自动化管理入职流程&#xff0c;提升新员工入职体验&#xff0c;减少离职率&#xff0c;确保合规性&#xff0c;提升公司品牌形象。 一、新员工入职流程是怎样的&#xff1f; 入职流程是指一…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

椭圆曲线密码学(ECC)

一、ECC算法概述 椭圆曲线密码学&#xff08;Elliptic Curve Cryptography&#xff09;是基于椭圆曲线数学理论的公钥密码系统&#xff0c;由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA&#xff0c;ECC在相同安全强度下密钥更短&#xff08;256位ECC ≈ 3072位RSA…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...