windows对象总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
windows对象总结
这篇⽂章是对windows对象的总结,在winows编程中,windows对象,句柄是⼀个基本概念,理解这些概念有助于后⾯的windows编程学习。
⽂章的形式还是以解答问题的⽅式来组织。
注:在⽂中,对象对应的英语翻译是object,句柄对应的英语翻译是handle.
1. 在windows中,什么是对象?
欲解释内核对象,需要先解释windows下对象(object)和句柄的概念。
在windows中,对象其实指的是⼀个通⽤的结构,这个数据结构代表的⼀个系统资源,例如⼀个⽂件资源,线程资源等等。
当我们操作的时候,只能通过句柄来操作这个对象代表的资源,⽆论你是⽂件还是线程。
这个时候会有⼀个问题:
windows为什么要将对象统⼀起来,只能通过句柄来操作对象代表的资源?
⼤约有以下⼏点原因:
*统⼀使⽤句柄,可以理解为封装,这意味着⽤户不需要关⼼对象的具体细节。
这样就可以在系统升级的时候对⽤户的程序没有影响。
*更好地利⽤windows安全策略,每个对象都有独⽴的访问控制列表(ACL),这样就可以限定访问对象的⾏为。
例如我们想要读取某个⽂件,但是当前⽤户没有权限,那么就会返回⼀个空的句柄。
2.windows对象都有哪些呢?
在windows编程中,我们每时每刻都在和windows对象打交道,例如进程,线程,⽂件等等。
其实微软对windows对象做了分类:⽤户对象,内核对象,GDI(这是图像驱动接⼝,在这⾥不讨论这个)。
⽤户对象
主要⽤来窗⼝相关的管理,例如Cursor,Hook,Window,这些都是⽤户对象
内核对象
⽤来进⾏更底层的系统资源管理,例如内存,进程通信等等。
更详细的信息请点击.
在这⾥,需要简单说下⽤户对象和内核对象⼀个重要的区别:
每个⽤户对象只能有⼀个句柄;⽽每个内核对象却可以有多个句柄,例如:Mutex是内核对象,⽤于多进程的同步,在某处创建,返回句柄,也可以在其它的进程打开(这其实也依赖此内核对象的安全属性设置)。
3 .内核对象共享的⽅式有哪些,系统是如何知道什么时候该销毁此对象呢?
在此需要说明下,内核对象共享指的是跨进程共享内核对象。
先说第⼆个问题,当我们不需要使⽤内核对象的时候,直接调⽤CloseHandle即可,在系统内部维护着此内核对象的信息,当使⽤此内核对象的进程为0时,系统会销毁此对象。
接下来就是内核对象的共享⽅式了,⾸先要了解,为什么要共享内核对象?原因很简单:在很多场景下都需要使⽤共享内核对象的⽅式,例如使⽤⽂件映射对象可以在不同进程之间共享数据。
在windows中,有三种⽅法可以⽤来共享内核对象:
a. 继承
在创建内核对象时,需要使⽤默认的安全性来创建,同时要将SECURITY_ATTRIBUTES中的bInhertHandle置为true。
这样在创建⼦进程的时候,将创建的参数--bInheritHandles设置为true,这样就可以⼦进程就可以访问⽗进程相应的内核对象了。
b. 为对象命名
⾸先a进程创建⼀个内核对象,并对其命名为A,如果b进程想访问A,那么可以创建⼀个相同的内核对象,将其命名为A,如果b对象有⾜够的权限,那么新创建的内核对象将指向A,b进程就可以访问A了。
c. 使⽤DuplicateHandle⽅法
A进程调⽤此⽅法,将B进程中的内核对象共享到C进程中。
以上就是对Windows对象的总结。