浅谈Windows编程中的句柄和对象

 系统使用对象和句柄来控制对于系统资源(文件、线程等)的访问主要出于两个目的:
1、只要保持对象原有接口不变,这样Microsoft可以很好的更新系统功能。当系统发布时,原先使用对象的应用程序只要进行很少修改或者不用修改就可以照样运行。
2、使用对象将有利于使用Windows NT 。每个对象都有自己的反问控制列表(ACL)。访问控制列表指定了进程可以对相应对象所进行的操作。每次应用程序创建对象的句柄时,系统会检查对象的ACL。

对象管理器:
一 个对象包含一个标准头和特定于对象类型的属性。因为所有的对象有着相同的结构,所以Windows内部使用一个“对象管理器”来管理所有的对象。对象头包 含对象名(其它进程可以用对象名来引用该对象)、安全表述表(对象管理器用来控制进程对于系统资源的访问)。对象管理器实现如下几个功能:
1、创建对象
2、对于进程使用对象的权限进行验证
3、创建对象并且返回给调用函数
4、对于资源配额进行维护
5、创建复制句柄(duplicate handle)
6、关闭对象的句柄

对象接口:
Windows对于如下任务提供了相应的操作函数:
1、创建一个对象
2、获取一个对象句柄
3、获取对象的信息
4、设置对象的信息
5、关闭对象句柄
6、清除对象
对象和句柄将消耗内存。应此,为了保持系统的性能,只要对象不再需要时,你必须关闭句柄并且删除对象。如果你不这样做,系统将由于过多使用分页,将大大影响其性能。
注意:当进程结束时,系统将自动关闭句柄并且删除由该进程所创建的对象。然而,当线程结束时,通常系统不会关闭句柄或者删除对象。除了以下对象例外:window、hook、window position和DDE 会话对象。这些对象当创建线程结束时才被清除。


句柄数的局限:
有些类型的句柄在同一时间只允许存在一个句柄。当应用程序创建对象时,系统提供句柄;当应用程序删除对象时,系统将使句柄失效(invalidate)。另外一些对象类型允许一个对象可以有多个句柄。在对象的最后一个句柄被关闭后,OS会自动从内存中移除对象。
在系统中允许的打开句柄的总数只受到可用内存大小的限制。然,有些对象类型在一个会话或者一个进程中对句柄数进行限制。


句柄的继承:
子进程能够从父进程继承句柄。被继承的句柄只有在子进程的上下文环境中有效。为了让子进程能够从它的父进程那里继承已打开的句柄,必须如下操作:
1、在创建句柄时,将SECURITY_ATTRIBUTES结构的成员bInheritHandle设置成TRUE
2、用CreateProcess函数创建子进程时,将bInheritHandle设置成TRUE
DuplicateHandle函数可以复制句柄,复制的句柄可以在当前进程或者在另一个进程中使用。

你可能感兴趣的:(编程,windows,OS,Microsoft,Security)