【文起】蟹儿的爱一直伴随着,奋斗!
内核对象
1、 定义:
内核对象可以供系统和应用程序使用来管理各种各样的资源,比如线程、进程、文件等。
内核对象就是内核分配的一个内存块,且只能由该内核来访问。这样做是为了确保内核对象结构保持状态的一致。而操作内核对象,只能通过Microsoft提供的一组函数。
2、 内核对象的使用计数:
内核对象是由内核所拥有的,而非进程所拥有的。也就是说,即使创建改内核对象的进程终止运行了,内核对象也可能仍然存在。那么内核对象到底是如何撤销的呢?这就谈到了内核对象的使用计数。
内核对象在被创建时,它的使用计数被置为1,每有一个进程调用它,就会加1;相应的进程终止运行时,内核就会确定该进程仍然打开的所有内核对象的使用计数,如果将为0,那么内核就会撤销该对象。
3、 安全性:
内核对象得到安全描述符的保护。安全描述符用于描述谁创建了该对象,谁能够访问或使用该对象,谁无权访问该对象。
每一个创建内核对象的函数几乎都有一个指向SECURITY_ATTRIBUTES结构的指针作为其参数。
typedef struct _SECURITY_ATTRIBUTES
{
DWORD nLength;
LPVOID plSecurityDescriptor;
BOOL bInheritHandle;
}SECURITY_ATTRIBUTES;
4、 内核对象和其他对象(用户对象或图形设备对象)的区别。主要看创建对象的函数是否含有PSECURITY_ATTRIBUTES参数
5、 进程的句柄结构:
每一个结构包含一个指向内核对象的指针、一个访问屏蔽和一些标志
6、 创建内核对象:
创建内核对象的函数有好些:HANDLE CreateThread()等。每个函数返回一个跟进程相关的句柄
7、 关闭内核对象:
与创建内核对象有多种不一样,关闭内核对象全部通过调用BOOL CloseHandle(HANDLE hobj)
8、 共享内核对象
8.1对象句柄的继承性:
只有进程具有父子关系时,才能使用对象句柄的继承性。而这样做,父进程必须有如下步骤:
i.父进程创建内核对象时,必须向系统指明它希望对象的句柄是个可继承的句柄。但是虽然句柄是可继承的,内核对象本身却不具备继承性。方法是:
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
HANDLE hMutex = CreateMutex(&sa,FLASE,NULL);
ii让父进程生产子进程,并且同样将bInheritHandle置为TRUE
iii要记住,继承性只能在生成子进程的时候使用。
8.2改变句柄的标志
BOOL SetHandleInformation(HANDLE hObject,DWORD dwMask,DWORD dwFlags);
第一个参数用于标识一个有效的句柄,第二个参数告诉该函数想要改变哪个或哪几个标志,第三个是用于指明想将该标志设置成什么值。
8.3命名对象
函数有一个共同的最后参数,PCTSTR pszName。
8.4复制对象句柄
BOOL DuplicateHandle().一般涉及两个进程时,调用该函数。