Windows核心编程笔记第一篇(进程的定义和CreateProcess函数的解释)

//本文内容大都来自《Windows核心编程》和MSDN,翻译的很烂,可是自己翻译一遍后突然发现自己懂了虽然不会//表达,献给痛苦徘徊在此的同路人。

进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:

• 一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。

• 另一个是地址空间,它包含所有可执行模块或D L L 模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。

BOOL CreateProcess(
   PCTSTR pszApplicationName,
   //pszApplicationName指定要创建进程的应用程序名,如在此设置需要全名
   PTSTR pszCommandLine,
   //需要创建进程的命令行参数,一般第一个字符用来存储应用程序名,不需要全地址
   PSECURITY_ATTRIBUTES psaProcess,
   //描述进程的可继承特征,为SECURITY_ATTRIBUTES结构体
   PSECURITY_ATTRIBUTES psaThread,
   //描述主线程的可继承性
   BOOL bInheritHandles,
   //被创建的进程是否继承当前进程的内核操作权限
   DWORD fdwCreate,
   //规定如何创建进程
   PVOID pvEnvironment,
    //pvEnvironment参数用于指向包含新进程将要使用的环境字符串的内存块。
    //在大多数情况下,为该参数传递N U L L ,使子进程能够继承它的父进程正在使用的一组环境字符串。
   PCTSTR pszCurDir,
   // pszCurDir允许父进程设置子进程的当前驱动器和目录。
   //如果本参数是N U L L ,则新进程的工作目录将与生成新进程的应用程序的目录相同。
   PSTARTUPINFO psiStartInfo,
    //位置窗口标题显示名称光标等信息,包含了控制台模式和窗体模式,但我并不关心
    //一般使用默认值但是需要初始化长度
   PPROCESS_INFORMATION ppiProcInfo);
当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数是1 。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。可以将进程内核对象视为由进程的统计信息组成的一个较小的数据结构。然后,系统为新进程创建一个虚拟地址空间,并将可执行文件或任何必要的D L L 文件的代码和数据加载到该进程的地址空间中。

ContractedBlock.gif ExpandedBlockStart.gif Code
ExpandedBlockStart.gifContractedBlock.gif/**//************************************************************
Module name: Inherit.c
Notices:Copyright(c)2000 Jeffrey Richter
***********************************************************
*/

#include 
<Windows.h>
 
int WINAPI WinMain (HINSTANCE hinstExe,HINSTANCE,
   PSTR pszCmdLine,
int nCmdShow)
ExpandedBlockStart.gifContractedBlock.gif
{
  
//Prepare a STARTUPINFO structure
  
//for spawning processes.
 
   
//定义STARTUPINFO结构体为创建进程做准备
 
 
ExpandedSubBlockStart.gifContractedSubBlock.gif   STARTUPINFO si 
= sizeof(si) };
   
//将该结构中的所有成员初始化为零,然后将c b 成员设置为该结构的大小:
   SECURITY_ATTRIBUTES saProcess,saThread;
   PROCESS_INFORMATION piProcessB,piProcessC;
   TCHAR szPath[MAX_PATH];
   
//Prepare to spawn Process B from Process A.
   
//The handle identifying the new process
   
//object should be inheritable.
 
   
//准备从进程A中创建进程B
   
//saProcess.bInheritHandle = TRUE;
   
//标示表示新的进程能够被继承
   saProcess.nLength = sizeof(saProcess);
   saProcess.lpSecurityDescriptor 
= NULL;
   saProcess.bInheritHandle 
= TRUE;
   
//The handle identifying the new thread
   
//object should NOT be inheritable.
 
   
//saThread.bInheritHandle = FALSE;
   
//这个标示线程不能被继承
   saThread.nLength = sizeof(saThread);
   saThread.lpSecurityDescriptor 
= NULL;
   saThread.bInheritHandle 
= FALSE;
   
//Spawn Process B.
 
   
//创建进程B
   lstrcpy(szPath,TEXT("ProcessB"));
 
   CreateProcess(NULL,szPath,
      
&saProcess,&saThread,
      FALSE,
0,NULL,NULL,&si,
      
&piProcessB);
 
   
//The pi structure contains two handles
   
//relative to Process A:
   
//hProcess,which identifies Process B's process
   
//object and is inheritable; and hThread,
   
//which identifies Process B's primary thread
   
//object and is NOT inheritable.
 
   
//Prepare to spawn Process C from Process A.
   
//Since NULL is passed for the psaProcess and
   
//psaThread parameters,the handles to Process C's
   
//process and primary thread objects default
   
//to "noninheritable."
 
   
//If Process A were to spawn another process,
   
//this new process would NOT inherit handles
   
//to Process C's process and thread objects.
 
   
//Because TRUE is passed for the bInheritHandles
   
//parameter,Process C will inherit the handle that
   
//identifies Process B's process object but will
   
//not inherit a handle to Process B's primary
   
//thread object.
 
   
//PI结构体包含两个句柄
   
//并且关联到进程A中:
   
//被声明为可继承的进程B(hProcess),
   
//和被声明为不可继承的进程B的主线程(hThread)
 
   
//从进程A中创建进程C
   
//是通过一个空的psaProcess和一个空的psaThread参数
   
//所以进程C的进程和主线程是默认不可继承的
 
 
   
//如果进程A创建一个新的进程
   
//这个新的进程是不能继承进程C的进程和主线程的
 
   
//由于在创建进程C的时候 CreateProcess 的参数
 
   
//bInheritHandles被置为True,进程C将会继承进程B
   
//的进程,但是不会进程进程B的主线程
 
   lstrcpy(szPath,TEXT(
"ProcessC"));
 
   CreateProcess(NULL,szPath,NULL,NULL,
      TRUE,
0,NULL,NULL,&si,&piProcessC);
 
   
return(0);
}

转载于:https://www.cnblogs.com/wParma/archive/2009/10/28/1591177.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值