Windows核心编程 进程 您所在的位置:网站首页 子程序不能脱离哪个程序单独运行 Windows核心编程 进程

Windows核心编程 进程

2024-07-13 07:44| 来源: 网络整理| 查看: 265

CreateProcess函数

使用CreateProcess函数来创建一个进程

BOOL CreateProcess( LPCTSTR pszApplicationName,// name of executable module LPTSTR pszCommandLine,// command line string LPSECURITY_ATTRIBUTES psaProcess,// SD LPSECURITY_ATTRIBUTES psaThread,// SD BOOL bInheritHandles,// handle inheritance option DWORD fdwCreationFlags,// creation flags LPVOID pvEnvironment,// new environment block LPCTSTR pszCurDir,// current directory name LPSTARTUPINFO psiStartupInfo,// startup information LPPROCESS_INFORMATION lpProcessInformation // process information );           一个线程调用CreateProcess时,系统将创建一个进程内核对象,其初始使用计数为1,然后系统为新进程创建一个虚拟地址空间,并将可执行文件(和所有必要的DLL)的代码及数据加载到进程的地址空间。然后,系统为新进程的主线程创建一个线程内核对象(其使用计数为1)。这个主线程一开始就会执行C\C++运行时的启动例程,它是由链接器设为应用程序入口的,最终会调用应用程序WinMain,wWinMain,main或wmain函数。如果系统成功创建了新进程和主线程,CreateProcess返回TRUE。 注意: CreateProcess在进程完全初始化好之前就返回true,如果一个dll找不到或不能正确初始化,进程就会终止,而父进程不会注意到任何初始化问题。 4.2.1  pszApplicationName 和 pszCommandLine      pszCommandLine类型为PTSTR,意味着不能传入常量,使用前应赋值给变量。CreateProcess内部会修改我们传入的字符串,但在返回前会还原。函数会检查字符串中的第一个标记(token),并假定此标记是我们想运行的可执行文件的名称。 如果指定的字符串没有扩展名:会默认是.exe,当然,加入文件名包含一个完整路径,系统就会用这个完整路径查找可执行文件

CreateProcess按以下的顺序搜索可执行文件:

1.主调进程.exe文件所在的目录

2.主调进程的当前目录

3.windows系统目录,即GetSystemDirectory()返回的System32文件夹

4.Windows目录

5.PATH环境变量中列出的目录

(c/c++运行时启动例程会检查进程的命令行,将可执行文件名之后的第一个实参的地址传给WinMain的pszCmdLine参数)

    lpApplicationName:

指定了新进程要使用的可执行文件的名称

一般此参数为NULL 如果不为NULL可以传递一个字符串地址,并在字符串中包含想要运行的可执行文件的名称,且要指定扩展名,系统不会自动加个.exe的扩展名

如果不指定路径,CreateProcess只会在当前路径下寻找文件,如果找不到调用就会失败,然而即使在pszApplicatioName中指定文件名,CreateProcess也会将pszCommandLine参数作为新进程的命令行传给他,例如:

#include #include int main() { char buf[]="WORDPAD README.txt"; STARTUPINFO si ={sizeof(STARTUPINFO)}; PROCESS_INFORMATION pi; CreateProcess("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE",buf,NULL,NULL,false,0,NULL,NULL,&si,&pi); } lpApplicationName不为NULL时,必须指定文件扩展名,且在当前文件目录下查找,并且将WORDPAD作为进程名,README.txt作为命令行传入main。 lpApplicationName设为NULL时写法: #include #include int main() { char buf[]="C:\\WINDOWS\\SYSTEM32\\NOTEPAD README.txt"; STARTUPINFO si ={sizeof(STARTUPINFO)}; PROCESS_INFORMATION pi; CreateProcess(NULL,buf,NULL,NULL,false,0,NULL,NULL,&si,&pi); } 4.2.2 psaProcess,psaThread和bInheritHandles参数     psaProcess psaThread 为进程和主线程的安全属性,为NULL时,系统指定默认安全描述符。bInheritHandles 继承性 4.2.3  fdwCreationFlags  参数      fdwCreate参数用于标识标志,以便规定用来如何创建新进程,见MSDN 4.2.4 pvEnvironment参数     传入NULL时,等于调用PVOID GetEnvironmentStrings(),将其返回地址作为参数。不再需要这块内存时,需调用FreeEnvironmentStrings函数释放 4.2.5  pszCurDir参数     允许父进程设置子进程的当前驱动和目录。注意:必须在路径中指定一个驱动号,或NULL。 4.2.6 psiStartupInfo参数     指向一个 STARTUPINFO结构体,STARTUPINFO si = {sizeof(si)};//将结构体第一个值设置为大小,其他初始化为0。若没有把其他的清0,则成员将包含主调线程的栈上的垃圾数据。导致有时能创建进程有时不能,具体取决于垃圾数据的内容。 4.2.7 lpProcessInformation 参数      Pointer to a PROCESS_INFORMATION structure that receives identification information about the new process. Handles inPROCESS_INFORMATIONmust be closed with  CloseHandle when they are no longer needed.在CreateProcess返回之前,会打开进程对象和线程对象,这时,每个对象的计数变为2,着意味着系统想要释放进程对象,进程必须终止(使用计数递减1),而且父进程必须调用CloseHandle(使用计数再次递减1,变成0)         每个进程内核对象,线程内核对象都有一个唯一的标识符,进程ID和线程ID共享一个ID池。获取id:GetCurrentProcessId,GetCurrentThreadId,GetProcessId,GetThreadId,GetProcessIdOfThread.一旦使用CloseHandle,id就可能会改变,当子进程开始执行代码之前的那一刻,windows就已经认为不存在任何父子关系了。 进程--终止进程和子进程 4.3 有以下4种方式:     1.主线程的返回退出(强烈推荐)     2.使用函数ExitProcess(要避免这种方式)     3.使用函数TerminateProcess( 要避免这种方式 )     4.进程中的所有线程终止运行(几乎不会发生) 4.3.1  主线程的返回退出     应保证只有在主线程的入口点函数返回之后,进程才会终止,这样最好原因:     1. C++代码的析构函数能够被正确执行     2. 系统会正确的释放线程堆栈使用的内存     3. 系统会将进程的退出代码设置为进入点函数的返回值     4. 进程的内核对象会减1 4.3.2  ExitProcess函数 当主线程的入口点函数(Winmain。。。)返回时,会返回到C\C++运行库启动代码,后者将正确清理进程使用的全部C运行时资源。释放了C运行时资源后,C运行时启动代码将显式的调用ExitProcess,并将入口点函数返回值传给它。如果在入口点函数返回之前调用ExitProcess,会导致进程或线程直接终止C\C++运行库可能不能正确执行清理工作。例: #include #include usingnamespace std; class PPP { public: PPP(){ cout PPP p; ExitProcess(0); cout 如果用户使用普通用户账户登录系统,就使用标准权限来启动asInvoker         -->应用程序以主调应用程序一样的权限来启动

可将清单嵌入到可执行文件的资源中,或保存到可执行文件所在目录下,扩展名用.  manifest[注:不会立即被系统发现,有时需注销用户] 4.5.2 手动提升进程的权限 4.5.3当前权限上下文 4.5.4枚举运行进程 4.5.5 Process Information 示例程序


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有