Windows内核--子系统(3.5)

2023-11-17

到底什么是子系统?

        子系统是用户层概念。在Windows内核之上,如果想要执行类UNIX应用程序,就是POSIX子系统,如果要类似OS/2环境,就是OS/2子系统。

        如何能模拟出不同子系统呢? 一般需要子系统用户态应用程序和相关DLL支援。

        对于Windows子系统,作为亲儿子,其他子系统是依赖它才能活。

        Windows子系统既有内核模式,又有用户模式。

        内核模式包括图形和窗口管理部分,以win32k.sys存在,主要负责收集和分发消息,控制窗口显示和屏幕输出,同时处理不同形状绘制和文本输出。

        用户模式包括子系统进程(csrss.exe)和系统DLL(kernel32.dll, user32.dll, gdi32.dll...).

        刚刚提到子系统是用户层概念,为什么Windows子系统又有内核模式? Windows为了提高图形处理效率,把本应该放在用户模式的图形部分移到内核模式,才有了这个结果。

Windows NT三大子系统

        OS/2、POSIX和Windows子系统

        OS/2子系统

                核心文件: os2.exe/os2srv.exe/os2ss.exe.

                OS/2是IBM可与DOS/Windows早期版本竞争的操作系统,因为商业模式、技术和市场有错失,最终败在Windows脚下。

        POSIX子系统

                核心文件: psxss.exe/psxdll.dll.

                在Windows 7不是默认开启,作为系统功能可开关。

                从Windows 8.1开始, POSIX子系统被移除。

Windows 10 WSL

        Windows Subsystem For Linux, 准确的说不算是上面提到的NT子系统。但因为名称上带有subsystem, 很容易与之混淆。

可执行程序和子系统对应关系

        PE文件头部有个subsystem, 它表明应用程序在哪个子系统运行。

        MS VC链接器提供选项/SUBSYSTEM指定最终可执行文件的subsystem数值。

        dumpbin工具可以看到subsystem.

子系统进程csrss.exe

        csrss全称: Client/Server Runtime Server Subsystem. 主要负责控制台窗口功能,以及创建、删除进程和线程等。每个进程在csrss进程中都有一个CSR_PROCESS结构, csrss可以由此控制Windows各个进程。

子系统内核部分win32k.sys

        任何线程,只要调用win32k.sys的任何一个系统服务,就会变成GUI线程,最终会被纳入Windows子系统管理范畴。win32k负责用户层图形操作的内部处理, 比如Eng接口。

        文本输出 win32k API: EngTextOut

ntdll.dll属于子系统DLL吗?

        不属于。它是各子系统DLL共用的基础DLL.

ntdll.dll

        它是连接用户模式和内核服务的桥梁。ntdll基本与系统服务对应,保留系统服务stub.

        比如NtCreateProcess, NtCreateFile等。

ntdll!NtCreateFile和nt!NtCreateFile

        二者分别属于用户模式和内核模式API, 前面最终会调用到后面, 后面是实作。

ntdll!NtCreateFile和ntdll!ZwCreateFile

        二者是等同的。如下,ZwCreateFile其实就是NtCreateFile.

1: kd> u ntdll!ZwCreateFile
ntdll!NtCreateFile:
00007ff9`0776d7b0 4c8bd1          mov     r10,rcx
00007ff9`0776d7b3 b855000000      mov     eax,55h
00007ff9`0776d7b8 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ff9`0776d7c0 7503            jne     ntdll!NtCreateFile+0x15 (00007ff9`0776d7c5)
00007ff9`0776d7c2 0f05            syscall
00007ff9`0776d7c4 c3              ret
00007ff9`0776d7c5 cd2e            int     2Eh
00007ff9`0776d7c7 c3              ret
1: kd> u ntdll!NtCreateFile
ntdll!NtCreateFile:
00007ff9`0776d7b0 4c8bd1          mov     r10,rcx
00007ff9`0776d7b3 b855000000      mov     eax,55h
00007ff9`0776d7b8 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1
00007ff9`0776d7c0 7503            jne     ntdll!NtCreateFile+0x15 (00007ff9`0776d7c5)
00007ff9`0776d7c2 0f05            syscall
00007ff9`0776d7c4 c3              ret
00007ff9`0776d7c5 cd2e            int     2Eh
00007ff9`0776d7c7 c3              ret

        IDA看到二者是不同导出Index, 同一个API.

        

