Windows学习旅程-内核对象(三)

   windows内核对象主要有进程对象,作业对象,线程对象等。由于内核对象的数据结构只能被内核访问,因此应用程序无法在内存中找到这些数据结构并直接改变它们的内容。MS规定了这个限制条件,目的是为了确保内核对象结构保持状态的一致。这个限制也使MS能够在不破坏任何应用程序的情况下在这些结构中添加、删除和修改数据成员。
   1.内核对象
   在创建内核对象成功的时候会生成一个内核对象句柄

HANDLE CreateFile(
  LPCTSTR lpFileName,          
//  pointer to name of the file
  DWORD dwDesiredAccess,        //  access (read-write) mode
  DWORD dwShareMode,            //  share mode
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
                               
//  pointer to security attributes
  DWORD dwCreationDisposition,   //  how to create
  DWORD dwFlagsAndAttributes,   //  file attributes
  HANDLE hTemplateFile          //  handle to file with attributes to 
                               
//  copy
);

 

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES lpThreadAttributes,  
//  pointer to security attributes
  DWORD dwStackSize,                          //  initial thread stack size
  LPTHREAD_START_ROUTINE lpStartAddress,      //  pointer to thread function
  LPVOID lpParameter,                         //  argument for new thread
  DWORD dwCreationFlags,                      //  creation flags
  LPDWORD lpThreadId                          //  pointer to receive thread ID
);

2.进程与内核对象
任何的一个内核对象都是管理一对进程的,但是内核对象的句柄只属于内核并不属于进程,因为任何内核对象的句柄可能被多个进程引用。当存在一个进程引用内核对象的时候,内核对象的计数器就会+1。当一个内核对象没有进程引用的时候,那么系统将要回收这个内核对象。如果我们多个进程引用了一个内核对象,其中一个进程不引用内核对象的时候必须关闭,使这个内核对象的计数器-1,否则这个将有可能出现内存泄漏,这样时候会导致系统崩溃呢?一般是不会的,因为当我们在结束进程的时候,这个进程会结束掉这个进程管理的所有内核对象,以及这个进程用到的所以资源。
   2.进程管理内核对象
     每一个进程都维护着一个索引表,这个索引表就是用来保存与之关联的内核对象,索引表的结构如下:
    
     每当创建一个内核对象的时候就会在此进程的索引表里添加一条内核对象关联记录
   3.共享内核对象
    3.1 继承共享
        子进程继承父进程的内核对象。首先我们得必须了解一下CreateProcess API,

BOOL CreateProcess(
  LPCTSTR lpApplicationName,
                         
//  pointer to name of executable module
  LPTSTR lpCommandLine,   //  pointer to command line string
  LPSECURITY_ATTRIBUTES lpProcessAttributes,   //  process security attributes
  LPSECURITY_ATTRIBUTES lpThreadAttributes,    //  thread security attributes
  BOOL bInheritHandles,   //  handle inheritance flag
  DWORD dwCreationFlags,  //  creation flags
  LPVOID lpEnvironment,   //  pointer to new environment block
  LPCTSTR lpCurrentDirectory,    //  pointer to current directory name
  LPSTARTUPINFO lpStartupInfo,   //  pointer to STARTUPINFO
  LPPROCESS_INFORMATION lpProcessInformation   //  pointer to PROCESS_INFORMATION
);

      :1.在创建父进程的时候,设置创建进程
    3.2 命名共享
    3.3 服务器端的共享
    3.4 复制共享

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值