深入理解和使用Windows NT驱动程序的执行上下文(一)

Android用Vectras VM安装Windows NT 4.0和Win Me教程 虚拟机技术通过软件模拟完整硬件环境,让旧版操作系统在无原生支持下运行。QEMU作为开源模拟器,可在不依赖硬件虚拟化时翻译指令并模拟CPU、外设,是跨平台运行老系统的关键技术。其价值在于兼容性测试、历史软件备份与学习研究,尤其适合在移动设备上探索已停止维护的Windows版本。在Android上借助Vectras VM这一图形化QEMU前端,可免去复杂命令行,直观完成虚拟机创建、ISO镜像挂载与系统安装。本文围绕Windows NT 4.0与Windows Me的部署实践,涵盖磁盘分区、驱动适配、性能调优等核 阅读详情

深入理解和使用Windows NT驱动程序的执行上下文

原作:Open System Resources,Inc.
编译:codewarrior@fudan cse

 

要理解Windows NT驱动程序,最重要的概念之一就是驱动程序执行时的所处的“执行上下文”(Execution Context)。深入理解这个概念,并小心地应用你所掌握的关于它的知识,可以帮助你编写更快速高效的驱动程序。
本节包括下列主题:
l          什么是上下文
l          几种不同的上下文
l          上下文带来的影响
l          最大限度地利用上下文
l          总结
对于NT标准内核态驱动程序而言,一个重要的细节就是驱动程序的某个特定的函数执行时所处的上下文(Context),传统上说来文件系统开发人员大多对此比较关心,但若能牢固理解“执行上下文”,对NT所有类型的内核态驱动程序的编写人员而言,都会从中受益。深入理解执行上下文并小心地使用之,可以确保设计出具有更高性能和更低运行代价的驱动程序。
在本文中,我们将对执行上下文的概念作一个探究。在本文结尾处,会举出一个允许用户程序到内核态执行并获得系统全部特权的驱动程序,以此作为应用我们所介绍的内容的一个实例。
什么是执行上下文
当我们提到一个例程的“上下文”的时候,我们指的是它的线程和进程的执行环境。在NT中,这个环境是通过当前的线程环境块TEB和进程环境块PEB构成的。因此所谓的上下文也就包括虚拟内存设置(告诉我们哪个物理内存块对应哪些虚拟内存地址)、句柄的转换(因为句柄是和进程相关联的)、调度器信息、栈,和通用寄存器以及浮点寄存器的集合。当我们问“一个特定的内核例程在哪个上下文中执行”时,我们实际上是在问,“NT内核的调度器当前指定哪个线程在运行?”因为每个线程都只属于一个进程,故而当前的线程也就暗示了一个明确的当前进程。总之,“当前线程”和“当前进程”隐喻了所有这些区别于其他线程和进程的东西(句柄,虚拟内存,调度器状态,寄存器)。
对于内核态驱动程序编写人员而言,虚拟内存上下文也许是“上下文”这一术语所包含的众多方面中最有用的一个。回忆一下,NT把用户进程映射到虚拟地址空间中低端的2GB,而把操作系统本身的代码映射到虚拟地址空间中高端的2GB。当一个用户进程中的一个线程在执行时,它的虚拟地址的范围是从0到2GB,所有高于2GB的地址都被设为拒绝访问,以防用户直接访问操作系统的代码和数据结构。当操作系统的代码在执行时,它的虚拟地址的范围是从0-4GB,当前用户进程(如果有这么一个的话)被映射到0-2GB的地址范围内。在NT V3.51和V4.0中,映射到高端的2GB的代码是固定不变的。但是映射到低段2GB的地址空间的代码是在变化的,这取决于当前哪个进程在执行。
让我们比上面所介绍的再更深入一步,在NT这样的内存布局中,给定进程P中一个有效的用户虚拟地址X(X应当小于等于2GB),那么它同内核虚拟地址X都对应着相同的物理内存位置,当然,仅当P是当前进程(也正因为如此)且进程P的物理页映射到操作系统低端的2GB虚拟地址空间中去时,这个结论才是正确的。上面的最后一句话换种说法来表述就是:“仅当P是当前进程上下文时上述结论正确”。因此,用户虚拟地址和内核虚拟地址的高端的2GB实际是对应着相同的物理位置,如果进程上下文相同的话。(译注:这里所指的用户虚拟地址空间和内核虚拟地址空间,是两个不同的概念,内核虚拟地址空间和用户虚拟地址空间并不是整个4GB空间中高低2GB的简单划分。实际上,内核虚拟地址空间指从内核的角度所看到的0-4GB的虚拟地址范围;而用户地址空间指的是从用户态的进程角度看到的0-4GB的虚拟地址范围——尽管对于用户态的进程而言,它看到的4GB虚拟地址空间中高2GB是拒绝访问的。稍候作者会用一张图来解释之。对内核而言,它所看到的内核虚拟地址空间的低2GB是不断变化的,这是因为进程调度的缘故,只有在当前调度进程P执行时,虚拟地址X才对应着物理内存中同一个位置)。
对于内核态驱动程序编写人员而言,另一个他们感兴趣的关于上下文的细节是线程调度上下文(Thread scheduling context)。当一个线程等待时(譬如使用Win32函数WaitForSingleObject(…)等待一个未激发的对象),所等待的目标的相关信息是存储在该线程的调度上下文中的。如果等待不能得到满足,则线程会被移出就绪队列,当等待条件得到满足之后再重新回到就绪队列。
上下文同样会对句柄的使用产生影响。因为句柄是和某个具体的进程相关联的,因此在一个进程的上下文中创建的句柄,不能在另一个进程上下文中使用。
几种不同的上下文
内核态的例程在下列三种上下文中的一种中执行:
l          系统进程上下文
l          某个具体的用户线程(和进程)上下文
l          任意用户线程(和进程)上下文
在执行过程中,所有内核态驱动程序的各部分都有可能在上述三种上下文中的任一种下执行。譬如,驱动程序的DriverEntry(…)函数总是运行在系统进程上下文中。系统进程上下文没有与之相关联的用户线程上下文(也就没有TEB),并且也就没有任何用户态进程被映射到内核的虚拟地址空间中低端的2GB(译注:回忆一下,内核的虚拟地址空间也是从0-4GB的)。另一方面来说,DPC(比如用于ISR或计时器定时函数的驱动程序的DPC)运行在无关用户线程上下文。这意味着在DPC的执行过程中,任何用户线程都有可能是“当前”线程(译注:正在执行的意思),也就是说任何用户进程都有可能被映射到内核虚拟地址空间中低端的2GB。
驱动程序分发例程执行时所处的上下文可能尤其令人着迷。在许多情况下,内核态驱动程序的分发例程执行在产生调用的用户线程的上下文中。图1解释了为什么会这样。当一个用户线程发出一个针对设备的I/O函数调用时——例如调用了Win32函数ReadFile(…)——会导致一个系统服务请求。在Intel体系结构处理器上,这样的请求是通过软件中断来实现的。软件中断穿过中断门,中断门切换处理器的当前特权
图1
级CPL到内核模式,这会引发一个切换到内核栈的动作,然后调用系统服务派发器(System service dispatcher)。接着,系统服务派发器调用操作系统提供的用于处理所请求的系统服务的函数。以ReadFile(…)为例,这个函数(译注:指用于处理所请求的系统服务的函数)是I/O子系统的NtReadFile(…),NtReadFile(…)函数创建一个IRP,检查ReadFile(…)请求中传入的文件句柄所引用的文件对象在内核中和哪个驱动程序相关联,接着调用该驱动程序处理“读”的分发例程。所有这些都发生在PASSIVE_LEVEL中断请求级。
在上面介绍的整个处理过程中,并没有发生对用户请求进行调度或者排队的动作。因此,用户线程和进程的上下文不会发生任何改变。在本例中,驱动程序的分发例程执行在发出ReadFile(…)调用的用户线程的上下文中。这表示当驱动程序的“读”分发函数执行的时候,是用户线程在执行内核态驱动的代码。
那么,是不是驱动程序的分发例程总是执行在发出请求的用户线程的上下文中呢?未必。4.0版的《内核模式驱动程序开发指南》的第16.4.1.1节告诉我们,“只有位于最高层的NT驱动程序,如文件系统驱动程序,才可以肯定它们的分发例程是在这样的用户模式线程的上下文中被调用的。”但是严格说来这并不完全对(从我们的例子中可以看出这一点),所能肯定正确的一点是:FSD是在发出请求的用户线程的上下文中被调用的。事实是,当用户发出一个I/O请求后,若一个驱动程序立即被调用且它不把请求传递给其他驱动程序,那么可以担保该驱动程序是在发出请求的用户线程的上下文中被调用的,这包括FSD。但是这个事实的另一层意思是,大部分由用户编写的标准内核态驱动程序会直接向用户应用程序提供一些功能,比如处理控制设备,这些驱动程序的分发函数会在发出请求的用户线程的上下文中被调用。
事实上,只有一种情况下驱动程序的分发例程不在产生调用的用户线程上下文中被调用,那就是用户的请求首先是被传到较高层的驱动程序,如文件系统驱动程序。如果较高层的驱动程序把请求发送到系统工作者线程(System worker thread),上下文会因此而改变。当IRP最终向下传递到较低层的驱动程序手中时,就无法保证较高层驱动程序在执行转发IRP的动作时所在的上下文是发出请求的用户线程的上下文。较低层的驱动程序也因此将执行在任意线程上下文。
较为通用的规则是,如果一个设备直接被用户访问,中途不经过其他驱动程序的干预,则该设备的驱动程序的分发例程通常是运行在发出请求的用户线程的上下文中。当这一切发生时,会产生一些相当有趣的结果,这允许我们作一些同样有趣的事情。

 