ntdll大部分存根API实现都类似

        用户模式下,Nt*和Zw*代表同一个程式,不过在内核中它们有差异。Windows的设计,是Nt*主要为了用户模式调用, 内核Nt*实作用户模式Nt*, 而Zw*在内核模式主要为了内核本身或驱动程序使用,不希望从用户模式调进来。

        

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

Windows内核--子系统(3.5) 的相关文章

  • 加载配置文件时发生错误:访问路径 c:\Program Files (x86)\... 被拒绝

    我有一个在 Windows 7 上使用 Visual Studio 2010 中的安装程序部署的应用程序 该程序在 Windows 7 和 XP 上部署并运行良好 但当我在 Windows 8 系统上部署它时 出现有关访问配置文件的错误 该
  • UnicodeDecodeError:“charmap”编解码器|安装 pip python-stdnum==1.8 时出错

    我对编程还很陌生 所以请耐心等待 当我为正在使用的模块安装一些必需的软件包时 我无法安装python stdnum 1 8 我收到以下错误消息 File C Users 59996 AppData Local Programs Python
  • 使用 Windows 锁定屏幕后删除 Kerberos 缓存票证

    无论如何 有没有办法阻止 Kerberos 缓存的票证在 Windows 进入锁定屏幕后被删除 首次登录 Windows 时 klist exe 显示 2 个缓存票证 但是 发生 Windows 锁屏事件后 klist exe 显示 0 个
  • 如何从图像生成 tiff/box 文件以在 Windows 中训练 Tesseract

    我正在尝试在 Windows 中训练 Tesseract 为此我需要一对 tiff box 文件 并且我正在尝试使用 jTessBoxEditor 创建它 但它不接受图像作为输入 我也尝试过 boxFactory 但它无法正常运行 有谁知道
  • Nodejs 在 Windows 上找不到已安装的模块

    我现在正在Windows上学习nodejs 使用npm cmd全局安装了几个模块 nodejs找不到已安装的模块 以玉石为例 npm install jade g Jade安装在目录中 C Program Files x86 nodejs
  • 如何运行 Windows 批处理文件但隐藏命令窗口?

    如何运行 Windows 批处理文件但隐藏命令窗口 我不希望 cmd exe 在执行文件时在屏幕上可见 这可能吗 如果你写一个非托管程序并使用创建进程 https learn microsoft com en us windows win3
  • 最低 DirectX 9.0c 版本以及如何检查它

    我们基于 Windows C Ogre 的游戏即将完成 在我们公开发布之前 我们必须解决这个问题 如果未更新到最新的 Dx9 0c 版本 Ogre 在许多测试计算机上都会崩溃 所有这些计算机都已经安装了 9 0c 但这一定是旧操作系统预安装
  • Visual C++ free 和 malloc 的线程安全性?

    有谁知道 free 和 malloc 在 Visual C 2010 上是否是线程安全的 我遇到了奇怪的问题 内存被损坏 我几乎认为这是唯一的可能性 有谁知道安全装置是否可以打开和关闭以及如何打开和关闭 前提是您链接的是线程安全库 http
  • 无法在 Windows 7 上安装 Android USB 驱动程序

    所以我想使用我的新 Nexus 5 来调试我的应用程序 我尝试通过以下方式安装 Android USB 驱动程序装置经理 http developer android com tools extras oem usb html Win7但我
  • Ruby On Rails 与 Windows Vista - 最佳设置? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 您认为 Win Vista 环境中 RoR 的最佳设置是什么 我尝试过 radrails eclipse 插件 它对我来说似乎太庞大了 我也开始
  • 如何在 RTMP 流中嵌入 pic_timing SEI 挂钟时间码?

    我需要将我的桌面流式传输到 AWS MediaLive 服务 并且根据要求 我必须在流中包含挂钟时间码 AWS 支持人员善意地通知我 对于 h 264 编码流 我需要提供时间码作为 pic timing SEI 消息 我在 Windows
  • 无法启动 Windows 快捷方式

    我正在尝试使用 python 启动 Windows 我已经尝试了 os system subprocess call os startfile 等多种方法 但总是收到错误消息 指出路径不存在 我知道路径是正确的 因为我尝试在 CMD EXE
  • 在Python中设置Windows命令行终端标题

    我在 Windows 计算机上运行某个 Python 脚本的多个实例 每个实例都来自不同的目录并使用单独的 shell 窗口 不幸的是 Windows 为每个 shell 窗口提供了相同的名称
  • 多个原始输入窗口接收器

    我有一个仅消息窗口 ATL CWindowImpl 它使用 RIDEV INPUTSINK 标志将自身注册为原始输入 这意味着无论该窗口是否是前台窗口 它都会获取所有输入 当该窗口只有一个实例时 这非常有效 但是 当我创建超过 1 个窗口实
  • 无法在 Powershell 中运行 R.exe

    我经常发现在命令行 Windows 上运行 R 更有用 然而 当我在 Powershell 中尝试时 我往往会遇到问题 但这可以通过第一次运行轻松克服cmd然后就可以了 这是我执行此操作时遇到的错误R CMD BATCH Invoke Hi
  • 使用 strace 修复挂起内存问题

    我有一个在 RHEL6 x 64 位 上运行的多线程进程 我发现当我尝试启动该进程时 该进程挂起并且大多数线程 同一进程的 崩溃 有些线程等待线程之间的共享内存被创建 我可以看到所有的共享内存都没有被创建 但是当我使用 strace 时 进
  • 将 SWI Prolog 代码编译为 Windows 可执行文件 - 解析器 Grails3 项目

    我正在尝试构建解析器 Grails3 项目https github com RichardMoot Grail https github com RichardMoot Grail谁的教程是http www labri fr perso m
  • 如何以编程方式清除 Kerberos 票证缓存

    有谁知道如何使用托管 非托管代码清除本地计算机上的 Kerberos 票证缓存 提前致谢 我相信你需要打电话给LsaCa llAuthentication包 http msdn microsoft com en us library aa3
  • 如何通过批处理文件打开Windows防火墙上的端口

    有没有办法在批处理文件中通过批处理文件打开 Windows 上的特定端口 如果让安装程序为我们的服务器应用程序执行此操作 而不是让用户手动执行此操作 那就太好了 Use 执行程序 http technet microsoft com en
  • 验证域用户凭据

    我需要一种方法来验证 Windows 上本机 C 的用户 密码对 输入的是用户名和密码 用户可以是 DOMAIN user 格式 基本上我需要编写一个函数 如果用户 密码是有效的本地帐户 则返回 true 第1部分 如果用户 密码在给定的域

