1.每个内核对象都只是一个内存块,且只能由操作系统分配,也只能由操作系统访问,这个内存块是一个数据结构,其成员维护者与成员相关的信息。其中安全描述符和引用计数是所有的内核对象都具有的两个数据成员。
2.作为应用程序我们只能透过WINDOWS提供的一系列的函数来操作这些内核对象,这些函数都是通过一个与内核对象相关联的句柄值来操作内核对象的。
3.为了增强系统的安全性,内核对象的句柄值一定适合进程相关的。
4.由于引用内核对象引用计数的机制,内核对象的生命周期可能长于进程。
5.内核对象的安全性:
假如我们想访问一个现有的文件映射内核对象,以便从中读取数据,我们会这样操作
HANDLE hFileMaping=OpenFileMaping(FILE_MAP_READ,FALSE,TEXT(“MyFileMaping"));
操作系统会进行一次安全检查,如果我(当前登录的用户)被允许访问现有的文件映射对象,则会返回一个有效的句柄,否则访问将被拒绝
不考虑安全性,是个不好的习惯,有可能导致程序不可移植,比如
从注册表读取数据,正确的做法是:调用RegOpenKeyEx,并传入KEY_QUERY_VALUE,但老系统的程序员可能会传入KEY_ALL_ACCESS,这在Vista以上的版本可能失败,因为对于一个不是管理员的用户,注册表项可能是只读的。
6.每个进程启动时,系统都会为它分配一个句柄表,仅供内核对象使用。当关闭一个内核对象(调用CloseHandle())时,系统将通过内核对象句柄去索引句柄表,从而找到内核对象的内存地址,然后将内核对象的引用计数减去1,如果引用计数降为0,则内核对象将会被销毁。注意:无论内核对象是否被销毁,调用了CloseHandle()的进程的句柄表都会被清理一次,所以,绝对不要在调用了CloseHandle()后,在同一进程中引用内核对象。
7.跨进程边界共享内核对象
(1)。使用对象句柄继承:
(2)。为对象命名:
(3)。复制对象句柄。