Windows NT/2000原生API参考手册 在现代计算机系统中,操作系统扮演着至关重要的角色,提供了硬件资源抽象、进程管理、内存管理、文件系统操作、安全性和访问控制等功能。而Windows NT/2000 Native API是操作系统暴露给开发者的一组底层服务接口,允许开发者绕过用户模式的限制,直接与操作系统的内核组件进行交互。安全性是操作系统中不可或缺的一部分,而访问控制则是确保系统安全的关键机制之一。安全标识符(SID)和访问令牌是Windows系统中用于识别用户、组和计算机的唯一标识符,是访问控制的基础。 阅读详情

相关推荐

解决Windows NT平台64位SIGAR库的Java动态链接问题

SIGAR(System Information Gatherer And Reporter)是一个开源的Java类库,旨在跨平台下收集系统资源信息。其设计目的是一致性地获取不同操作系统中的系统状态,比如CPU使用率、内存使用、磁盘空间和网络接口统计。由于其灵活且稳定的跨平台特性,使得SIGAR在系统监控和性能分析领域大放异彩。当使用标准方法无法解决问题时,借助第三方工具能够深入诊断和分析库加载失败的原因。这些工具不仅可以展示详细的错误信息,还能提供更为专业的解决方案。

weixin_42596214的博客 942

