对象管理器Object Manager
执行体内部负责创建、删除、保护和跟踪对象的组件,将本来可能散落在整个系统各处的资源控制操作集中在一起。
相关工具:Winobj, Handle, oh.exe, openfiles /query, !handle
Windows内部有两种类型的对象:执行体对象executive object,内核对象kernel object。执行体对象是由执行体的各种组件,如进程管理器,内存管理器,I/O子系统等实现的对象。内核对象是指由内核实现的一组更为基本的兑现,对用户模式的代码而言是不可见的,只在执行体内部被创建和使用,内核对象提供了最为基本的能力,如同步等。
执行体对象executive object:
每个Windows环境子系统总是把操作系统的不同面貌呈现给它的应用程序,执行体对象和对象服务时环境子系统用于构建自己版本的对行和其他资源的基础。执行体对象往往是由一个环境子系统代表一个用户应用程序而创建的,或者是由操作系统的各种组件作为它们常规操作的一部分而创建的。
Executive Objects Exposed to the Windows API | |
Object Type | Represents |
Symbolic link | A mechanism for referring to an object name indirectly. |
Process | The virtual address space and control information necessary for the execution of a set of thread objects. |
Thread | An executable entity within a process. |
Job | A collection of processes manageable as a single entity through the job. |
Section | A region of shared memory (known as a file mapping object in Windows). |
File | An instance of an opened file or an I/O device. |
Access token | The security profile (security ID, user rights, and so on) of a process or a thread. |
Event | An object with a persistent state (signaled or not signaled) that can be used for synchronization or notification. |
Semaphore | A counter that provides a resource gate by allowing some maximum number of threads to access the resources protected by the semaphore. |
Mutex* | A synchronization mechanism used to serialize access to a resource. |
Timer | A mechanism to notify a thread when a fixed period of time elapses. |
IoCompletion | A method for threads to enqueue and dequeue notifications of the completion of I/O operations (known as an I/O completion port in the Windows API). |
Key | A mechanism to refer to data in the registry. Although keys appear in the object manager namespace, they are managed by the configuration manager, in a way similar to that in which file objects are managed by file system drivers. Zero or more key values are associated with a key object; key values contain data about the key. |
WindowStation | An object that contains a clipboard, a set of global atoms, and a group of desktop objects. |
Desktop | An object contained within a window station. A desktop has a logical display surface and contains windows, menus, and hooks. |
对象结构:
每个对象都有一个对象头和一个对象体,对象管理器控制了对象头,而执行体组件则控制了由它们创建的对象类型的对象体。
对象管理器使用对象头中保存的数据来管理对象,不关心类型。对象头中包含的数据对于所有的对象都是公共的,但每个对象实例可以取不同的值,也可以包含一些对于某种特定类型的所有对象皆为常数的数据。
Standard Object Header Attributes | |
Attribute | Purpose |
Object name | Makes an object visible to other processes for sharing |
Object directory | Provides a hierarchical structure in which to store object names |
Security descriptor | Determines who can use the object and what they can do with it (Note: it might be null for objects without a name.) |
Quota charges | Lists the resource charges levied against a process when it opens a handle to the object |
Open handle count | Counts the number of times a handle has been opened to the object |
Open handles list | Points to the list of processes that have opened handles to the object (not present for all objects) |
Object type | Points to a type object that contains attributes common to objects of this type |
Reference count | Counts the number of times a kernel-mode component has referenced the address of the object |
每个对象类型有各自的格式。
对象管理器提供了少量通用服务可以对一个对象头中保存的属性进行操作,并且可以用在任何类型的对象上。但每个对象类型有各自的打开和查询服务。
Generic Object Services | |
Service | Purpose |
Close | Closes a handle to an object |
Duplicate | Shares an object by duplicating a handle and giving it to another process |
Query object | Gets information about an object's standard attributes |
Query security | Gets an object's security descriptor |
Set security | Changes the protection on an object |
Wait for a single object | Synchronizes a thread's execution with one object |
Wait for multiple objects | Synchronizes a thread's execution with multiple objects |
相关命令。
Type Object Attributes | |
Attribute | Purpose |
Type name | The name for objects of this type ("process," "event," "port," and so on) |
Pool type | Indicates whether objects of this type should be allocated from paged or nonpaged memory |
Default quota charges | Default paged and nonpaged pool values to charge to process quotas |
Access types | The types of access a thread can request when opening a handle to an object of this type ("read," "write," "terminate," "suspend," and so on) |
Generic access rights mapping | A mapping between the four generic access rights (read, write, execute, and all) to the type-specific access rights |
Synchronization | Indicates whether a thread can wait for objects of this type |
Methods | One or more routines that the object manager calls automatically at certain points in an object's lifetime |
同步synchronization是一个对于windows应用程序可见的属性,是指一个线程通过等待某个对象从一种状态改变成另一种状态,从而达到同步执行其执行过程的能力,一个线程可以对执行体的作业、进程、线程、文件、事件、信号量、互斥体和定时器对象进行同步,其他的执行体对象不支持同步。
方法method由一组内部例程构成,类似于C++的构造函数和析构函数。当一个执行体组件创建了一个新的对象类型时,可以向对象管理器注册一个或多个方法,对象管理器会在此种类型的对象的生命周期过程中,某些明确定义的点上调用这些方法,通常是在一个对象被创建、删除或者以某种方式被修改的时候调用这些方法。
Object Methods | |
Method | When Method Is Called |
Open | When an object handle is opened |
Close | When an object handle is closed |
Delete | Before the object manager deletes an object |
Query | name When a thread requests the name of an object, such as a file, that exists in a secondary object namespace |
Parse | When the object manager is searching for an object name that exists in a secondary object namespace |
Security | When a process reads or changes the protection of an object, such as a file, that exists in a secondary object namespace |
对象句柄object handle:
进程通过句柄来访问对象,比直接使用名称来访问对象速度快,省去了名称查找过程,直接找到目标对象。所有用户模式进程在其线程使用一个对象以前,必须先拥有一个指向该对象的句柄,类似于C中的指针。执行体组件和设备驱动程序可以直接访问对象,但是必须通过增加对该对象的引用计数来显式声明自己要使用某一个对象了。使用对象句柄的好处在于,可以用统一的接口来引用对象,而无须关心其类型;对象管理器有独占的权限来创建句柄,以及找到一个句柄所指向的对象。
对象句柄是一个索引,指向与进程相关的句柄表handle table中的表项。一个进程的句柄表包含了所有已被该进程打开的对象的指针。句柄表是一个三层结构,每个进程最多不超过16000000个句柄。最高层包含指向中间层的指针,中间层包含了指向句柄表的指针数组,最底层包含了子句柄表。Windows2000在进程创建时分配好三层,而xp和2003时只有最底层在创建进程时被分配好,其他层在需要的时候被创建。Windows2000中子句柄表包含255个可用表项,xp和2003中子句柄表包含的表项数等于能填满一页的表项数减1,这取决于系统平台上的页面大小和指针大小。
Windows 2000进程句柄表结构:
Windows 2000句柄表项结构:
X86系统:2个32位成员,一个指向对象的指针及标志,一个准许访问掩码。
X64系统:每个句柄表项长12字节,一个64位指针指向对象头,一个32位访问掩码。
锁:对象管理器在把一个句柄转成对象指针时,置为1,保证地址大于0x80000000,总是在系统空间。2000中位于最高位,xp和2003中位于最低位。
P: 调用者是否允许关闭该句柄。
I: 继承标志,指明了该进程创建的子进程是否可以在它们的句柄表中有一份拷贝。继承性可以在句柄创建的时候指定,或通过SetHandleInformation指定。
A: 关闭该对象时是否应该产生一个审计消息,仅在对象管理器内部使用。
内核句柄表kernel handle table (ObpKernelHandleTable),只在内核模式下可以访问,用户模式应用程序无法访问。
对象安全性Object security:
当一个进程创建一个对象或者打开一个指向已有对象的句柄时,必须指定一组期望的访问权限desired access rights. 对象管理器调用安全饮用监视器security reference monitor来检查该对象的安全描述符是否允许该进程所请求的访问类型,如果允许则返回一组准许的访问权限granted access rights,允许该进程得到这些权限,同时将它们存放在所创建的对象句柄中。
对象保持力object retention:
Temporary, 只有在使用过程中才保留着,当不再需要时会被释放掉。
Permanent, 一直保留,直到显式释放掉。
第一阶段,名称保持力name retention, 每次当一个进程打开一个对象的句柄时,对象管理器就会将该对象的头信息中的已打开句柄计数器增加1;当进程用完了该对象并且关闭句柄时,对象管理器相应递减句柄计数器。当计数器减至0时,对象管理器从它的全局名字空间中删除该对象,避免新的进程再打开指向该对象的句柄。
第二阶段,当对象不再有用时,停止保留对象本身。对象管理器每次提供一个指向该对象的指针时,就会递增一个专门用于该对象的引用计数reference count.会随着句柄计数器而变化。所以即使当一个对象的句柄计数器达到0,该对象的引用计数器仍可能是正数,表明操作系统仍在使用该对象。
资源记账resource accounting, 对象管理器提供了一个中心设施来实现资源记账,每个对象头都包含配额花费quota charge属性,记录了当一个进程的线程打开一个指向该对象的句柄时,对象管理器从该进程在分页/分分页池中分配得到的配额中该减去多少。可以通过设置HKLM\System\CurrentControlSet\Session Manager\Memory Management中的NonPagedPoolQuota, PagedPoolQuota和PagingFileQuota来修改。
对象名称Object name:
用以区分此对象与彼对象的方法,找到并获得一个特定对象的方法,允许进程之间共享。
执行体的对象名字空间是全局的,对所有进程都是可见的。第一个进程创建一个对象,并且把它的名字放到全局名字空间中,第二个进程在打开对象句柄时只要指定该对象的名称就可以得到一个指向该对象的句柄。若不需要共享,则创建者不必为对象指定名称即可。
查找对象名称:创建时,先验证该名字在全局名字空间中不存在;打开句柄指向一个命名对象时,对象管理器查找该名称得到对象,然后给调用者返回一个对象句柄。允许大小写敏感。
Standard Object Directories | |
Directory | Types of Object Names Stored |
\GLOBAL?? (\?? in Windows 2000) | MS-DOS device names (\DosDevices is a symbolic link to this directory.) |
\BaseNamedObjects | Mutexes, events, semaphores, waitable timers, and section objects |
\Callback | Callback objects |
\Device | Device objects |
\Driver | Driver objects |
\FileSystem | File system driver objects and file system recognizer device objects |
\KnownDlls | Section names and path for known DLLs (DLLs mapped by the system at startup time) |
\Nls | Section names for mapped national language support tables |
\ObjectTypes | Names of types of objects |
\RPC Control | Port objects used by remote procedure calls (RPCs) |
\Security | Names of objects specific to the security subsystem |
\Windows | Windows subsystem ports and window stations |
对象目录object directory, 对象管理器通过对象目录支持层次命名。维护了足够多的信息以便将这些对象名称转译为指向这些对象本身的指针。
符号链接symbolic link, 引用一个符号链接对象名称时,对象管理器遍历名字空间,直到找到该符号链接,然后检查该符号链接,找到能取代该符号链接名的字符串,然后利用该字符串查找对象名称。如A:, COM1等。
会话名字空间session namespace:
NT初期假设了只有一个用户能通过交互方式登录系统。
一个登录到控制台会话上的用户可以访问全局名字空间,是第一个名字空间实例。另外的会话都可以获得该名字空间的一个私有视图即局部名字空间。对象管理器在于用户会话相关联的目录下,创建\DosDevices, \Windows, \BaseNamedObjects三个目录的私有版本,从而实现了会话名字空间。
No comments:
Post a Comment