内核与系统中的 Windows 进程

2024-05-11

我有一些与内核和用户模式下的 Windows 进程相关的问题。

如果我有一个 hello world 应用程序和一个公开新系统调用 foo() 的 hello world 驱动程序,我很好奇一旦处于内核模式,我能做什么和不能做什么。

对于初学者来说,当我编写新的 hello world 应用程序时,我会得到一个新进程,这意味着我有自己的用户模式 ​​VM 空间(让我们保持简单,32 位窗口)。所以我有 2GB 的空间,我“拥有”,我可以戳看,直到我满意为止。然而,我受到我的流程的约束。我不能(暂时不要将共享内存带入其中)触及任何人的记忆。

如果我编写这个 hello world 驱动程序,并从我的用户应用程序调用它,我(驱动程序代码)现在处于内核模式。

首先澄清/问题: 我仍然处于与用户模式应用程序相同的过程中,对吗?仍然有相同的 PID 吗?

记忆问题: 内存以虚拟机的形式呈现给我的进程,也就是说,即使我有 1GB 的 RAM,我仍然可以访问 4GB 的内存(2GB 用户/2GB 内核 - 不介意服务器上开关的细节或细节,这里只是一个一般假设)。 作为用户进程,我无法查看任何内核模式内存地址,但我可以对用户空间做任何我想做的事,对吗?

如果我从驱动程序代码中调用我的 hello world 驱动程序,我是否仍然具有相同的用户模式内存视图?但现在我也可以在内核模式下访问任何内存?

这个内核模式内存是共享的(与用户模式不同,用户模式是我自己的进程副本)?也就是说,编写驱动程序更像是为操作系统(即操作系统)的单个进程编写线程应用程序(除了调度?)

下一个问题。作为一名司机,我可以改变我正在运行的进程吗?比如说,我知道另一个应用程序(例如,用户模式网络服务器),并为该进程加载虚拟机,更改其指令指针、堆栈,甚至将不同的代码加载到进程中,然后切换回我自己的应用程序? (我并不是想在这里做任何邪恶的事情,我只是好奇它是什么really意味着处于内核模式)?

另外,一旦进入内核模式,我可以防止操作系统抢占我吗?我认为(在 Windows 中)你可以设置 IRQL 级别来执行此操作,但即使在阅读了 Solomons 的书(Inside Windows...)之后,我也不完全理解这一点。我会问另一个与 IRQL/DPC 直接相关的问题,但是现在,我很想知道内核驱动程序是否有权将 IRQL 设置为高并接管系统。

更多内容即将推出,但这些问题的答案将会有所帮助。


每个进程都有一个“上下文”,其中包含特定于该进程的 VM 映射(在 32 位模式下通常小于 2 GB)。当在用户模式下执行的线程进入内核模式(例如,通过系统调用或 IO 请求)时,同一线程仍在进程中以相同的上下文执行。PsGetCurrentProcessId http://msdn.microsoft.com/en-us/library/ms802959.aspx此时将返回相同的内容获取当前进程ID http://msdn.microsoft.com/en-us/library/ms683180(VS.85).aspx之前在用户模式下会有(与线程 ID 相同)。

进入内核模式后,上下文附带的用户内存映射仍然存在:您可以直接从内核模式访问用户内存。为了安全起见,需要做一些特殊的事情:既不使用缓冲也不使用直接 I/O http://msdn.microsoft.com/en-us/library/cc264614.aspx。特别是,用户空间范围内的无效地址访问尝试将引发需要捕获的 SEH 异常,并且用户内存的内容可能会由于该进程中另一个线程的操作而随时更改。访问内核地址范围内的无效地址会导致错误检查。在用户模式下执行的线程无法访问任何内核内存。

内核地址空间不是进程上下文的一部分,因此它们之间的映射相同。然而,任意数量的线程可以在任何时候在内核模式下处于活动状态,因此它不像单线程应用程序。一般来说,线程在进入内核模式时为其自己的系统调用提供服务(而不是使用专用的内核工作线程来处理所有请求)。

保存线程和进程状态的底层结构在内核模式下都是可用的。映射另一个进程的 VM 最好提前从另一个进程创建 MDL,并将其映射到系统地址空间。如果您只想更改另一个线程的上下文,这可以完全从用户模式 http://msdn.microsoft.com/en-us/library/ms680632(VS.85).aspx。请注意,必须挂起线程才能更改其上下文,而不会出现竞争条件。从内核模式将模块加载到进程中是不明智的;所有加载器 API 均设计为仅在用户模式下使用。

