zoukankan      html  css  js  c++  java
  • WINDOWS session管理初识1

    PS:下面测试环境均为win 2003

    正常启动后,smss.exe这个session管理组件会创建2个进程,csrss.exe(子系统)和winlogon.exe,这2个进程属于session 0

    但smss.exe却不属于任何一个session,这是怎么回事呢?一般我们启动程序后,会看见子进程和父进程属于同一个session

    跟踪后,发现原来smss.exe在启动上述2个进程之前(这个过程是发生在smss!smpLoaddataFromRegistry()函数中),为了说明方便,下面用伪代码演示

    smss!smpLoaddataFromRegistry()

    {

    }

    loadsubsystem()

    {

    1.会调用NtSetSystemInformation创建session  ,sessionID=g_SessionID++;(其实不是简单的++,好像还是用一个位置来计算)

    2.此时smss.exe属于sessionID ,接启动csrss.exe和winlogon,这样这2个进程就属于sessionID了

    3.smss.exe调用NtSetSystemInformation的DetachSession功能号,脱离Session,所以我们一般看到smss.exe不属于任何session,

    windbg的显示就是根据Eprocess结构的Session字段是否有指向Session来判断进程是否属于哪个session的

    }

    上面的loadsubsystem()并不只是只会在smss.exe启动的时候才调用一次。在用户远程桌面登陆的时候也会再次调用,所以远程桌面的用户是属于另一个session

    PS:由于smss.exe不属于任何一个session,所以在它的进程上下文时有时候访问不了win32k.sys的数据,因为有可能被page out了,我猜正是而由于smss.exe不属于任意session的原因

    并且trap0e缺页中断里面会判断session。这个猜想后面有空再证实。

  • 相关阅读:
    POJ 3970(最小公倍数LCM)
    06005_Jedis入门
    雷林鹏分享:C# 字符串(String)
    雷林鹏分享:C# 类(Class)
    雷林鹏分享:C# 枚举(Enum)
    雷林鹏分享:C# 运算符重载
    雷林鹏分享:C# 多态性
    雷林鹏分享:C# 命名空间(Namespace)
    雷林鹏分享:C# 接口(Interface)
    雷林鹏分享:C# 正则表达式
  • 原文地址:https://www.cnblogs.com/kkindof/p/2571538.html
Copyright © 2011-2022 走看看