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