zoukankan      html  css  js  c++  java
  • Window学习——内核对象(一)

    使用计数

    Windows的内核对象所拥有者是操作系统,而非进程。进程被销毁的时候,内核对象不一定会销毁。所以内核对象的生命周期可能长于创建它的那个进程。

    操作系统内核知道当前有多少个进程正在使用一个特定的内核对象,因为每个对象都包含一个使用计数。使用计数是所有内核对象类型都有的一个数据成员。

    内核对象的安全性

    这个还挺重要的,看到后面很多函数都需要这个数据结构的接口。

    内核对象可以用一个安全喵师傅(SID)来保护。

    安全描述符描述了谁拥有对;哪些组合用户被允许访问或使用此对象;哪些组合用户被拒绝访问此对象。其通常在编写服务器应用程序的时候使用。

    创建内核对象的所有函数几乎都有执行一个SECURITY_ATTRIBUTES结构的指针作为参数,例如:

    //创建文件映射(其实从字面上的意思来说应该是在内存中创建一个文件对象)
    HANDLE CreateFileMapping( HANDLE hFile, PSECURITY_ATTRIBUTES psa, DWORD flProtect, DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow, PCTSTR pszName);

    大多数应用程序把这个SID的参数设为NULL,这样内核对象就是默认的安全性,具体包括哪些安全性,要取决于进程的安全令牌(讲进程的时候,这个把我讲得很蒙蔽,其实就是权限的限制)

    SID数据结构如下

    typedef struct _SECURITY_ATTRIBUTES {
        DWORD nLength;
        LPVOID lpSecurityDescriptor;
        BOOL bInheritHandle;//是否能继承
    }SECURITY_ATTRIBUTES;

    如果想访问一个现有的内核对象,就必须制定打算对此对象执行哪些操作,例如访问一个文件映射内核对象

    OpenfileMapping(
        DWORD dwFlag,//访问的权限
        bInheritHandle Long,//如这个函数返回的句柄能由当前进程启动的新进程继承,则这个参数为TRUE。
       lpName String//指定要打开的文件映射对象名称。

    该函数会返回一个有效句柄值,但如果被拒接访问就会返回NULL(可以通过GetLastError来获取错误原因)

    假如一个应用程序在启动时要从一个注册表子项中读取一些数据。正确做法是调用RegOpenKeyEx,向其传入KEY_QUERY_VALUE,从而制定查询子项数据的权限(尽量不要用KEY_ALL_ACCESS)

    那么我们如何判断一个对象是否为内核对象呢?

    可以通过查看创建该对象的函数,是否有限定安全的函数,毕竟是内核对象嘛

  • 相关阅读:
    webpack安装填坑('webpack' 不是内部或外部命令,也不是可运行的程序或批处理文件)
    JS中let和var的区别(附加const声明特点)
    浅谈 var bool= false 和 var bool= new Boolean(false)的区别
    "if (!(""a"" in window)) { var a = 1; } alert(a); 为什么结果是undefined"
    浅谈display: none、visibility: hidden、overflow: hidden、opacity: 0
    10Git服务器搭建
    09Git GitHub
    08Git标签
    07Git查看提交历史
    自举驱动电路原理
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/12891235.html
Copyright © 2011-2022 走看看