1.内核对象概念
  windows内核对象是由操作系统内核分配一个内存块,只能由内核访问和管理。所以,应用程序是无法在内存中找到这些它们并维护它们的,应用程序只能通过句柄的方式并调用windows提供的一系列内核对象操作接口并依赖于OS来进行维护,而且这些句柄对于应用程序来说也是不透明的(微软本身就没有给出详细的解释和定义),应用程序只有句柄的使用权,而无修改权。
  例如:进程内核对象,线程内核对象,信号量内核对象...
 
2.内核对象结构的内容
  这个内存块本质上是一种数据结构,不同的内核对象有不同的结构成员,但基本上所有的内核对象都有以下两个重要的成员:
  (1)使用计数器。
  用于记录当前有多少个进程在使用该内核对象--当内核对像被首次创建时其计数为1,然后,每次有另外的进程访问该对象时,计数器+1,当一个进程结束时系统会自动检查被该进程所使用的那些在内存中依然的内核对象的usage count,并将其减1,此时,如果减后的usage count为0,那么系统会进一步自动撤销该内核对像。这样便可以保证没有被任何进程使用的kernel object的内存被及时撤销。
  (2)安全描述符--security descriptor。
   安全描述符用于描述谁创建了该对象,谁能够访问或使用该对象,谁无权访问该对象。安全描述符通常在编写服务器应用程序时使用,如果你编写客户机端的应用程序,那么可以忽略内核对象的这个特性。另外,该成员也是所创建的对象是否为内核的依据。大多数应用程序只是为该参数传递N U L L,这样就可以创建带有默认安全性的内核对象。默认安全性意味着对象的管理小组的任何成员和对象的创建者都拥有对该对象的全部访问权,而其他所有人均无权访问该对象。但是,可以指定一个SECUTITY_ATTRIBUTES结构,对它进行初始化,并为该参数传递该结构的地址。
  
3.内核对象的创建
  每个进程都在初始化时系统都会为它分配一个内核对象句柄表。关于内核对象句柄表,微软并没有给出详细的解释,但基本上它是一个记录进程所用到的内核对象句柄信息的结构。当进程首次初始化时该句柄表是空的;当该进程中的线程创建内核对象时,系统会为在创建kenel object后马上回过头到该进程的句柄表中找到一个空的表项,然后把方才创建的kenel object的句柄等相关信息记录进去。
 
4.内核对象的关闭
  无论内核对象当初是如何创建的你都必须用CloseHandle()函数来手动关闭其句柄。要牢记这一点!
  CloseHandle(HANDLE hobj)的执行过程如下:
 
  检查调用进程的句柄表;       //确保该句柄是当前进程可以访问的
  if(hobj索引有效)
  {
 通过查其所属进程的句柄表获取该hobj句柄的内核对象的usage count;
 usage_count--;
 if(useage_count==0)
 {
  系统撤销句柄hobj所对应的那个内核对象;
 }
 清除hobj对应的进程句柄表的表项;
 return TRUE;
  }
  else //句柄hobj对于当前进程来说是无效的话
  {
 SetLastError(ERROR_INIVALID_HANDLE)   //winAPI函数,用于设置所发出的错误信息
 return FALSE;
  }
 
  如果在进程的运行过程中忘记了用CloseHanle关闭那些不用的内核对象句柄,那么就会在该进程运行期造成内存泄露的问题;但是一旦此进程运行终止,系统会自动地扫描该进程的句柄表,找到那些无效的句柄项(即在该进程不再使用但忘记关闭的内核对象的句柄)然后关闭它们,在关闭过程中,如果导致相应的内核对象的usage_count--后变为0则系统顺便还会撤销该内核对象(因为在该进程中创建的内核对象还可能通过跨进程边界共享的方式被别的进程所使用,所以其usage_count可能不为0)。
  也就是说,OS会保证在应用程序结束(也就是程序运行期所用的所有进程都终止了运行)后,所有相关的内核对象都被撤销而收回所有内核对象的所占内存。