多余度飞控中监督机制与表决机制的差异及适航审查要点

在安全关键系统设计中,信号可信度评估与冗余管理是保障系统可靠性的基础技术。其原理在于通过多维度的信号有效性检查与交叉比较,识别异常数据,再基于多数表决或中值算法从可信信号中选取最优值。这种分层机制的技术价值在于实现故障隔离与系统降级,避免单点失效导致灾难性后果。在航空、航天、自动驾驶等领域,监督与表决机制广泛应用于飞控计算机、传感器融合等场景。具体到多余度飞控系统,监督机制负责信号准入判断,表决机制负责最终值选择,两者在输入输出、时间尺度及适航符合性验证上存在显著差异,需独立设计与审查。

weixin_33853827的博客 496

nt6 hdd installer v3.1.4:Windows 8硬盘安装工具

在当今的信息技术时代,操作系统安装已经实现了高度的自动化。然而,对于想要更深入理解Windows安装过程的IT专业人士来说,掌握硬盘安装的原理与步骤仍然是一个基础且必要的技能。自动安装技术是IT管理中的一项重要技术,它能够在没有任何人工干预的情况下完成计算机软件的安装和配置。这种技术可以极大地提高工作效率,尤其是在需要大量部署相同操作系统和软件的环境中。自动安装技术的核心是应答文件,这是一种文本文件,包含了安装程序在安装过程中需要的所有设置信息。当安装程序运行时,它会读取这些信息来自动化整个安装过程。

weixin_34064233的博客 1435

理解和使用NT驱动程序的执行上下文

refer:http://blog.youkuaiyun.com/ttlyfast/archive/2007/08/17/1748578.aspx不知道原出处到底在哪了。理解Windows NT驱动程序最重要的概念之一就是驱动程序运行时所处的“执行上下文”。理解并小心地应用这个概念可以帮助你构建更快、更高效的驱动程序。 NT标准内核模式驱动程序编程中的一个重要观念是某个特定的驱动程序函数执行时所处的“

avder的专栏 1372

WIM-Context-Menu:在Windows中的目录上下文菜单中添加一个create wim。 这对于使用wim文件作为驱动程序包的用户可能有用

WIM上下文菜单 在Windows中的目录上下文菜单中添加一个create wim。 对于使用wim文件作为驱动程序包的用户来说,这可能很有用。

