看完了内核对象,现在看进程。都知道进程是通过内核对象被操作系统管理的。它由内核对象和地址空间组成。
下面看看CreateProcess函数:创建进程。需要说明的是,在进程完全初始化之前该函数就会返回true。 这意味着操作系统j加载程序尚未进行定位所有所必要的dll。如果某个dll找不到或者未能正确初始化,进程就会终止。因为CreateProcess返回TRUE,所以父进程不会注意到任何初始化的问题。
1.pszCommandLine参数。
表示创建的进程的命令行参数,操作系统会修改我们传的命令行参数,但是在函数返回之前还原为原来的形式。它是PTSTR类型,表示传入的是一个“非常量字符串”的指针。如果传入常量字符串指针,会引起访问违规。
CreateProcess(NULL,TEXT("XXX"),NULL,NULL,FALSE,0,NULL,NULL,&si,&pi); //第二个参数传入的是常量指针
在使用时应该先将常量复制到一个缓冲区中:
TCHAR szCommandLine[] = TEXT("XXX"); //然后传入szCommandLine
2.psaProcess、psaThread和bInheritHanles
前两个参数分别为进程对象和线程对象指定安全性。为NULL时,系统为其分配默认的安全描述符。两个都是SECURITY_ATTRIBUTES的结构。bInheritHanles参数是该结构的一个参数,用于指示
有关的其他参数,就不再详细讲。
作业内核对象 。可以想象成一个进程容器。用于把一组进程装起来,这样就可以对进程施加限制。
/* *创建一个作业内核对象 *@PSECURITY_ATTRIBUTES psa *@PCTSTR pszname */ HANDLE hjob = CreateJobObject(NULL, TEXT("KDDKKKK")); /* *将进程添加到作业中 *@HANDLE hjob *@HANDLE hProcess */ AssinProcessToJobObject(hjob, GetCurrentProcess());
对作业中的进程施加限制
BOOL SetInformationJobObject( HANDLE hJob, JOBOBJECTINFOCLASS JobObjectInformationClass, PVOID pJobObjectInformation, DWORD cbJobObjectInformationSize); /* *@hJob 指定要限制的作业 *@JobObjectInformationClass 是一个枚举类型,指定要施加限制的类型 *@pJobObjectInformation 指向包含具体限制设置的数据结构的地址 *@cbJobObjectInformationSize 指定该数据结构的大小 */
限制类型的总结:
限制类型 | JobObjectInformationClass | pJobObjectInformation |
基本限额 | JobObjectBasicLimitInformation | JOBOBJECT_BASIC_LIMIT_INFORMATION |
扩展后的 基本限额 | JobObjectBasicLimitInformation | JOBOBJECT_BASIC_LIMIT_INFORMATION |
基本的UI 限制 | JobObjectBasicUIRestrictions | JOBOBJECT_BASIC_UI_RESTRICTIONS |
安全限额 | 安全限额 | JOBOBJECT_SECURITY_LIMIT_INFORMATION |