Windows内核学习笔记(一)--浅谈驱动对象、设备对象与请求

Windows内核理论基础学习 近俩天的学习-Windows内核基础的学习笔记。算是一个概述,毕竟每一个小点单拉出来都可以讲好久。学了这俩天,对内核的理解算是清晰了那么一点点了,持续学习ing…欢迎师傅一起交流讨论私信andwx都欢迎。参考文献:《加密与解密》Windows内核基础《Windows内核原理与实现》系统总述《深入理解Windows操作系统》Chat Gpt…MSDN文档。一些零零散散的大佬的blog。 阅读详情

      最近在学习Windows内核编程,同时也接触到了一些驱动的概念,其中有一些概念让人比较容易混淆,所以就写了这篇文章发表一下自己的看法:

      首先,谈谈驱动对象(DRIVER_OBJECT),可以说驱动对象代表的是一个驱动程序(或者叫内核模块)。在写内核程序时,必须要填写这样一种结构,来告诉Windows程序提供的功能。内核程序并不生成进程,它们有系统的System进程加载,可以存在于任何的进程。

      设备对象(DEVICE_OBJECT)可以是一个具体的物理设备,如:键盘、硬盘等;也可以是一个虚拟的“设备”,如:用于进程间通信的管道。设备对象由驱动对象创建,一个驱动对象可以创建很多个设备对象。这些设备对象储存在一个设备栈中,这些设备对象是用链表连接在一起的,当新的设备对象产生时应该是用的尾插入(和人理解)。

      对于请求,我们可以理解为Windows SDK程序设计里的消息。一般都是以IRP方式传递的。而设备对象是唯一可以接受请求的实体。然而一个驱动对象中可能会有很多个设备对象,那么是由哪一个设备对象来处理呢?

我的理解是:就像MFC中的消息传递机制一样,会有一个消息的接收顺序;IRP请求也是这样,它先发送到设备栈中最上面的一个设备(最新加入),没有被处理就继续向下发送,如果到最后都还是没有被处理,我认为会有一个默认的处理。

      这就是我对这几个概念的理解,如有不正确的地方,欢迎大家批评指正!

 

Windows内核驱动Hook入门 开启 Event Tracing 后,当用户层程序进行系统调用时,首先会调用PerfInfoLogSysCallEntry函数来对此次系统调用进行记录。然后才调用系统调用函数。PerfInfoLogSysCallEntry内部又会调用驱动注册的WMI_LOGGER_CONTEXT结构中的GetCpuClock指向的函数。这样就可以通过修改GetCpuClock指针为自己的代理函数,而且此时系统调用函数被放置在栈上,因此在该函数中能从栈中获取系统调用函数的值并进行修改为自己的hook函数。 阅读详情

相关推荐

内核与驱动_08_键盘驱动原理及代码

文章目录技术原理Windows中从击键到内核流程键盘硬件原理键盘过滤的框架搭建应用设备扩展键盘过滤模块的动态卸载键盘过滤的请求处理通常的处理PNP的处理读的处理读完成的处理从请求中打印出按键信息从缓冲区中获得KEYBOARD_INPUT_DATA从KEYBOARD_INPUT_DATA中得到键从MakeCode得到实际字符完整代码 技术原理 Windows中从击键到内核 打开任务管理器,可以看到...

hskull的博客 2841

Windows内核原理与实现之驱动对象和设备对象

当 I/O 管理器加载一个设备驱动程序时,它会创建一个驱动程序对象,该对象在对象管理器目录中的路径为:\Driver\<DriverName>或\FileSystem\<DriverName>。如果是文件系统类型的驱动程序,则该对象被放置在 "\FileSystem"目录下,否则放在"\Driver"目录下。因此,驱动程序可粗略地分为文件系统驱动程序和非文件系统驱动程序。 ...

首席技术总监的专栏 1126

Windows驱动开发WDM (11)- 多个设备对象(同一个驱动)

通常在WDM驱动的AddDevice里面只会调用一次IoCreateDevice创建一个设备对象。其实我们也可以调用多次IoCreateDevice来创建多个设备对象。当驱动调用IoCreateDevice成功后,驱动对象DriverObject的DeviceObject指针会指向新创建的设备对象,这个设备对象的NextDevice=NULL。如果再调用一次IoCreateDevice,那么Dri

zj510的专栏 8139

驱动杂记1:对驱动对象,设备对象,设备栈的理解