红外:非均匀性校正01_基本原理与基本方法

非均匀校正(nonuniformity correction,NUC) 基本原理 这里要表达的意思就是:图中每一条直线对应一个像素点的,亮度/辐照度的情况。由于硬件的关系,每一个像素点的线性响应很不一样,所以需要通过矩阵来校正。 校正原理: 一点校正 两点校正 其他原理介绍: 参考链接: 基于多项式拟合的红外焦平面非均匀校正 课件:光电成像——非均匀性校正 红外图像非均匀性校正相关汇总 红外非均匀性校正算法总结 红外图像非均匀矫正——一点矫正 ...

dlvector的博客 2万+

理解和使用NT驱动程序的执行上下文(一)

<!--google_ad_client = "pub-2947489232296736";/* 728x15, 创建于 08-4-23MSDN */google_ad_slot = "3624277373";google_ad_width = 728;google_ad_height = 15;//--><script type="text/javascript"

zgqtxwd的专栏 461

【渗透工具】内网多级代理工具Venom详细使用教程

Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。

TT小子的博客 3757

windows驱动文件流上下文区别和选用二

windows驱动文件流上下文区别和选用二概述验证思路源码分析获取或创建上下文接口在PostCreate中调用接口测试上下文修改销毁上下文函数的调用逻辑实验结果步骤一:使用记事本打开文件1212.txt步骤二:关闭文件再次使用记事本打开1212.txt步骤三:卸载驱动 概述   在第一篇文章(如何创建上下文一)中,以流上下文(FLT_STREAM_CONTEXT)这种类型举例说明了创建流上下文的步骤和需要使用的API函数,但是在windows上下文类型中,与流上下文相似的还有流句柄上下文(FLT_STREA

find_the_ferry的博客 5479

Flink CDC 实战:5分钟搞定PostgreSQL数据实时同步(附避坑指南)

本文详细介绍了如何使用Flink CDC实现PostgreSQL数据的实时同步,包括环境配置、逻辑复制槽创建、Flink环境搭建及实战验证。通过5分钟快速指南,帮助开发者高效搭建实时数据管道,并提供了常见问题排查和生产环境优化建议。

red88的博客 820

IC芯片验证 - 手把手教你搭建UVM验证环境

这是一个UVM的demo项目

howard789的博客 3万+

Neptune OS:基于seL4微内核的Windows NT兼容系统

Neptune OS:基于seL4微内核的Windows NT兼容系统 项目介绍 Neptune OS 是一个基于seL4微内核的Windows NT兼容系统。它实现了微软称之为“NT Executive”的Windows内核上层部分(NTOSKRNL.EXE),作为seL4微内核下的用户进程运行。NT Executive实现了Windows的NT Native API,这是Windows系统调用...

gitblog_00229的博客 1469

【传感器标定(三):激光雷达标定原理与实现详解】

本文系统介绍了激光雷达标定的基本原理与方法。主要内容包括:激光雷达标定的分类(内参标定和外参标定)、坐标系定义和刚体变换数学基础;详细阐述了测距误差和光束方向两种内参标定方法;重点分析了基于目标(平面标定板、三维标定物)和基于运动(手眼标定、点云配准)的外参标定方法;介绍了多传感器联合标定技术及非线性优化、鲁棒标定等实现方法;最后提出了定量和定性两种标定评估体系。为激光雷达在自动驾驶等领域的精确应用提供了系统的标定技术指导。

weixin_47429781的博客 3793

Windows NT File System Internals:深入理解Windows文件系统核心

Windows NT File System Internals:深入理解Windows文件系统核心 去发现同类优质开源项目:https://gitcode.com/ 在计算机科学领域,理解文件系统的内部机制是提升系统性能和可靠性的关键。今天,我们将为您介绍一款开源资源——Windows NT File System Internals,它为开发者和技术人员提供了深入学习Windows NT文件系...

gitblog_06770的博客 1159

淋巴结病理数字玻片读取与处理代码

Whole-slide images are generally stored in a multi-resolution pyramid structure. 首先安装openslide模块 pip install openslide-python import os.path as osp import openslide from pathlib import Path...

猫头军师兵书 1276

别再被 SerialPort 坑了!C# 串口通信的 3 大隐形陷阱与工业级解决方案

NET的SerialPort类更适合实验室调试,而非工业现场——它的设计目标是“能用”,而非“稳定”。工业级串口通信的核心,是在SerialPort基础上构建一层“防护壳”,用主动轮询对抗事件失效,用硬件级操作解决缓冲区谎言,用原子性流程避免关闭死锁。本文提供的类已在30+工业项目中验证(包括汽车生产线、智能仓储、环境监测),可直接替换原生SerialPort,解决90%以上的“玄学问题”。记住:工业场景的“稳定”,从来都不是靠运气,而是靠对每个细节的偏执把控。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 746

maciNTosh:运行Windows NT的Power Macintosh系统兼容层

maciNTosh项目是一个开源项目,旨在在Power Macintosh硬件上运行Windows NT操作系统。该项目包含ARC固件及其加载器,专门针对使用Gossamer和Mac99架构的PowerPC Macintosh系统。通过这个项目,用户可以在一系列的经典Mac硬件上体验Windows NT操作系统,包括Power Macintosh G3、G4系列,以及iBook和PowerBook

gitblog_00089的博客 951

MATLAB使用贝叶斯网络bnt工具箱:使用手册详解

MATLAB使用贝叶斯bnt网络工具箱:使用手册详解

WW、forever的博客 2676

WIndows内核模式驱动程序运行环境

程序运行时所处的环境 即所谓的执行上下文是程序设计中的重要概念。 对于用户线程而言运行环境也就是线程所属进程的环境, 但对于驱动程序这个问题变得非常复杂。通常这是文件系统开发人员所关心的问题,但所有的内核模式驱动程序开发人员都能得益于对运行环境的深入理解并能使驱动程序拥有更高的性能和更低的开销。         运行环境的概念程序例程的运行环境实际是指其线程和进程的执行环境,在NT系列操作系统中

crystal0011的专栏 1598

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

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

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

ReactOS代码模块对比Windows NT内核具体功能剖析

windows内核学习 ReactOS

zhangyihu321的专栏 1446

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Windows Research Kernel (WRK) 终极指南:深入探索Windows NT内核源代码

Windows Research Kernel (WRK) 是微软提供的Windows NT内核研究平台,包含完整的Windows Server 2003 SP1内核源代码。本指南将帮助开发者快速掌握WRK的核心价值、目录结构与使用方法,开启Windows内核研究之旅。 ## 📌 什么是WRK?为什么它如此重要? Windows Research Kernel是微软为学术研究和教学提供的内核

gitblog_00396的博客 780

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Windows Research Kernel (WRK) 调试技巧:如何使用WinDbg分析NT内核源代码的完整指南

Windows Research Kernel (WRK) 是微软官方发布的Windows NT内核源代码研究项目,为操作系统研究人员和内核开发者提供了深入了解Windows内核架构的绝佳机会。本文将为您详细介绍如何利用WinDbg调试工具来分析和调试WRK内核源代码,帮助您快速掌握Windows内核调试的核心技巧。💡 ## 为什么选择Windows Research Kernel进行内核研究

gitblog_00009的博客 551

windows驱动读取gdtr_[转载]Windows NT/2000/XP下不用驱动的Ring0代码实现-阿里云开发者社区...

WindowsNT/2000/XP下不用驱动的Ring0代码实现WebCrazy(http://webcrazy.yeah.net/)大家知道,WindowsNT/2000为实现其可靠性,严格将系统划分为内核模式与用户模式,在i386系统中分别对应CPU的Ring0与Ring3级别。Ring0下,可以执行特权级指令,对任何I/O设备都有访问权等等。要实现从用户态进入核心态,即从Ring3进入...

weixin_39655993的博客 187

PE文件格式详解:深入理解Windows可执行文件结构

PE文件格式详解

weixin_62391735的博客 1221

Windows系统核心技术解析:从NT内核到WSL的生态演进与开发实践

在技术领域,我们常常讨论各种操作系统、开发框架和工具链的优劣。对于全球数以亿计的开发者、IT从业者和普通用户而言,Windows 不仅仅是一个操作系统,更是一个承载了无数应用、服务和开发工作的基石平台。无论是企业级服务器部署、日常办公,还是软件开发、游戏娱乐,Windows 都扮演着不可或缺的角色。本文将从技术演进、生态构建、开发友好性及企业级支持等多个维度,深入剖析 Windows 系统为何能长期占据主导地位,并探讨其在现代技术栈中的核心价值。无论你是刚接触计算机的新手,还是需要在 Windows 上部署

chengyixian7877的博客 376
上一篇: HelloWorldBasic项目分析杂记
下一篇: 流微型驱动开发指南(六)
会思考的草
博客等级 码龄25年 208粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值