每个CPU都有一个当前IRQL http://msdn.microsoft.com/en-us/library/ms795133.aspx它正在运行。它决定哪些事情可以中断 CPU 当前正在执行的操作。只有来自较高 IRQL 的事件才能抢占 CPU 的当前活动。

  • PASSIVE_LEVEL是所有用户代码和大多数内核代码执行的地方。许多内核 API 要求 IRQLPASSIVE_LEVEL
  • APC_LEVEL用于内核 APC
  • DISPATCH_LEVEL用于调度程序事件(在 NT 术语中称为调度程序)。在此级别运行将防止您被调度程序抢占。请注意,在此级别出现任何类型的页面错误都是不安全的;内存管理器尝试检索页面时可能会出现死锁。如果出现页面错误,内核将立即进行错误检查DISPATCH_LEVEL或更高。这意味着您无法安全地访问分页池、分页代码段或任何尚未锁定(即通过 MDL)的用户内存。
  • 在此之上是连接到硬件设备中断级别的级别,称为DIRQL.
  • 最高级别是HIGH_LEVEL。没有什么可以抢占这个级别。内核在错误检查期间使用它来停止系统。

我推荐阅读调度、线程上下文和 IRQL http://msdn.microsoft.com/en-us/library/ms810029.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

内核与系统中的 Windows 进程 的相关文章

  • 如何在 Windows 下向 .sh 脚本传递参数?

    我正在尝试在 Windows 下执行 sh 脚本 我安装了 Git 它允许我执行 sh 文件 但是 如果不使用 sh 作为执行前缀 我似乎无法传递任何参数 我的 sh 文件 echo Test 1 如果我用以下命令执行它 gt sh tes
  • 如何在Windows中的Python 3.9下pip安装pickle?

    我需要pickle https docs python org 3 9 library pickle html module pickle包安装在我的下面Python 3 9在 Windows 10 下 我尝试过的 当尝试与pip inst
  • 什么是 SO_SNDBUF 和 SO_RCVBUF

    你能解释一下到底是什么吗SO SNDBUF and SO RCVBUF选项 好的 出于某种原因 操作系统缓冲传出 传入数据 但我想澄清这个主题 他们的角色 通 常 是什么 它们是每个套接字的缓冲区吗 传输层的缓冲区 例如 TCP 缓冲区 和
  • 如何在拥有句柄时检查给定进程是否正在运行

    我在用ShellExecuteEx启动应用程序 成功开始阅读后TShellExecuteInfo hProcess获取已启动进程的句柄 我想定期检查我的应用程序启动的进程是否仍在运行 两个或多个同名进程可以同时运行 我想确保我的应用程序正在
  • 如何将 Hudson/Jenkins 参数传递给 Windows 批处理命令

    好吧 我需要在我的 Hudson 作业中执行一个批处理文件 我有一个参数 Jenkis 参数 我需要将这个值 如参数 传递给批处理文件 我尝试了以下操作 Deploy cmd configuration DEPLOYCONFIGURATIO
  • 如何为 Windows toast 注册协议?

    如何注册 Windows toast 协议 样本中来自https blogs msdn microsoft com tiles and toasts 2015 07 02 adaptive and interactive toast not
  • MSysGit 与 Windows 版 Git

    我无法确定MSysGit 和 Windows 版 Git 之间的区别 http msysgit github com 它们有何不同 为什么我会选择其中之一而不是另一个 它们不是同一个东西吗 On http msysgit github co
  • PHPStorm - 无效的后代文件名

    我正在尝试将 Windows 7 PC 上的本地 PHPStorm 项目与 Ubuntu 服务器同步 当我尝试任何类型的连接 例如 测试 SFTP 连接 时 它会失败并显示 Invalid descendent file name C np
  • MSI 安装程序,64 位操作系统,写入 \windows\system32\inetsrv 文件夹

    在 Windows Server 2008 64 位上 我需要一个 msi 安装程序文件来将一些文件写入 windows system32 inetsrv 文件夹 这些文件是一些 XML 架构验证文件 C XmlReaderSettings
  • 使用特定的 JRE 运行 JAR 文件

    在 Windows 上有没有办法使用位于特定文件夹中的 JRE 运行 JAR 文件 类似于 Eclipse 在您提供给它的某个路径中查找其 JRE 的方式 一些 Windows 可执行代码 C 或 C 或批处理文件都可以完成这项工作 谢谢
  • 开放简历fisherfaces

    我有这个问题 当我使用 vs2010 调试 opencv 2 4 0 facetec demo c 运行时 程序出现此错误 OpenCV错误 未知函数中图像步长错误 矩阵不连续 因此其行数无法更改 文件 src opencv modul e
  • 按名称显示进程的命令行

    我在cmd中使用以下命令来获取进程命令行 它提供了所有流程的详细信息 WMIC OUTPUT C ProcessList txt PROCESS get Caption Commandline Processid 我想在记事本中按名称获取特
  • x86 LargeAddressAware 兼容性的单元测试

    对于 win32 可执行文件 x86 我们可以设置 LargeAddressAware 标志 以便它在 x64 Windows 上运行时可以访问 4 GB 而不是仅 2 GB 的虚拟地址空间 这看起来很吸引人 然而 这也存在风险 例如参见
  • Windows:如何获取所有可见窗口的列表?

    无论如何都要使用相关技术重新标记 我不知道它们是什么 稍后我可能会提出更详细的问题 关于具体细节 但现在我正在尝试掌握 大局 我正在寻找一种方法来枚举 Windows 上的 真实可见窗口 我所说的 真正可见的窗口 就是指 用户所说的 窗口
  • 内核makefile中的$(call cmd,tags)这里的cmd指的是什么?

    在内核 Makefile 中我发现如下代码 ctags CTAGS CSCOPE HEADERS SOURCES ETAGS ETAGSFALGS HEADERS SOURCES call cmd ctags 另外 在哪里可以找到宏或函数
  • 适用于 Python 的 GitLab CI 共享 Windows 运行器

    我在 GitLab 中有一个 python 项目仓库 我看到 GitLab 共享了可用的测试版 Windows 运行程序 请参阅this https about gitlab com blog 2020 01 21 windows shar
  • 如何使用 MSYS2 获取旧版本的软件包?

    我决定尝试 CLion for Windows 它推荐使用 MinGW 或 Cygwin 进行编译 我安装了MSYS2 http sourceforge net p msys2 wiki MSYS2 20installation 包管理器进
  • Java - 使用 JNA 的 Windows 任务栏 - 如何将窗口图标 (HICON) 转换为 java 图像?

    我正在尝试将应用程序切换器添加到我正在处理的更大项目中 它需要在 Windows XP Vista 7 8 上运行 我正在使用 Java 1 7 下面是我创建的一个示例应用程序 用于演示我遇到的一些问题 我对 JNA 很陌生 非常感谢 充满
  • .NET 中安全身份的本地化

    我想在 NET 中实现一个用于服务 客户端通信的命名管道 并遇到了这段代码 http code msdn microsoft com windowsdesktop CSNamedPipeCommunication 33b2485c view
  • 为什么某些安装程序需要在运行程序之前重新启动计算机?

    我对部署桌面应用程序相当陌生 所以这是我第一次为我的软件构建安装程序 目前 我安装软件后第一次运行它时 它崩溃了 之后 它运行良好 我仍在调试此问题 但我注意到在安装后和运行软件之前立即重新启动似乎可以修复此崩溃 某些安装程序要求您在运行软

