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

Python实现支付宝转账接口

由于工作需要使用python开发一个自动转账接口,记录一下开发过程。 首先需要在蚂蚁金服上申请开通开发者账户,有了开发者账户就可以使用沙箱进行开发了。 在开发之前我们需要在沙箱应用中填写密钥,密钥的获取可以使用阿里提供的工具包自动生成。 前期准备工作完成了,接下来是编写代码部分。主要用到了python-alipay-sdk库,使用pip安装即可,如果安装的过程中遇到问题推荐使用Anaconda...

FanMLei的博客 8516

深入解析Matlab phantom函数:从基础模体到自定义头部仿真

本文深入解析了Matlab中的phantom函数,它是医学图像处理算法测试的核心工具。文章详细介绍了如何使用内置的Shepp-Logan及其改良版头部仿真模体,并重点讲解了通过自定义参数矩阵来构建专属模体的方法。通过从生成模体到模拟投影(正弦图)再到图像重建的完整实战流程,展示了phantom函数在CT等算法开发与验证中的关键作用。

m3n5b7v8c9x的博客 948

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

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

首席技术总监的专栏 4067

从零开始开发AI Agent:基于大模型的智能体实战指南

### 摘要 本文介绍了AI Agent的开发全流程,从基础概念到实际部署,涵盖大模型集成、工具调用和记忆系统构建等核心技术。通过电商客服案例展示实战应用,并提供调试优化与部署方案,最后展望了AI Agent的未来发展方向,帮助开发者快速掌握智能体开发技能。

ghs_gss的博客 4860

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

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

onlymscn的博客 1504

手把手教你用CEFSharp打造防关联指纹浏览器(附完整代码)

本文详细介绍了如何基于CEFSharp框架,从零开始构建一个企业级的防关联指纹浏览器。通过剖析核心架构、多进程隔离实现、动态指纹混淆(如Canvas、WebGL)的实战代码,以及代理集成与性能优化,为跨境电商、广告投放等场景提供了一套可控、安全的开源解决方案。

fern8的博客 958

保姆级教程:在华为MateBook E Go上安装安卓子系统(含Hyper-V配置和地区切换避坑指南)

本文提供在华为MateBook E Go(ARM架构)上安装Windows 11安卓子系统(WSA)的详细指南。重点阐述了ARM平台无需指令转译的流畅原生体验优势,并逐步讲解启用Hyper-V虚拟化、切换系统区域以安装Amazon Appstore、配置开发人员模式及使用ADB安装第三方应用(如华为应用市场)的全过程,助您解锁高效的原生安卓应用生态。

kafka6courier的博客 525

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

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

重庆李四 2608

ollama使用CPU安装qwen-coder模型_并在eclipse中使用ai coder插件_配置本地qwen-coder模型_ollama常用操作记录---AI大模型应用探索0002

文章摘要:作者分享了在Windows 10上安装和使用Ollama模型的过程。尝试了不同规模的qwen-coder模型(7b、1.5b和0.5b),发现7b模型响应极慢(需35分钟),而1.5b模型表现较好(3秒响应)。最终选择1.5b版本用于代码开发辅助,支持多语言自动补全。同时提到在最新版Eclipse中的AIcoder配置问题。文章重点比较了不同模型规模在CPU环境下的实际使用体验和响应速度差异。

添柴程序猿的专栏 679

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

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

gitblog_00793的博客 936

【UML】-- 期末试题题库含答案(各章题目、选择题、填空题、简答题、画图题)

每章都有对应的题目和答案,选择题,填空简答,大题,答案已标红,方便大家观看

个人博客 1万+

【Android调试】高通adb识别不到设备的完整排查指南:从驱动到端口一步到位

本文系统梳理高通(Qualcomm)平台Android设备adb无法识别的完整排查流程。从最基础的USB连接检查开始,到Windows设备管理器中驱动状态的判断、高通USB驱动的正确安装与更新方法,再到adb端口被占用、USB调试未开启、驱动签名校验失败等高频场景的解决方案。每一步均配截图和操作命令,文末附常见报错速查表,适合做系统开发、刷机调试或者Android Framework bringup时遇到adb不通的工程师快速定位。

weixin_44081096的博客 279

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

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

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

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

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

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

大草的博客 1590

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

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

yyyooa的博客 759

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

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、付费专栏及课程。

余额充值