精华内容
下载资源
问答
  • 驱动开发
    千次阅读
    2021-11-08 23:34:29

    驱动开发

    枚举进程

    参考:
    https://cloud.tencent.com/developer/article/1397496

    未公开函数:
    PsGetProcessWow64Process

    强制读写内存

    方案1(R3):直接修改别人内存

    最基本的也最简单的就是直接通过WriteProcessMemory 和 ReadProcessMemory对没有进行保护的程序的内存进行修改,一些单机游戏辅助什么的可能会有这种简单方式修改其他进程内存。

    方案2(R3): 注入

    通过注入的方式想办法进入宿主进程,然后修改他的内存。这里的话姿势就很多了,远程代码注入,APC注入,输入法注入,LSP注入等等。最常用最省事的估计就是输入法注入,最不常用,但是效果最好的我个人感觉是LSP注入,这个之前用过一段时间。甚至直接可以在R3层做网络劫持了。不过LSP坑多,用者慎重。

    方案3(R0):KeStackAttachProcess

    在驱动里,直接附加到宿主进程内存,然后进行内存修改,强杀进程的时候也经常用这个姿势Attack进去,然后 进程虚拟地址空间擦除 直接干进程。

    void KWriteProcessMemory(IN PEPROCESS Process
    更多相关内容
  • 蔡工RK3288_Android7.1驱动开发入门

    千人学习 2020-02-17 13:13:44
    1、基于RK3288平台,基于Android7.1,kernel4.4的驱动移植、调试和开发,驱动框架分析,跟代码等; 2、讲解RK平台的常用外设模块驱动(例如LCD,TP,GPIO,wifi+BT,IR,... 3、介绍一些Android底层驱动开发知识等;
  • Linux设备驱动开发详解

    万次阅读 2022-01-20 23:02:12
    Linux设备驱动开发详解Linux设备驱动开发详解Linux设备驱动开发Linux设备驱动开发详解1. linux设备驱动概述及开发环境搭建2. 驱动设计的硬件基础3. linux内核及内核编程4. linux内核模块5. linux文件系统与设备文件6...

    img

    Linux设备驱动开发详解

    体验课(Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈)学习视频链接地址 
    正课学习视频链接地址
    第二个链接是我学习的链接,如果你有兴趣学习,我可以为你推荐,老学员推荐新学员会有相应的折扣 我的QQ号码: 852897652.

    Linux设备驱动开发详解
    最近在学习QQ群里获得了这本书,截取数字图片来进行学习。

    以前学习整理的
    整理知识点 进程管理和内存管理 链接1
    整理知识点 设备驱动和文件系统 链接2
    整理知识点 中断和网络 链接3
    整理知识点 内核实战 链接3

    Linux设备驱动开发

    1. linux设备驱动概述及开发环境搭建
    2. 驱动设计的硬件基础
    3. linux内核及内核编程
    4. linux内核模块
    5. linux文件系统与设备文件
    6. 字符设备驱动
    7. linux设备驱动中的并发控制
    8. linux设备驱动中的阻塞与非阻塞I/O
    9. linux设备驱动中的异步通知与异步I/O
    10. 中断与时钟
    11. 内存与I/O访问
    12. linux设备驱动的软件架构思想
    13. linux块设备驱动
    14. linux网络设备驱动
    15. linux I2C核心、总线与设备驱动
    16. USB主机、设备与Gadget驱动
    17. I2C、SPI、USB驱动架构类比
    18. ARM Linux设备树
    19. linux电源管理系统架构和驱动
    20. linux芯片级移植及底层驱动
    21. linux设备驱动的调试

    Linux设备驱动开发详解

    1. linux设备驱动概述及开发环境搭建

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    2. 驱动设计的硬件基础

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    3. linux内核及内核编程

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    4. linux内核模块

    在这里插入图片描述

    5. linux文件系统与设备文件

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    6. 字符设备驱动

    在这里插入图片描述
    在这里插入图片描述

    7. linux设备驱动中的并发控制

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    8. linux设备驱动中的阻塞与非阻塞I/O

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    9. linux设备驱动中的异步通知与异步I/O

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    10. 中断与时钟

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    11. 内存与I/O访问

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    #### 15. linux I2C核心、总线与设备驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    12. linux设备驱动的软件架构思想

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    13. linux块设备驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    14. linux网络设备驱动

    在这里插入图片描述 在这里插入图片描述
    在这里插入图片描述

    15. linux I2C核心、总线与设备驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    16. USB主机、设备与Gadget驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    17. I2C、SPI、USB驱动架构类比

    在这里插入图片描述
    在这里插入图片描述

    18. ARM Linux设备树

    在这里插入图片描述
    在这里插入图片描述

    19. linux电源管理系统架构和驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    20. linux芯片级移植及底层驱动

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    21. linux设备驱动的调试

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    总结

    展开全文
  • Android驱动开发与移植实战详解,完整扫描版

    千次下载 热门讨论 2014-03-13 21:39:22
    在每一章中,重点介绍了与Android驱动开发相关的底层知识,并对Android源码进行了详细的分析及驱动开发实现。 《Android驱动开发与移植实战详解》适合Android程序员、研发人员及Android爱好者学习,也可以作为相关...
  • DDD领域驱动开发

    千次阅读 2021-09-15 14:46:02
    文章目录DDD(Domain Driving Design)领域驱动开发架构对比微服务的问题战略设计(业务层面-业务架构)战术设计(技术层面-系统架构):DDD和微服务 DDD(Domain Driving Design)领域驱动开发 架构对比 单机架构...

    DDD(Domain Driving Design)领域驱动开发

    1、微服务设计为什么选择DDD

    1、架构对比
    • 单机架构:数据驱动架构

    • 集中式架构:面向对象的方式(三层架构)

    • 分布式微服务架构:应用之间解藕,解决单体用扩展性和弹性伸缩能力不足问题

    2、微服务的问题
    • 微服务粒度

    • 怎样拆分

    • 边界是什么

    DDD 核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。

    img
    3、战略设计(业务层面-业务架构)

    建立领域模型、划分领域边界,从业务的视角来划分微服务边界(收敛的过程)

    • 实体
    • 命令
    • 事件

    领域模型:指导微服务的设计和拆分。事件风暴是建立领域模型的主要的方法,

    事件风暴:

    • 从发散到收敛的一整个过程
    • 采用方法:用例分析、场景分析、用户旅程分析
    • 产出:产出实体、命令、事件等领域对象,将领域对象从不同维度进行聚类形成聚合限界上下文等边界,建立领域模型

    逻辑边界、物理边界

    4、战术设计(技术层面-系统架构):

    侧重于领域模型的实现,侧重于代码逻辑的设计和实现

    实现层面

    • 逻辑边界
    • 物理边界
    5、DDD和微服务

    DDD:主要关注从业务领域视角划分领域边界,通过业务抽象建立领域模型,维持业务和代码层面的一致性

    微服务:主要是从技术层面,实现去中心化数据管理和去中心化服务治理,关注微服务的独立开发、测试、构建和部署

    总结:DDD是一种架构设计方法,微服务是一种架构风格。DDD是一种从业务视角去分离系统建设复杂度的手段,应用于微服务中,DDD解决微服务设计过程中边界难以界定的问题

    2、领域、子域、核心域、通用域、支撑域

    • 领域:指一种特定的范围。用于限制业务边界和范围的。

    • 子域:对应更小的业务范围

      • 核心域:决定产品和公司核心竞争力的子域,业务成功的主要因素和公司的核心竞争力
      • 通用域:需要用到的通用系统
      • 支撑域:具有企业特性,但不具有通用性

    复杂问题拆解细分,建立子域

    • 研究对象
    • 研究对象细分

    领域的核心思想就是将问题域逐级细分,来降低业务理解和系统实现的复杂度。通过领域细分,逐步缩小微服务需要解决的问题域,构建合适的领域模型,而领域模型映射成系统就是微服务了。通过领域划分,区分不同子域在公司内的不同功能属性和重要性(核心域、通用域、支撑域),从而公司可对不同子域采取不同的资源投入和建设策略

    3、限界上下文

    • 通用语言定义上下文含义,限界上下文则定义领域边界

    • 限界上下文就是用来细分领域,从而定义通用语言所在的边界

    • 一个限界上下文理论上就可以设计为一个微服务

    4、实体和值对象:从领域模型的基础单元看系统设计

    DDD 引入值对象是希望实现从“数据建模为中心”向“领域建模为中心”转变。实体和值对象是微服务底层的最基础的对象。DDD 提倡从领域模型设计出发,而不是先设计数据模型。

    实体对象(业务层面)
    • 实体和值对象是组成领域模型的基础单元。

    • 在代码模型中,实体的表现形式是实体类,这个类包含了实体的属性和方法

    值对象(数据层面)

    在领域建模时,我们可以将部分对象设计为值对象,保留对象的业务涵义,同时又减少了实体的数量;在数据建模时,我们可以将值对象嵌入实体,减少实体表的数量,简化数据库设计

    img
    实体对象VS值对象
    • 实体一般对应业务对象,它具有业务属性和业务行为;而值对象主要是属性集合,对实体的状态和特征进行描述。

    总结:值对象的引入,保留了业务层面的含义,减少了实体数量,并且在数据建模层面,简化了数据库设计

    5、怎样设计聚合?聚合和聚合根

    • 聚合就是由业务和逻辑紧密关联的实体和值对象组合而成的,聚合是数据修改和持久化的基本单元,每一个聚合对应一个仓储,实现数据的持久化。

    • 聚合在 DDD 分层架构里属于领域层,领域层包含了多个聚合,共同实现核心业务逻辑

    聚合根解决了什么问题?

    聚合根的主要目的是为了避免由于复杂数据模型缺少统一的业务规则控制,而导致聚合、实体之间数据不一致性的问题

    聚合根承担的角色是什么?

    如果把聚合比作组织,那聚合根就是这个组织的负责人。聚合根也称为根实体,它不仅是实体,还是聚合的管理者。

    如何判断一个实体是否是聚合根?

    可以结合以下场景分析:是否有独立的生命周期?是否有全局唯一 ID?是否可以创建或修改其它对象?是否有专门的模块来管这个实体?

    6、领域事件

    用来表示领域中发生的事件。一个领域事件将导致进一步的业务操作,在实现业务解耦的同时,还有助于形成完整的业务闭环。领域事件来驱动业务的流转

    7、中台

    img
    展开全文
  • 组态王驱动开发包3.0最新版

    热门讨论 2011-09-13 14:22:17
    请将两个(驱动开发包3.0.part1.rar 、驱动开发包3.0.part2.rar )下载后放在一解压 组态王驱动开发包3.0最新版 1. 版权 本开发包版权属于北京亚控科技发展有限公司,任何组织、团体、个人,未经亚控公司允许,不得...
  • Windows 驱动开发 新手入门(一)

    千次阅读 2021-02-12 17:25:50
    Windows 驱动开发 新手入门(一)引言驱动介绍Win10 WDK建立一个驱动项目建立MyDriver.cpp理论知识驱动入口派遣函数 MajorFunctionDevice和SymbolicLinkDeviceExtensionIRP 引言 本文是对Windows下的驱动开发有一个...

    引言

    首先祝朋友们新年快乐,然后呢,因为无聊,写2篇文章打发时间,而且太久没弄过windows的东西了,算是回顾了,本文是对Windows下的驱动开发有一个简单的介绍,我尽可能写的小白文一些,因为大多数的驱动开发书籍对新手来说还是过于难理解。

    本篇文章通过WDM进行介绍,具体NT式驱动例子看这:
    Windows 驱动开发 新手入门(二)

    本系列所有文章
    Windows 驱动开发 新手入门(三)
    Windows 驱动开发 新手入门(四)

    驱动介绍

    在介绍驱动开发之前,先了解一下基础知识驱动是什么的?

    驱动这个词是由Driver直译的,这和平常开发中的测试驱动开发(TDD)中的驱动并不是一个意思。
    驱动是在内核下工作的,如果你了解过Windows的一些内核对象(如Event Mutex等),你也许会认为在Windows用户层也可以随意获取到内核对象。实际上虽然我们在用户层可以获取到,但这只是通过微软公开的API获取的。

    驱动(Driver)我们可以理解为系统和硬件交互用的,我们不需要知道底层硬件是什么样子的,我们不需要为每个硬件单独写一份代码,因为我们可以通过系统和硬件交互,使用系统提供的API来和硬件交互,这些操作都是在系统内核中完成的。它是一套在Windows中的标准,我们不用关心硬件底层是如何实现的,这就像是DLL用户层模块驱动就是内核层模块

    设备(Device),可以是关联的物理设备,也可以是我们在驱动中创建的虚拟设备,应用层(通过Symbolic Link找到Device)向Device发送IRP(I/O Request Packet) IO请求包,此时我们的驱动就可以处理这些请求。我们为了拥有更高的权限,一般会创建一个虚拟设备,仅仅只是为了让代码在内核中工作。

    符号链接(Symbolic Link),Windows中可以通过mklink直接创建符号链接,它的作用你可以理解为Linux中的软连接,同样我们也可以通过代码创建一个符号链接,只是它指向的是一个Device,应用层通过符号链接找到设备,此时通过IRP就可以和驱动进行交互了。

    Win10 WDK

    Windows Driver Kit 用于开发、测试和部署 Windows 驱动程序(官网原话)

    由于我的电脑在去年中旬做过一次系统,所以索性装了VS2019,所以请挑选对应版本的WDK进行安装。
    Windows 10 版本 2004 VS 2019 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

    其他版本 https://docs.microsoft.com/zh-cn/windows-hardware/drivers/other-wdk-downloads

    建立一个驱动项目

    在安装完WDK后,新建项目选择Driver你会看见如下这些类型,VS2019中无法快速建立一个NT式驱动。
    1
    所以我们选择WDM驱动,我想先从WDM驱动介绍开始
    在这里插入图片描述

    可以清楚的看见只有一个inf文件,这个文件是之后驱动安装的文件,我们先跳过。
    1

    建立MyDriver.cpp

    Source Files目录建立MyDriver.cpp,并且将下面的代码拷贝进去,不要急,代码我会挑出关键部分单讲,并且我尽可能写了每行代码的注释。

    //由于我们建立的是CPP文件,所以引入头文件和入口函数需要extern "C"
    extern "C" {
    #include <wdm.h>
    }
    
    #define DEVICE_NAME L"\\Device\\MyWdmDevice" //定义设备名称
    #define LINK_NAME L"\\??\\MyWdmLink" //定义符号链接
    NTSTATUS DriverAddDevice(PDRIVER_OBJECT pDriverObj, PDEVICE_OBJECT pPhysicalDeviceObject);
    NTSTATUS DispatchRoutine(IN PDEVICE_OBJECT pDeviceObj, IN PIRP pIrp);
    NTSTATUS WDMPNP(IN PDEVICE_OBJECT pDeviceObj, IN PIRP pIrp);
    void DriverUnload(PDRIVER_OBJECT pDriverObj);
    
    extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
    {
    
    	UNREFERENCED_PARAMETER(pRegistryString); //不用将编译警告等级设为3,不使用 就Unreferenced即可
    	DbgPrint("驱动被加载\n");
    
    	//这里和nt驱动的区别是,我们不要去直接给MajorFunction 派遣 IRP_MJ_CREATE之类的
    	//这里我们需要用到扩展
    	//在WDM驱动程序中DriverEntry不再负责创建设备,而是交由AddDevice例程去创建设备。
    	pDriverObj->DriverExtension->AddDevice = DriverAddDevice;
    	pDriverObj->DriverUnload = DriverUnload; //这里不是真实的卸载
    	//IRP全部派遣到DisPatchRoutine
    	for (int i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
    	{
    		pDriverObj->MajorFunction[i] = DispatchRoutine;
    	}
    	//重写PNP派遣
    	pDriverObj->MajorFunction[IRP_MJ_PNP] = WDMPNP; //即插即用服务
    	return STATUS_SUCCESS;
    }
    
    typedef struct _DEVICE_EXTENSION
    {
    	PDEVICE_OBJECT PDeviceObject; ///< 设备对象
    	PDEVICE_OBJECT PNextStackDevice; ///< 下层设备对象指针
    	UNICODE_STRING DeviceName; ///< 设备名称
    	UNICODE_STRING SymLinkName; ///< 符号链接名
    
    }DEVICE_EXTENSION, * PDEVICE_EXTENSION;
    
    NTSTATUS DriverAddDevice(PDRIVER_OBJECT pDriverObj, PDEVICE_OBJECT pPhysicalDeviceObject)
    {
    	DbgPrint("AddDevice\n");
    
    	NTSTATUS status = STATUS_SUCCESS;
    
    	UNICODE_STRING deviceName;
    	UNICODE_STRING linkName;
    	PDEVICE_OBJECT pDeviceObj = NULL; //创建设备对象
    	PDEVICE_EXTENSION pDeviceExt = NULL; //设备扩展对象
    	RtlInitUnicodeString(&deviceName, DEVICE_NAME); //初始化Unicode字符串 设备名称
    	RtlInitUnicodeString(&linkName, LINK_NAME);//初始化Unicode字符串 符号链接名称
    
    	//创建设备
    	status = IoCreateDevice(pDriverObj, sizeof(PDEVICE_EXTENSION), &deviceName, FILE_DEVICE_UNKNOWN, 0, FALSE, &pDeviceObj); 
    	if (!NT_SUCCESS(status))
    	{
    		return status;
    	}
    	//让扩展对象指向刚刚创建的设备的扩展
    	pDeviceExt = (PDEVICE_EXTENSION)(pDeviceObj->DeviceExtension);
    	pDeviceExt->PDeviceObject = pDeviceObj;
    	pDeviceExt->DeviceName = deviceName;
    	pDeviceExt->SymLinkName = linkName;
    
    	// 将设备对象挂接在设备堆栈上
    	pDeviceExt->PNextStackDevice = IoAttachDeviceToDeviceStack(pDeviceObj, pPhysicalDeviceObject);
    
    	//创建符号链接
    	status = IoCreateSymbolicLink(&linkName, &deviceName);
    	if (!NT_SUCCESS(status))
    	{
    		IoDeleteSymbolicLink(&pDeviceExt->SymLinkName);
    		status = IoCreateSymbolicLink(&linkName, &deviceName);
    		if (!NT_SUCCESS(status))
    		{
    			return status;
    		}
    	}
    
    	pDeviceObj->Flags |= DO_BUFFERED_IO | DO_POWER_PAGABLE;
    	pDeviceObj->Flags &= ~DO_DEVICE_INITIALIZING;
    
    	DbgPrint("Leave AddDevice\n");
    
    	return status;
    }
    
    /// @brief 对默认IPR进行处理
    NTSTATUS DispatchRoutine(IN PDEVICE_OBJECT pDeviceObject, IN PIRP pIrp)
    {
    	UNREFERENCED_PARAMETER(pDeviceObject);
    
    	DbgPrint("Enter WDMDispatchRoutine\n");
    	NTSTATUS status = STATUS_SUCCESS;
    
    	pIrp->IoStatus.Status = status;
    	pIrp->IoStatus.Information = 0;
    
    	IoCompleteRequest(pIrp, IO_NO_INCREMENT);
    
    	DbgPrint("Leave WDMDriverDispatchRoutine\n");
    	return status;
    }
    
    /// @brief PNP移除设备处理函数
    /// @param[in] pDeviceExt 设备扩展对象
    /// @param[in] pIrp 请求包
    /// @return 状态
    NTSTATUS PnpRemoveDevice(PDEVICE_EXTENSION pDeviceExt, PIRP pIrp)
    {
    	KdPrint(("Enter HandleRemoveDevice\n"));
    
    	pIrp->IoStatus.Status = STATUS_SUCCESS;
    	// 略过当前堆栈
    	IoSkipCurrentIrpStackLocation(pIrp);
    
    	// 用下层堆栈的驱动设备处理此IRP
    	NTSTATUS status = IoCallDriver(pDeviceExt->PNextStackDevice, pIrp);
    
    	// 删除符号链接
    	IoDeleteSymbolicLink(&pDeviceExt->SymLinkName);
    
    	//调用IoDetachDevice()把设备对象从设备栈中脱开:  
    	if (pDeviceExt->PNextStackDevice != NULL)
    		IoDetachDevice(pDeviceExt->PNextStackDevice);
    
    	//删除设备对象:  
    	IoDeleteDevice(pDeviceExt->PDeviceObject);
    
    	DbgPrint("Leave HandleRemoveDevice\n");
    
    	return status;
    }
    
    NTSTATUS WDMPNP(IN PDEVICE_OBJECT pDeviceObj, IN PIRP pIrp)
    {
    	PDEVICE_EXTENSION pDeviceExt = (PDEVICE_EXTENSION)pDeviceObj->DeviceExtension;
    	PIO_STACK_LOCATION pStackLoc = IoGetCurrentIrpStackLocation(pIrp);
    	unsigned long func = pStackLoc->MinorFunction;
    
    	DbgPrint("PNP Request (%u)\n", func);
    
    	NTSTATUS status = STATUS_SUCCESS;
    	switch (func)
    	{
    	case IRP_MN_REMOVE_DEVICE:
    		status = PnpRemoveDevice(pDeviceExt, pIrp);
    		break;
    	default:
    		// 略过当前堆栈
    		IoSkipCurrentIrpStackLocation(pIrp);
    
    		// 用下层堆栈的驱动设备处理此IRP
    		status = IoCallDriver(pDeviceExt->PNextStackDevice, pIrp);
    		break;
    	}
    
    	DbgPrint("Leave HelloWDMPnp\n");
    
    	return status;
    }
    
    
    
    
    /// @brief 驱动程序卸载操作
    void DriverUnload(PDRIVER_OBJECT pDriverObj)
    {
    	UNREFERENCED_PARAMETER(pDriverObj);
    
    	DbgPrint("Enter WDMUnload\n");
    	DbgPrint("Leave WDMUnload\n");
    }
    

    理论知识

    驱动入口

    在之前写程序时,程序入口函数为main,参数有argc和argv代表着命令行的参数个数及对应的字符串指针,驱动也有入口函数为DriverEntry,其返回类型为NTSTATUS

    函数的第一个参数pDriverObj是刚被初始化的驱动对象指针
    函数的第二个参数pRegistryString是驱动在注册表中的键值。

    DriverUnload是驱动卸载的回调,如果我们不设置DriverUnload,那么此时我们将无法正常的卸载驱动,系统这么做的原因是为了保证系统的稳定性
    比如我们在DriverEntry中添加了某些系统回调,此时我们没有DriverUnload,因此系统不知道什么时候该移除这些回调,如果暴力移除驱动,此时系统回调会出问题,系统回调表中存在了一个被移除掉的驱动的回调,当调用时系统蓝屏

    派遣函数 MajorFunction

    我们在驱动入口函数中看到了pDriverObj->MajorFunction数组,其作用是针对每一个的事件都有与之对应回调函数

    因为WDM驱动不在DriverEntry入口中去创建设备和对应的符号链接,而是移到了DriverAddDevice函数中,所以pDriverObj->MajorFunction中我们并没有单独指定pDriverObj->MajorFunction[IRP_MJ_CREATE]pDriverObj->MajorFunction[IRP_MJ_CLOSE],而是将所有的派遣函数指向一个通用的回调函数DispatchRoutine

    Device和SymbolicLink

    其中设备名称在代码中被我们宏定义L"\\Device\\MyWdmDevice"符号链接被我们定义为L"\\??\\MyWdmLink"

    Device是用来和应用层通信的,应用层程序可以通过SymbolicLink找到对应的设备。

    IoCreateDevice就是创建设备的函数

    • 第一个参数为驱动对象指针
    • 第二个参数为设备扩展结构(DeviceExtension)大小
    • 第三个参数为设备名称,具体可以查看微软文档。

    IoCreateSymbolicLink就是创建符号链接的函数

    • 第一个参数为符号链接名称
    • 第二个参数为设备名称

    DeviceExtension

    设备扩展结构,你可以将某些信息保存在扩展结构中,这样可以避免使用全局变量,应用层通信时,可以读取或写入的信息的结构,之后NT式驱动的例子中会用到。

    IRP

    在通用的派遣函数DispatchRoutine中,我们看到了一个参数pIrpIRP的含义是 I/O Request Packet缩写,是在驱动中IO请求的结构体,其具体作用,我决定放在NT式驱动中细说。

    展开全文
  • Linux驱动开发入门与实战 高清PDF版 因为高清版的文件太大,所以分成两个包上传,请下载Linux驱动开发入门与实战.part1.rar 和 Linux驱动开发入门与实战.part2.rar 后再解压即可
  • 组态王驱动开发包,支持6.51及以上版本,组态软件必备工具!
  • MCGS_脚本驱动开发工具

    热门讨论 2012-10-29 22:36:05
    MCGS 脚本驱动 开发工具 简单易用 自动生成脚本工具
  • 测试驱动开发

    万次阅读 2018-11-24 14:14:00
    测试驱动开发 概述 极限编程是一个轻量级的、灵巧的软件开发方法,同时它也是一个非常严 谨和周密的方法,它从 4 个基本方面对软件项目进行改善:交流、简易、反馈 和勇气。测试驱动开发则是极限编程的最佳...
  • 大家注意了,这个压缩包的名字叫“【Linux典藏大系】Linux驱动开发入门与实战 郑强.z01”,还要下载一个“【Linux典藏大系】Linux驱动开发入门与实战 郑强.zip”压缩文件,我是用“好压”这个软件进行压缩分卷的,我...
  • 为什么要学习 Linux 环境下的编程 Linux 是一个开放、灵活、跨平台的操作系统,上至庞大的...可以说,上世纪70年代学习的 Unix 知识和技巧,在今天仍然大有用武之地,这与 Windows 平台的开发形成了鲜明的对比。程序
  • 关于嵌入式驱动开发,这篇文章让你了解透彻!

    千次阅读 多人点赞 2020-09-27 16:48:38
    嵌入式驱动开发到底学什么 嵌入式大体分为以下四个方向: 一、嵌入式硬件开发:熟悉电路等知识,非常熟悉各种常用元器件,掌握模拟电路和数字电路设计的开发能力。熟练掌握嵌入式硬件知识,熟悉硬件开发模式和设计...
  • 基于树莓派驱动开发详解

    千次阅读 2020-08-09 20:15:49
    一、驱动开发认知 1、驱动开发思想 要想进行驱动开发首先我们应该知道,上层到底层是如何进行的,上层调用c库的open函数,首先会发生一次软中断,从用户空间进入内核空间,触发系统调用接口函数sys_call,然后通过...
  • 嵌入式到底应该选择驱动开发,还是应用开发?
  • 竹林蹊径:深入浅出Windows驱动开发(高清完整版).pdf

    千次下载 热门讨论 2012-02-07 13:22:21
    竹林蹊径:深入浅出Windows驱动开发(高清完整版).pdf
  • 第一个:鸿蒙系统驱动开发的过程中,首先要清楚驱动框架是如何布局的,鸿蒙系统內部为开发者提供了驱动框架能力,包括驱动加载、驱动服务管理和驱动消息机制。这样做也是为了,构建一个驱动架构平台,为驱动开发者...
  • 但是windows操作系统不像Linux操作系统,它的代码不开源,导致这方面的资料很少,因此花费了较长时间来寻找相关实现框架,最终找到了两款开源项目的虚拟接口驱动: Wireguard项目的Wintun接口 OpenVPN的Tap接口 这...
  • 嵌入式驱动开发学习路线

    万次阅读 多人点赞 2018-04-19 15:40:35
    ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标: (1)掌握主流嵌入式微处理器的结构与原理(初步定为arm9) (2)必须掌握一个嵌入式操作系统 (初步定为uclinux或linux,版本待定) (3)必须...
  • 周立功出的 PDIUSBD12+USB固件编程与驱动开发, 包含书本的绝大部分内容.对初学USB的非常有用.内容朴实明了,讲了USB协议通信过程,D12开发代码,以及详细的在Windows下的USB驱动程序开发.
  • 7.2.2 字符设备驱动开发 第8章 网络设备驱动程序开发 8.1 网络设备驱动程序简介 8.1.1 device数据结构 8.1.2 sk_buff数据结构 8.1.3 内核的驱动程序接口 8.2 以太网控制器CS8900A 8.2.1 特性 8.2.2 工作原理...
  • 浅谈驱动开发

    千次阅读 2019-06-24 07:43:24
    驱动开发在很多人眼中都是一项极具挑战性的任务,可当你真正去开发一个驱动时,你也许会发现它并没有看上去那样困难,可对大多数人而言驱动开发是八竿子打不着的话题,故而更增强了驱动开发在许多人心中的神秘感。...
  • Android Camera驱动开发入门必备知识

    千次阅读 2020-10-31 22:05:48
    camera驱动开发所需要具备基础知识,如果你还没有了解过camera模块,那么这些基础必备的知识,将会对你比较有用,俗话说“磨刀不误砍柴工”,基本功配置好了,相信你在做camera驱动开发过程中肯定得心应手。...
  • Windows驱动开发技术详解(珍藏版).pdf

    热门讨论 2011-02-26 20:58:01
    Windows驱动开发技术详解(珍藏版).pdf Windows驱动开发技术详解(珍藏版).pdf Windows驱动开发技术详解(珍藏版).pdf Windows驱动开发技术详解(珍藏版).pdf
  • 使用IDE(vs code)进行嵌入式linux驱动开发

    千次阅读 多人点赞 2020-08-13 19:13:03
    早期的ubuntu版本上没有好的可用的IDE,那个时候嵌入式linux驱动开发人员多使用vim进行编码;对于没有图像界面的linux服务器,开发人员更是只能选择vim这一编辑工具。但是,接触过IDE的人会意识到vim的不方便:需要...
  • windows 驱动开发使用的一些工具

    千次阅读 2021-08-26 17:06:29
    刚开始学驱动开发,有一些工具在网上搜索的太慢了,找来找去还好多收费的,绝大部分工具可以从微软官网下,就是速度比较慢,不过其体积也小, 官方下载地址:...
  • 嵌入式Linux驱动开发

    千人学习 2019-05-11 21:05:29
    说到Linux驱动,尤其是嵌入式Linux驱动,大家可能会望而却步,因为入门太难!很多书上或课程基本是这样的:一上来给我们...从最简单的入手,一步一步,手把手的编写代码,一步步引领你进入嵌入式Linux驱动开发的大门。
  • 驱动及驱动开发的简单理解

    千次阅读 2019-11-03 17:28:24
    因此,今天用了一些时间,去简单的了解了一下驱动及驱动开发。如果有错误的理解,请予以指正,不胜感激! 什么是驱动 在计算中,设备驱动程序是一种计算机程序,用于操作或控制连接到计算机的特定类型的设备。驱动...
  • Linux驱动开发|块设备驱动

    千次阅读 2022-01-14 17:26:41
    块设备驱动

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 934,995
精华内容 373,998
关键字:

驱动开发

友情链接: demarshal.rar