3.1何为内核对象

内核对象如:访问令牌对象,事件对象,文件对象,文件映射对象,I/O完成端口对象,作业对象,邮件槽对象,互斥量对象,管道对象,进程对象,信号量对象,线程对象,可等待的计时器对象以及线程池工厂对象。

这些对象通过不同名称的函数来创建。函数的名称并非肯定与操作系统内核级别上使用的对象类型对应。

每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问。这个内存块是一个数据结构,其成员维护着与对象相关的信息。

由于内核对象的数据结构只能由操作系统内核访问,所以应用程序不能在内存中定位这些数据结构并直接更改其内容。

利用Windows提供的一组函数可以让应用程序操纵这些内核对象。调用一个创建内核对象的函数后,函数会返回一个句柄(handle),它标识了所创建的对象。这个句柄可以由进程中的任何线程使用。

 

使用计数:

内核对象的所有者是操作系统内核,而非进程。换言之,如果我们的进程调用一个函数来创建一个内核对象,然后进程终止运行,则内核对象并不一定会销毁。大多数情况下这个内核对象是会被销毁的,但假如另一个进程正在使用我们的进程创建的内核对象,那么在其他进程停止使用它之前,它是不会销毁的。总之,内核对象的生命期可能长于创建它的那个进程。

操作系统内核知道当前有多少进程在使用一个特点的内核对象,因为每个对象都包含一个使用计数,使用计数是所有内核对象类型都有的一个数据成员。初次创建,计数被设为1,另一个进程获得对现有内核对象的访问后,使用计数就会递增。进程终止运行后,操作系统内核将自动递减此进程仍然打开的所有内核对象的使用计数。如果一旦对象的使用计数为0,操作系统内核就会销毁该对象。

 

内核对象的安全性:

内核对象可以用一个安全描述符来保护。安全描述符描述了谁拥有对象;哪些用户和用户被允许访问或使用此对象;哪些组和用户被拒绝访问此对象。安全描述符通常在编写服务器应用程序的时候用。

用于创建内核对象的所有函数几乎都有指向一个SECURITY_ATTRIBUTES结构的指针作为参数。大多数应用程序只是为这个参数传入NULL,具有默认的安全性。也可以分配一个SECURITY_ATTRIBUTES结构,并对它进行初始化,再将它的地址传给这个参数。

  
  
  
  
  1. typedef struct _SECURITY_ATTRIBUTES{ 
  2.   DWORD nLength; 
  3.   LPVOID lpSecurityDescriptor; 
  4.   BOOL bInheritHandle; 
  5. }SECURITY_ATTRIBUTES; 

初始化:

  
  
  
  
  1. SECURITY_ATTRIBUTES sa; 
  2. sa.nLength = sizeof(sa); 
  3. sa.lpSecurityDescriptor = pSD;//Address of an initialized SD 
  4. sa.bInheritHandle = FALSE; 
  5. HANDLE hFileMapping = CreateFileMapping(INVALID_HANDLE_VALUE, &sa, 
  6.        PAGE_READWRITE, 0, 1024, TEXT("MyFileMapping")); 

如果想访问现有的内核对象,必须指定打算对此对象执行哪些操作。例如。如果想访问一个现有的文件映射对象,以便从中读取数据,那么可以像下面这样调用OpenFileMapping:

  
  
  
  
  1. HANDLE hFileMapping = OpenFileMapping(FILE_MAP_READ, FALSE, 
  2.     TEXT("MyFileMapping")); 

将FILE_MAP_READ作为第一个参数传为OpenFilemapping,表明要在获得对这个文件映射对象访问权之后,从中读取数据。OpenFileMapping函数在返回一个有效句柄值之前,会先执行一次安全检查。

 

 

 

 

 

你可能感兴趣的:(windows,函数,操作系统,应用程序,休闲)