windows进程创建函数CreatProcess

函数描述

 BOOL CreateProcess(
                    PCTSTR      psApplicationName, //可执行文件的名字
                    PTSTR      pszCommandLine, //命令行字符串
                    PSECURITY_ATTRIBUTES psaProcess,   //进程对象的安全性
                    PSECURITY_ATTRIBUTES psaThread,   //线程对象的安全性
                    BOOL      bInheritHandles, //句柄可继承性
                    DWORD      fdwCreate,   //标识符(优先级)
                    PVOID      pvEnvironment, //指向环境字符串
                    PCTSTR      pszCurDir,   //子进程当前目录
                    PSTARTUPINFO    psiStartInfo,
                    PPROCESS_INFORMATION ppiProcInfo);   //进程线程句柄及ID

当一个线程调用CreateProcess时,系统就会创建一个进程内核对象,其初始使用计数为1。该进程内核对象不是进程本身,而是操作系统管理进程时使用的一个较小的数据结构。该内核对象数据结构就是对该进程的一个统计信息描述。进程被完全初始化之前,CreateProcess返回TRUE,如果一个DLL无法找到,或则未能正确初始化,该进程就会终止运行,由于CreateProcess返回TRUE,因此父进程不知道出现的任何初始化问题。

psApplicationName

用于设定新进程将要使用的可执行文件的名字,必须设定文件的扩展名,系统将不会自动假设文件名有一 个.exe扩展名,假设该文件位于当前目录中,除非文件名前面有一个路径。如果在当前目录中找不到该文件,CreateProcess将不会在任何其他目录中查找该文件,便会创建进程运行失败。

pszCommandLine

psApplicationName在为NULL时,用于设定传递给新进程的命令行字符串,当CreateProcess分析pszCommandLine字符串时,它将查看字符串中的第一个标记,并假 设该标记是想运行的可执行文件的名字。如果可执行文件的文件名没有扩展名,便假设它的扩 展名为.exe。CreateProcess也按下面的顺序搜索该可执行文件:

  1. 包含调用进程的.exe文件的目录
  2. 调用进程的当前目录
  3. windows的系统目录
  4. windows目录
  5. PAT H环境变量中列出的目录

psaProcess、psaThread、binheritHandles

若要创建一个新进程,系统必须创建一个进程内核对象和一个线程内核对象(用于进程的 主线程),由于这些都是内核对象,因此父进程可以得到机会将安全属性与这两个对象关联起 来。可以使用psaProcess和psaThread参数分别设定进程对象和线程对象需要的安全性。可以为 这些参数传递NULL,在这种情况下,系统为这些对象赋予默认安全性描述符。也可以指定两 个SECURITY_ ATTRIBUTES结构,并对它们进行初始化,以便创建自己的安全性权限,并将它们赋予进程对象和线程对象。binheritHandles用于设置该进程的SECURITY_ ATTRIBUTES安全结构是否能被子进程继承。

fdwCreate

该参数用于标识标志,以便用于规定如何来创建新进程,或则用于设定优先级类

pvEnvironment

用于指向包含新进程将要使用的环境字符串的内存块。在大多数情况 下,为该参数传递NULL,使子进程能够继承它的父进程正在使用的一组环境字符串。还可以使用GetEnvironmentStrings函数调用进程正在使用的环境字符串数据块的地址。

psCurDir

该参数允许父进程设置子进程的当前驱动器和目录。如果本参数是 NULL,则新进 程的工作目录将与生成新进程的应用程序的目录相同。如果本参数不是NULL,那么psCurDir必须指向包含需要的工作驱动器和工作目录的以 0结尾的字符串。注意,必须设定路径中的驱动器名。

psiStartInfo

用于指向一个 STARTUPINFO 结构

typedef struct _STARTUPINFOA {
  DWORD  cb;
  LPSTR  lpReserved;
  LPSTR  lpDesktop;
  LPSTR  lpTitle;
  DWORD  dwX;
  DWORD  dwY;
  DWORD  dwXSize;
  DWORD  dwYSize;
  DWORD  dwXCountChars;
  DWORD  dwYCountChars;
  DWORD  dwFillAttribute;
  DWORD  dwFlags;
  WORD   wShowWindow;
  WORD   cbReserved2;
  LPBYTE lpReserved2;
  HANDLE hStdInput;
  HANDLE hStdOutput;
  HANDLE hStdError;
} STARTUPINFOA, *LPSTARTUPINFOA;

ppiProcInfo

指向一个PROCESS_INFORMATION结构,CreatProcess在返回前需要对该结构成员进行初始化。

typedef struct _PROCESS_INFORMATION {
  HANDLE hProcess;
  HANDLE hThread;
  DWORD  dwProcessId;
  DWORD  dwThreadId;
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

终止进程的运行

主线程的进入点函数返回

始终都应该这样来设计应用程序,即只有当主线程的进入点函数返回时,它的进程才终止 运行。这是保证所有线程资源能够得到正确清除的唯一办法。 让主线程的进入点函数返回,可以确保下列操作的实现:

  • 该线程创建的任何C + +对象将能使用它们的析构函数正确地撤消。
  • 操作系统将能正确地释放该线程的堆栈使用的内存。
  • 系统将进程的退出代码(在进程的内核对象中维护)设置为进入点函数的返回值。
  • 系统将进程内核对象的返回值递减1。

ExitProcess函数返回

该函数用于终止进程的运行,并将进程的退出代码设置为fuExitCode。ExitProcess函数并 不返回任何值,因为进程已经终止运行。如果在调用ExitProcess之后又增加了什么代码,那么 该代码将永远不会运行。

TerminateProcess函数返回

该函数与ExitProcess有一个很大的差别,那就是任何线程都可以调用TerminateProcess来终 止另一个进程或它自己的进程的运行。

进程枚举

可以使用PSAPI.dll(Process Status)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值