内核对象

  • 什么是内核对象?

    • 内核对象本质上是一个结构体,我们不能直接的操作一个内核对象,需要通过操作系统提供的一系列函数和我们使用的内核对象句柄对它进行一系列的修改。

  • 如何操作内核对象?

    • 创建一个内核对象:CreateXXX(对象)

    • 打开一个内核对象使用: OpenXXX(对象名)

      • 通常来讲,每一个内核对象都有自己的标识,可能是 id ,也可能名字,通过名称或者 id 就可以打开一个已经被创建的内核对象了。

    • 操作内核对象:使用的是与对象关联的一些函数

    • 关闭一个内核对象:大多数使用 CloseHandle()

  • 内核对象的几个特性

    • 全局性:内核对象是归操作系统所有,在不同应用程序中能够操作同一个内核对象。

    • 引用计数:每一个内核对象都有一个引用计数,当创建或者打开一个内核对象的时候,引用计数会+1,当关闭一个内核对象的时候,引用计数会 -1,当引用计数为 0 的时候,内核对象会被销毁。

      • 当一个应用程序退出的时候,该程序打开的所有内核对象都会被主动担当 CloseHandle

    • 安全描述符:大多数内核对象在创建的时候都需要提供一个安全描述符,通常使用 NULL

    • 句柄表:操作内核对象必须通过内核对象句柄,而内核对象句柄实际上是句柄表的索引,句柄表描述了当前内核对象所在内核中的位置和访问权限。句柄表是进程相关的,同一个内核对象在不同的进程中可能存在不同的值。

      应用程序一 行为  
      CreateFile() 创建一个文件 test1.txt 产生了对应的句柄 4 (test1)
      OpenFile() 打开一个文件 test2.txt 产生了对应的句柄 8 (test2)
      应用程序二 行为  
      CreateFile() 创建一个文件 test2.txt 产生了对应的句柄 4 (test2)
      OpenFile() 打开一个文件 test1.txt 产生了对应的句柄 8 (test1)
  • 内核对象的跨进程访问

    • 在父进程创建子进程的时候,可以选择子进程是否拥有父类的句柄

    • 大多数的内核对象都有一个名字或者id,通过id可以访问到其他进程创建的内核对象

    • 使用 DuplicateHandle 从一个进程中拷贝内核对象句柄到另一个进程

  • 在句柄表中添加内核对象的途径

    • 当创建一个内核对象的时候,会在句柄表中添加一项

    • 在父进程创建子进程的时候,可以选择子进程是否拥有父类的句柄

    • 大多数的内核对象都有一个名字或者id,通过id可以访问到其他进程创建的内核对象

    • 使用 DuplicateHandle 从一个进程中拷贝内核对象句柄到另一个进程

Windows提高_1.1内核对象的更多相关文章

  1. Windows提高_1.2遍历进程、遍历模块

    进程 什么是进程? 通俗的来讲,进程就是一个运行中的程序,最少包含一个虚拟空间,通常是 4 GB大小,一组提供数据和代码的模块,通产是 dll 和 exe 文件,一个进程内核对象和最少一个线程. 进程 ...

  2. Windows提高_1.4进程通信

    进程通信 使用 WM_COPYDATA 客户端(发送端) // 1. 找到窗口程序 HWND hWnd = FindWindow(NULL, L"Window1"); ​ // 2 ...

  3. Windows提高_1.3文件操作

    文件操作 不带句柄的文件操作 // 1. 拷贝文件,第三个参数为 FALSE 表示会覆盖 // CopyFile(L"D:\\1.txt", L"E:\\2.txt&qu ...

  4. Windows内核对象

    1. 内核对象 Windows中每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核进行访问,应用程序不能在内存中定位这些数据结构并直接更改其内容.这个内存块是一个数据结构,其成员 ...

  5. windows编程之内核对象

          学好windows编程,理解内核对象还是至关重要的(●'◡'●).闲话不多说,下面先来了解一下关于内核对象的知识:       内核对象(kernel object):内核对象是用于管理进 ...

  6. [4]Windows内核情景分析---内核对象

    写过Windows应用程序的朋友都常常听说"内核对象"."句柄"等术语却无从得知他们的内核实现到底是怎样的, 本篇文章就揭开这些技术的神秘面纱. 常见的内核对象 ...

  7. windows核心编程---第八章 使用内核对象进行线程同步

    使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...

  8. Windows API学习---线程与内核对象的同步

    前言 若干种内核对象,包括进程,线程和作业.可以将所有这些内核对象用于同步目的.对于线程同步来说,这些内核对象中的每种对象都可以说是处于已通知或未通知的状态之中.这种状态的切换是由Microsoft为 ...

  9. windows内核对象句柄

    内核对象用于管理进程.线程和文件等诸多种类的大量资源,每一个内核对象都只是一个句内存快,它由操作系统内核分配,并只能右操作系统内核访问.这个内存块是一个数据结构,其维护着与对象相关的信息,其中少数成员 ...

随机推荐

  1. Vue 实现原理

    vue.js是数据驱动web界面的库.vue核心思想个:数据驱动.组件系统 vue实现数据驱动视图原理 数据驱动是vue最大特点,所谓的数据驱动就是:当数据发生变化的时候,界面会相应的变化,我们不需要 ...

  2. 转:js点击事件在ios中失效的3种解决方案

    ios中不允许将点击事件绑定在document或者body上,如果绑定上的话将会失效.解决方案: 例如:  $(document).on('click', '#generate', function ...

  3. Watcher 实现机制之client注冊

    Zookeeper 提供的了分布式数据的公布/订阅功能,通过 Watch 机制来实现这样的分布式的通知功能. Zookeeper 同意client向server注冊一个Watch监听.当服务端的一些指 ...

  4. Delphi中SendMessage使用说明(所有消息说明) good

    Delphi中SendMessage使用说明 SendMessage基础知识 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.而函数Po ...

  5. TC SRM 597 DEV2

    第一次玩TC的SRM,只完成了一题,有点失落,不过还是要把每个问题都研究清楚才是我的本性,呵呵 第一题思路: 任意一个数,不断除掉2以后的剩下的数若相同则YES否则NO 第二题: 最开始判断字母个数是 ...

  6. ubuntu将mysql、nginx添加到环境变量中

    vim /etc/profile 添加 export PATH="$PATH:/usr/local/mysql/bin" export PATH="$PATH:/usr/ ...

  7. 类型配置命名空间 —— XML schema

    对于基于 XML 的配置,Spring 2.0 以后告别 DTD 格式(Document Type Definition)的配置文件,开始采用 Schema 格式,Schema 的突出亮点即是可让不同 ...

  8. python 获取当前文件夹路径及父级目录的几种方法

    获取当前文件夹路径及父级目录: import os current_dir = os.path.abspath(os.path.dirname(__file__)) print(current_dir ...

  9. linux shell 实例1

    UI项目删除“UIL”文件中的无用字串: 脚本需要制定UIL文件目录位置&无用字串的txt文件,如删除海尔目录下的无用字串: ./delete_uil_string.sh ./haier/UI ...

  10. 用nginx进行同一个服务器下多域名的负载均衡配置

    用nginx进行同一个服务器下多域名的负载均衡配置 Nginx进行http负载均衡的模块是upstream Upstream可以进行多个配置,这样的话可以灵活的配置站点,但是注意的是upstream后 ...