windows 内核对象核心知识点

  1. 常见的内核对象: 事件对象、文件对象、I/O完成端口、邮件槽、互斥对象、进程对象、线程对象、信号量对象、可等待的计时器、线程池工厂对象。
  2. 一个对象是不是内核对象,通常可以看创建此对象API的参数中是否需要:PSECURITY_ATTRIBUTES 类型的参数。
  3.  内核对象是存在内核地址空间的一种数据结构(结构体),它由操作系统分配,而不是具体的某个进程管理。通过某种。共享机制,系统上所有的进程都共享这一块内存空间。应用程序不能直接操作内核对象,需要用Windows系统给定的函数来操作。每一个内核对象都有特定的创建函数和操作函数。
  4. 问题:操作系统内核的地址空间范围是多少?

    所以,在32位系统中,内核对象的内容被保存在0x80000000至0xFFFFFFFF的这个内核地址空间中)。在这一分区内的任何东西为所有进程共有

         所以在整个32位操作系统中,不管有多少个进程,内核对象的大小都是2G。

     5. 进程的属性:使用计数和安全描述符。

     6.进程间共享内核对象有以下三种方式:

  • 继承内核对象句柄
  • 命名内核对象
  • 复制DupilateHandle 

延伸:

windows系统是进程和句柄表、句柄(handle)

对应linux系统是进程和文件描述符表、文件描述符(fd)

每个进程都有一个句柄表,子进程创建一个新的空的进程句柄表,复制项的位置和父进程完全一样(具体表现为:句柄值和指向内核对象的指针都是一样)。所以导致内核对象使用次数增加。需要关闭内核对象。windows系统使用closehandle函数,linux使用close函数。

继承内核对象句柄:

只有在进程的父子关系的时候,才能使用对象句柄继承。并且只有在生成子进程的时候发生。

一般使用的是createprocess函数实现,注意的地方:

1.内核对象的SECURITY_ATTRIBUTES结构的binherithandle= true 

2.createprocess函数的binherithandles=true.

结果是

1.子进程创建一个新的空的进程句柄表,复制项的位置和父进程完全一样。

2.内核对象的使用次数增加。

duplicatehandle :

在进程之间共享内核对象句柄的一种方法,该函数取得某个进程句柄表中的一个表项,然后把它拷贝到另一个进程的句柄表中。表面上是在复制句柄值,实际上是把该句柄在源进程句柄表中的所有项复制到目标进程的句柄表中,而且使该内核对象的计数器+1了,如果只是简单的只传句柄值,目标进程的句柄表中是不会有所增加的。

  1. 同一个内核对象在不同的进程中的句柄值不一定相同。(一般来说都不同)
  2. 一个进程在初始化的时候,系统会为它分配一个句柄表。最开始的时候,它的句柄表是空的。

  3. 每次进程的某个线程调用“Create***”成功后,内核句柄表会增加一项;调用CloseHandle会删除相应项。

应用场景:在多个进程共用同一个dll中,该dll中有1个套接字句柄,是应用于主进程进行接收数据的。现在通过duplicatehandle 函数,让其他进程复制主进程的套接字,用于其他进程发送数据。

命名内核对象

通过命名内核对象,实现了共享内存 :(也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用。                                                                                                  

1.当调用 CreateFileMapping 创建命名的内存映射文件对象时 , Windows 即在物理内存申请一块指定大小的内存区域 , 返回文件映射对象的句柄 hMap ; 如:

Handle hmapobj = createfilemapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,SIZE,_T("SHARE"));

2.为了能够访问这块内存区域必须调用 MapViewOfFile 函数 , 促使 Windows 将此内存空间映射到进程的地址空间中 ;    如

mapviewoffile(hmapobj,FILE_MAP_WRITE,0,0,0);                                  

3.当在其他进程访问这块内存区域时 , 则必须使用 OpenFileMapping 函数取得对象句柄 hMap , 并调用 MapViewOfFile 函数得到此内存空间的一个映射 , 这样系统就把同一块内存区域映射到了不同进程的地址空间中 , 从而达到共享内存的目的                           

   4.UnmapViewOfFile //从进程的地址空间撤销文件数据的映像                    

  5. CloseHandle //关闭文件对象和文件映射对象

应用场景:在多个进程共用同一个dll中,该dll中的主进程通过createfilemapping创建内存映射文件,该dll其中的进程通过OpenFileMapping获取到该内存映射文件对象。

延伸:

1.调用函数创建内核对象,如果失败了,返回的句柄值通常是0(NULL).特殊情况是createFile失败返回句柄值为-1(INCAILD_HANDLE_VALUE,而不是NULL

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值