随机推荐

  • GDB调试的基本使用、GDB调试多进程

    1 编译时加选项 g 生成具有调试信息的程序 gcc g test c o test 2 启动GDB 1 启动GDB gdb test 2 设置运行时参数 主函数中可接收运行时参数 set args 设置运行时参数 如set args 10
  • i.mx287学习笔记9-编译mplayer源码

    上面是我的微信和QQ群 欢迎新朋友的加入 1 下载资源 mplayer http www mplayerhq hu MPlayer releases 这个我编译没用到 但是我看很多帖子都要这个东西 不管他 也找个资源过来 编码库 http
  • C/C++打开目录、读取目录、获取目录下文件状态

    1 程序示例 lstat 或者 stat 需要包含的头文件 include
  • Composite:组合模式

    将对象组合成树形结构以表示 部分 整体 的层次结构 组合模式使得用户对单个对象和组合对象的使用具有一致性 处理树中的每个节点时 其实不用考虑他是叶子节点还是根节点 即模糊了简单元素和复杂元素的概念 客户端可以像处理简单元素一样来处理复杂元素
  • BP神经网络识别手写数字项目解析及代码

    这两天在学习人工神经网络 用传统神经网络结构做了一个识别手写数字的小项目作为练手 点滴收获与思考 想跟大家分享一下 欢迎指教 共同进步 平常说的BP神经网络指传统的人工神经网络 相比于卷积神经网络 CNN 来说要简单些 人工神经网络具有复杂
  • 结构体中的函数指针

    C语言中的类 大家知道C 是面向对象的语言 有很多优良特性 而在C语言中 我们也可以用结构体类似的实现面向对象 成员函数 既然说了用结构体类似的实现某种类 结构体中的变量就可以看做类的变量 实现类的成员函数就要用到函数指针了 一般的函数指针
  • Siebel EAI- Web Service 常见错误汇总

    由于项目原因部分代码被模糊处理 有些问题待补充 欢迎指出错误 很多试探着理解的 研究的不够深入 问题1 Error invoking service XXX Service method XXXXX at step Invoke WebSe
  • C# 文件与Base64的相互转换

    一 转换工具 1 在线图片转Base64编码 2 BeJson在线JSON校验格式化工具 3 Base64在线加密 解密 二 Base64转文件代码 这个案例是 将已经获取到的Base64字符串 转换成文件 保存到服务器的某个文件路径下面
  • linux下rdkafka编译,Linux下librdkafka编译安装使用学习

    Kafka分为服务端和客户端 服务端集群一般称为brokers 客户端分为生产者 producer 和消费者 consumer 开发者通常用客户端从kafka生产消息或消费消息 不同的语言使用不同的客户端 具体信息参见这个页面 https
  • nginx配置非80端口

    user nobody worker processes 2 events worker connections 1024 http include mime types default type application octet str
  • leetcode刷题python之有效的括号

    class Solution def isValid self s str gt bool dict stack for i in s if i in dict top stack pop if stack else if dict i t
  • 微信小程序:消息提示框(wx.showToast)和 交互提示框(wx.showModal)

    摘要 有时需要提示框来提醒我们相应信息 以及交互提示框来让我们是否继续进行操作 一 消息提示框 1 参数介绍 消息提示框只有提示作用 不能交互 函数是wx showToast 下面列出几个主要且常用参数 2 代码 wx showToast
  • 如何把IE浏览器快速变成灰色来哀悼在汶川地震中遇难的同胞们!

    如何把IE浏览器快速变成灰色来哀悼在汶川地震中遇难的同胞们 把IE浏览器快速变成灰色只要作以下二点即可 第一点 在html页面中 在body中加入下面语句 第二点 在css控制表中 加入下面语句 html filter progid DXI
  • c++11中四种类型转换

    1 static cast 功能 完成编译器认可的隐式类型转换 格式type1 a type2 b staic cast
  • HiveQL中如何排查数据倾斜问题

    如果某个key下记录数远超其他key 在join或group的时候可能会导致某个reduce任务特别慢 本文分析下join的场景 本例子SQL如下 查询每个appid打开的次数 需要排除掉作弊的imei 说明 表cheat imei 750
  • Basic Level 1016 部分A+B (15分)

    题目 正整数 A A A的 D A D A DA 为1位整数 部分 定义为由 A
  • Unity进阶--声音管理器学习笔记

    文章目录 声音管理器 using System Collections using System Collections Generic using UnityEngine public class AudioManager MyrSing
  • 自定义注解及应用场景

    自定义注解及应用场景 深圳蜗牛学苑 课程目标 理解自定义注解概念 掌握自定义注解语法 自定义注解场景中的使用 熟练掌握自定义注解 AOP的使用方式 一 自定义注解 我们回顾一下方法的重写 会发现有 Override 我们把它称为重写的注解
  • 【2】样本不均衡问题及其解决办法

    5 损失函数 在机器学习中 可以通过修改模型中的 class weight 参数 从而调节不均衡样本的惩罚权重 5 1 LogisticRegression 逻辑回归模型 代码 lr l2 LogisticRegression penalt
  • Windows内核--子系统(3.5)

    到底什么是子系统 子系统是用户层概念 在Windows内核之上 如果想要执行类UNIX应用程序 就是POSIX子系统 如果要类似OS 2环境 就是OS 2子系统 如何能模拟出不同子系统呢 一般需要子系统用户态应用程序和相关DLL支援 对于W