随机推荐

  • Azure 函数核心工具安装卡在 Visual Studio Code 中

    我创建了 Azure 函数应用程序来执行 powershell 脚本 想先在我的本地运行它来测试它 当我运行它时 无论有没有调试选项 都会出现一个弹出窗口 其中显示 您必须安装 Azure Functions 核心工具才能调试本地函数 当我
  • 在 WCF 上重用我的 PagedList 对象

    问题 我有一个自定义集合PagedList
  • 自调整大小的集合视图在 iOS 15 中进入递归循环

    我有一个自动调整大小的集合视图 当我调用 super layoutSubviews 时 我的应用程序崩溃 因为集合视图进入递归更新循环 这在 iOS 14 及更低版本中运行良好 但从 iOS 15 开始就观察到了这一点 class Dyna
  • Snakemake如何在上游规则失败时执行下游规则

    抱歉 标题不好 我不知道如何最好地用几句话解释我的问题 当其中一条规则失败时 我在处理 Snakemake 中的下游规则时遇到困难 在下面的示例中 黑桃规则在某些样本上失败 这是预料之中的 因为我的一些输入文件会有问题 黑桃将返回错误 并且
  • Quartz.Net 作业存储查询

    我正在当前项目中使用 Quartz NET 创建调度程序 就我而言 所有需要创建的作业都存储在一个表中 并且有一个单独的 UI 我可以在其中添加新作业或编辑现有作业 我的问题是如何将表中的所有作业提供给 Quartz 调度程序 我是否想要查
  • 有 Google Keep API 吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Google Keep 有 API 吗 我想为 Google Keep 制作一个 Windows 8 应
  • 自动检测log4j静态初始化错误的方法

    请注意 这更像是 Bash 问题 而不是 Java 问题 请参阅下面的注释 在每个类中配置log4j时 我们执行以下操作 public class Example private static final Logger log Logger
  • 将 Foq 与 F# 函数类型结合使用

    例如 我使用 F 类型定义来防止函数之间的硬依赖 type IType1 int gt int type IType2 int gt string let func1 i int int i i let func2 i int string
  • 无法使用 jQuery 添加两个小数

    我试图将两个小数值相加 但返回的总和是纯整数 怎么了 我找不到它 欢迎任何帮助 jQuery delivery method ship select change function var cost jQuery this val jQue
  • ObjC 中的 self 是什么?我应该什么时候使用它?

    什么是self在 Objective C 中是什么意思 我应该何时何地使用它 是否类似于this在Java中 self指的是您正在使用的当前类的实例 是的 它类似于this在爪哇 如果您想对该类的当前实例执行操作 则可以使用它 例如 如果您
  • 如何禁用向左滚动?

    I got a div 元素 parent 包含多个子元素 item 我想启用滚动父元素一个方向 left OR正确的 否则什么都不会发生 看我的代码 parent scroll function gt gt gt scroll event
  • 使用 iconv 将 UTF-16BE 转换为无 BOM 的 UTF-8

    我正在尝试使用 iconv 将 UTF 16BE 编码文件 字节顺序标记 0xFE 0xFF 转换为 UTF 8 如下所示 iconv f UTF 16BE t UTF 8 myfile txt 然而 生成的输出具有 UTF 8 字节顺序标
  • Git 子模块在 Windows 上更新缓慢

    Git 子模块在 Windows 上似乎非常慢 为了测试性能 我创建了 3 个裸存储库并向它们提交了 3 条独立消息 未存储文件 然后 我将每个裸存储库作为子模块添加到新的 git 存储库中 并执行子模块更新 花费了 5 秒多的时间 当使用
  • 如何在生产中安全地更改会话 cookie 域或名称?

    我们最近意识到我们的会话 cookie 正在被写入我们网站的完全限定域名 www myapp com 例如 MYAPPCOOKIE 79D5DB83 domain www myapp com 我们希望将其切换为可以跨子域共享的cookie
  • 从Oracle表中删除重复行

    我正在 Oracle 中测试某些内容并使用一些示例数据填充表 但在此过程中我不小心加载了重复记录 因此现在我无法使用某些列创建主键 如何删除所有重复行并只保留其中一行 Use the rowid伪列 DELETE FROM your tab
  • List、IList、IEnumerable、IQueryable、ICollection,哪个返回类型最灵活?

    我之前已经在这里看到过这个问题 但我不满意我理解的完整后果 问题是使用 linq to sql 返回的数据层应该使用什么返回类型以获得最大的灵活性和查询能力 这是我读过 发现的 IEnumerable 是有限的 只允许向前读操作 IEnum
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • 如何创建记录而不将其保存在数据库中

    我正在使用InventoryOdoo 12 的插件 但我的问题可能发生在任何模块上 在这个插件中 一个StockMove模型有一个move line ids field In the Detailed Operations对话框中 我们可以
  • Mojo 配置的自定义类型转换器?

    我需要使用自定义类型 例如LunarDate 在我的 Mojo 对象中 class MyMojo extends AbstractMojo parameter LunarDate lunarDate 我想配置参数
  • 内核与系统中的 Windows 进程

    我有一些与内核和用户模式下的 Windows 进程相关的问题 如果我有一个 hello world 应用程序和一个公开新系统调用 foo 的 hello world 驱动程序 我很好奇一旦处于内核模式 我能做什么和不能做什么 对于初学者来说