CreateProcess 函数.docVIP

  • 13
  • 0
  • 约1.18万字
  • 约 16页
  • 2016-10-22 发布于河南
  • 举报
CreateProcess 函数

CreateProcess 函数 CreateProcess 函数 CreateProcess 函数可用来创建一个进程 BOOL CreateProcess( PCTSTR pszApplicationName, // 指定新进程要使用的可执行文件名。 PTSTR pszCommandLine, // 要传给新进程的命令行字符串。 PSECURITY_ATTRIBUTES psaProcess, // 创建一个进程内核对象 PSECURITY_ATTRIBUTES psaThread, // 创建一个线程内核对象 BOOL bInheritHandles, // 为子进程继承父进程可访问的一些内核权限 DWORD fdwCreate, // 影响新进程创建方式的标志 PVOID pvEnvironment, // 向的是一块内存,包含新进程要使用环境字符串。 PCTSTR pszCurDir, //允许父进程和子进程再相同的工作目录 PSTARTUPINFO psiStartInfo, PPROCESS_INFORMATION ppiProcInfo ); 1.参数 pszApplicationName 传入的是一个非常量字符串地址。CreateProcess实际上会修改我们传给 它的命令行字符串。在CreateProcess返回之前,它会将这个字符串还原为原本形式。 命令行字符串包含文件映像的只读部分,会引起访问违规。 在C/C++编译器把NOTEPAD字符串放在只读内存: STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; CreateProcess(NULL, TEXT(NOTEPAD), NULL, NULL, FALSE, 0, NULL, NULL, si, pi); CreateProcess 在试图修改字符串,会引起一个访问违规..所以,我们在调用 CreateProcess 之前,把常量字符串复制到一个临时缓冲区,如下所示: STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; TCHAR szCommandLine[] = TEXT(NOTEPAD); CreateProcess(NULL, szCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, si, pi); 另外,在Windows Vista 中调用 CreateProcess 函数ANSI版本,不会发生访问违规的。 2.使用 pszCommandLine 参数是用来指定一个完整的命令行,供 CreateProcess用于创建新 进程。当CreateProcess解析pszCommandLine,字符串时,会检查字符串中第一个标记。 如果可执行文件的名称没有扩展名,就会默认是.exe扩展名。CreateProcess 会按照以下顺序搜索 可执行文件。 (1)主调进程.exe文件所在的目录 (2)主调进程的当前目录。 (3)Windows系统目录,即GetSystemDirectory返回的System32子文件件。 (4)Windows目录。 (5)PATH环境变量中列出的目录。 文件名如果包含一个完整路径.. 那么系统会利用完整路径来查找可执行文件,而不会搜索目录。 如果系统找到了可执行文件,就创建一个新进程,将可执行文件代码和数据映射到新进程地址空间。 将可执行文件名之后的第一个实参地址传给(w)WinMain的pszCmdLine参数。 只要pszApplicationName参数为NULL(99%以上的情况是如此)就会发生上述情况。 也可以不再 pszApplicationName 中传递NULL,而是传递一个字符串地址,并在字符串中包含 想要运行的可执行文件名称。 这情况下,必须指定文件扩展名,系统不会自动假定文件名有.exe扩展名。 CreateProcess文件位于当前目录,除非文件名前有一个路径。 没有在当前目录中找到文件,CreateProcess不会再其他任何目录查找文件--调用会以失败告终。 如果在 pszApplicationName 参数中指定文件名,CreateProcess也会将 szCommandLine 参数中 的内容作为新进程的命令行传给它。 如下面这样

文档评论(0)

1亿VIP精品文档

相关文档