Windows内核采用的是面向对象的编程方式,但使用的确是C语言。Windows内核认为许多东西都是“对象”, 比如一个驱动一个文件一个设备,“对象”相当于一个基类。    一个驱动对象代表了一个驱动程序,或者说一个内核模块。驱动对象结构如下: typedef struct _DRIVER_OBJECT{ //结构的类型和大小 CSHORT Type; CSHORT Size; ..

zacklin的专栏 1698

内核与驱动_00_内核编程基础知识

内核编程环境 概述 在Windows下,32为系统中每个进程都有其自身享有的4GB内存空间,每个进程的内存空间都是相互隔离的。其中低2GB是用户空间,高2GB是内核空间。原则上,每个进程的高2GB内核空间内的数据是共享的,即绝大部分都是一样的。 而内核空间是受到硬件保护的,比如在x86架构下R0层(Ring0)的代码才可以访问内核空间,普通的应用程序编译出来后都运行在R3层,R3层程序要调用R0...

hskull的博客 1375

WDM驱动多个设备对象

WDM驱动,AddDevice里面多次调用IoCreateDevice创建多个设备对象。遍历整个设备链。

驱动对象和设备对象

驱动对象 驱动对象,本质就是内核中一块描述驱动信息的内存 kd> dt _DRIVER_OBJECT 8988fe20 +0x000 Type : 4 //NT式驱动的类型为4 +0x002 Size : 168 //该结构体的大小 +0x004 DeviceObject : (null) //自己创建的设备对象 该驱动中所有的设备对象会组成一个链表。 +0x008 Flags : 0x12 +0x00c Dr

qq_41490873的博客 604

驱动对象与设备对象的区别

驱动程序对象有一个DeviceObject域指向一个设备对象链表,每个设备对象代表一个设备。

Windows驱动中的设备对象

设备对象,顾名思义,就是把一个设备抽象成一个对象来管理。它代表一个被驱动管理的设备,但这个设备,不一定是实际存在的。在WDM驱动中,一般我们在AddDevice函数中来创建它。指向AddDevice的函数指针是驱动对象的一个域。下面我们给出它书本中的数据结构说明。                                当然,我们也可以使用windbg的dt命令查看设备对象的数据结构。

Z18_28_19的专栏 1787

GD32测量pwm波频率以及占空比

1、需求 最近做的一个项目,其中有一个传感器输出是pwm波形,频率代表速度,频率越高速度越快。不同的占空比代表不同的故障类型。占空比10%~90%,频率范围20hz ~1khz。 基于以上的需求,单片机要实现两个功能: 1、测量频率 2、测量占空比 这怎么玩呢?从没搞过啊。 2、需求分析 经过查找资料以及参考正点原子的教程,发现单片机的定时器的输入捕获功能能够实现该功能。 2.1分析 如上图所示,测量占空比和测量频率实际上就是测量波形的长度。 对于占空比,就是测量T2与T1时刻的差值 对于频率,就是测量T

Jack Yi的博客 9063

【随机过程】第二章——随机过程概论

随机过程概论,说明《随机过程》课程的教学大纲,对随机过程概念、研究对象和研究方法做了简要介绍。

weixin_45225032的博客 1362

Windows内核原理与实现之Windows设备驱动程序

文章摘录自《Windows内核原理与实现》一书。 设备驱动程序是操纵设备的内核模块,I/O 管理器、即插即用管理器和电源管理器都需要与设备的驱动程序打交道。 在Windows I/O 系统中,设备驱动程序不仅为操作系统提供了支持各种 I/O 设备的能力, 也是 Windows 内核本身扩展的基础。Windows 可以动态地加载或卸载设备驱动程序,通过这些驱动程序来调整或扩展内核的功能。 Win...

首席技术总监的专栏 4067

MCGSPro动画部件实战:用文本分段实现智能报警提示(附工程文件)

本文详细介绍了在MCGSPro组态软件中,如何利用动画部件的文本分段功能,高效实现触摸屏上的智能报警提示。通过绑定整数变量作为索引,一个部件即可动态切换多种状态信息,解决了传统方法画面臃肿、维护繁琐的痛点。文章提供了从变量定义、部件配置到逻辑联动的完整实战教程,并分享了工程文件复用与性能优化技巧。

weixin_28347369的博客 165

驱动开发(四)设备对象与符号链接

本文介绍了Windows内核驱动开发中的关键概念:设备对象(DeviceObject)是内核表示物理或逻辑设备的数据结构,通过IoCreateDevice创建;符号链接(SymbolicLink)为用户层提供访问设备的别名,使用IoCreateSymbolicLink创建。详细说明了设备扩展(DeviceExtension)作为设备私有数据存储区的作用,以及IRP(I/O请求包)的处理机制。文章还探讨了用C++类封装驱动的方法,强调需注意内核开发限制,并提供了设备控制(IOCTL)的实现示例。

onlymscn的博客 1504

Streamlit(九) widgets-input

st.text_input / st.number_input / st.date_input / st.time_input 源码路径:${python}\Lib\site-packages\streamlit\elements\text_widgets.py(number_input.py, time_widgets.py) st.text_input st.text_input(label, value="", max_chars=None, key=None,\

heianduck的博客 3354

光学设计仿真软件:Code V_(8).场曲和色差校正

通过以上步骤和代码示例,用户可以更好地理解如何在Code V中进行场曲和色差的校正。这些技术不仅有助于提高光学系统的成像质量,还可以为后续的光学设计提供重要的参考。在实际应用中,用户可以根据具体需求选择合适的校正方法和优化策略,以达到最佳设计效果。

kkchenjj的博客 1783

Windows驱动—Windows应用程序和Windows驱动通信编程

文章目录介绍知识前奏内核方面编程设备对象和符号链接分发函数应用方面编程打开设备设备控制请求代码应用层代码内核层代码完整工程代码测试效果 介绍 Windows应用程序(Ring3层)和内核驱动(Ring0层)是运行在Windows权限的不同级别,简单来说各有优势。内核层权限较大 能做很多 应用程序办不到的事情 不直接面向程序使用的用户,Windows应用程序在Ring3层 直接面向用户,界面友好。当应用层办不到的时候就需要借助内核层了,所以 win32应用程序和Windows内核驱动通信是有必要的。Windo

重庆李四 2608

强化学习:从经典强化学习理解强化学习

1. 背景介绍 强化学习(Reinforcement Learning,RL)作为机器学习领域的重要分支,近年来取得了长足的进步。其核心思想是让智能体通过与环境的交互学习最优策略,从而最大化累积奖励。不同于监督学习和非监督学习,强化学习无需预先标注数据,而是通过试错的方式逐步学习,具有更强的适应性和泛化能力。

AI架构师小马 1798

HidHide内核驱动原理:深入理解Windows设备过滤技术

HidHide是一款专为Windows系统设计的游戏输入设备防火墙,通过内核驱动技术实现对HID(人机接口设备)的精细化管理。本文将深入解析其内核驱动原理,带您了解Windows设备过滤技术的核心机制与实现方式。 ## 一、Windows内核驱动基础架构 Windows内核驱动采用WDF(Windows Driver Foundation)框架开发,HidHide驱动也遵循这一标准架构。驱动入

gitblog_00793的博客 936

Far planner 代码系列(35)动态障碍物预处理_激光雷达部分

主要讲解动态障碍物在激光雷达部分的剔除机制

博客 1055

YOLOv8 智能交通违章检测 - 机动车道占用(违停/非机动车占道)详解

本文提出基于YOLOv8的智能交通违章检测方案,主要针对机动车道占用问题。系统整合目标检测、目标跟踪和ROI区域判定,实现两种典型场景检测:违章停车(静止超时)和非机动车/行人占道。详细介绍了系统架构、配置文件设计、核心逻辑实现及可视化模块,包括ROI区域管理、状态跟踪和违章判定算法。针对实际应用中的堵车误判、非机动车误报等问题,提出了密度检测、轨迹分析和自适应阈值等优化策略。该方案计算量适中,适合边缘设备部署,并建议配套开发ROI标定工具和证据链保存功能。

u010117029的博客 234

浅谈驱动对象、设备对象与请求

  最近在学习Windows内核编程,同时也接触到了一些驱动的概念,其中有一些概念让人比较容易混淆,所以就写了这篇文章发表一下自己的看法:      首先,谈谈驱动对象(DRIVER_OBJECT),可以说驱动对象代表的是一个驱动程序(或者叫内核模块)。在写内核程序时,必须要填写这样一种结构,来告诉Windows程序提供的功能。内核程序并不生成进程,它们有系统的System进程加载,可以存在于

Tech is Online(物联网技术传播) 1183

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

windows驱动编程-应用与内核通信

windows驱动编程-应用与内核通信: 在编写windows驱动的时候,用户层和内核层的通信必不可少(胡扯-…-)。本文实现,用户层发送数据给内核驱动->内核驱动保存数据->用户层再原样从内核驱动中将数据读取出来。

大草的博客 1590

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

驱动对象、设备对象、请求对象数据结构

我们在内核程序中生成一个DO,而一个内核程序是用一个驱动对象表示的,因此,一个设备对象总是属于一个驱动对象。但一个驱动对象可以有多个设备对象,每个设备对象都会有一个指针指向下一个设备对象,因此就形成一个设备链。驱动程序需要在DriverEntry中初始化。每个驱动程序都会有唯一的驱动对象与之对应,并且这个驱动对象是在驱动加载时被内核中的对象管理程序所创建的。驱动对象用DRIVER_OBJECT数据结构表示,它作为驱动的一个实例被内核中的I/O管理器负责加载,并且内核对一个驱动只加载一个实例。

yyyooa的博客 759

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

04内核-驱动对象

驱动对象驱动程序:就是一个.sys模块, 驱动对象:则是.sys被加载到内核中的实例化出来的对象, 用于表示这个驱动模块.Windows内核使用DRIVER_OBJECT结构体来描述一个驱动对象.虽然Windows内核源码使用C语言编写, 但也使用了面向对象的思想. 在面向对象思想中, 有父类, 抽象类,纯虚函数的概念, 纯虚函数就是一个类中无须定义的虚函数. 拥有这个函数的类被称为抽象...

weixin_30954607的博客 318
上一篇: [转载]城里城外看SSDT
下一篇: Windows内核学习笔记(二)-- IoCallDriver函数与PoCallDriver函数
lambert_s
博客等级 码龄17年 31粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值