进程创建过程详解 CreateProcess

1. 背景

在计算机中,进程是一个正在执行的程序实例。进程可以是操作系统自己运行的进程,也可以是由用户启动的进程,或者是由其他进程启动的子进程。在 Windows 操作系统中,进程的创建是通过函数 CreateProcess 实现的。

2. 函数介绍

CreateProcess 是一个 Windows API 函数,其原型为:

BOOL WINAPI CreateProcess(

_In_opt_ LPCTSTR lpApplicationName,

_Inout_opt_ LPTSTR lpCommandLine,

_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,

_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,

_In_ BOOL bInheritHandles,

_In_ DWORD dwCreationFlags,

_In_opt_ LPVOID lpEnvironment,

_In_opt_ LPCTSTR lpCurrentDirectory,

_In_ LPSTARTUPINFO lpStartupInfo,

_Out_ LPPROCESS_INFORMATION lpProcessInformation

);

它的参数说明如下:

lpApplicationName

指向一个 NULL 结尾的字符串,表示要启动的可执行文件的名称。如果该参数为 NULL,则使用 lpCommandLine 参数中的可执行文件名称。

lpCommandLine

指向一个 NULL 结尾的字符串,表示要传递给新进程的命令行参数。如果 lpApplicationName 参数为 NULL,则 lpCommandLine 中包含了完全的可执行文件路径和命令行参数。

lpProcessAttributes

用于指定新进程中进程对象的安全特性。如果该参数为 NULL,则新进程对象继承自父进程。

lpThreadAttributes

用于指定新进程中主线程的安全特性。如果该参数为 NULL,则主线程继承自父进程。

bInheritHandles

指示新进程是否应该从父进程继承句柄。如果该参数为 TRUE,则新进程继承父进程的句柄。

dwCreationFlags

指定创建进程的标志位。默认值为 0。可以使用以下标志:

- CREATE_NEW_CONSOLE: 新进程使用新的控制台窗口。

- CREATE_SUSPENDED: 新进程被挂起,直到它被 ResumeThread 恢复。

lpEnvironment

指定新进程的环境变量。如果该参数为 NULL,则使用父进程的环境变量。

lpCurrentDirectory

指定新进程的当前工作目录。如果该参数为 NULL,则使用父进程的当前工作目录。

lpStartupInfo

指定了进程的主窗口和标准输入、输出和错误输出的类型和句柄。可以为 NULL。

lpProcessInformation

指向一个 PROCESS_INFORMATION 结构,其中包含有关新进程的信息。

3. 进程创建过程

在使用 CreateProcess 创建新进程时,以下步骤将按顺序发生:

1. 创建一个 PROCESS_INFORMATION 结构体,用于存储新进程的信息。

2. 调用 CreateProcess 函数,创建新进程。

3. 如果创建过程成功,则 CreateProcess 会返回一个非零值。此时,可以获取新进程的句柄、主线程的句柄和进程 ID。

4. 如果创建过程没有成功,则可以使用 GetLastError 函数获取错误代码。

4. 示例代码

下面是一个使用 CreateProcess 函数启动一个可执行文件的示例代码:

#include

#include

int _tmain(int argc, TCHAR *argv[]) {

STARTUPINFO si;

PROCESS_INFORMATION pi;

BOOL bSuccess = FALSE;

DWORD dwFlags = 0;

ZeroMemory(&si, sizeof(STARTUPINFO));

si.cb = sizeof(STARTUPINFO);

ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));

if (argc < 2) {

_tprintf(_T("Usage: %s command_line\n"), argv[0]);

return 1;

}

bSuccess = CreateProcess(

NULL,

(LPWSTR)argv[1],

NULL,

NULL,

FALSE,

dwFlags,

NULL,

NULL,

&si,

&pi

);

if (!bSuccess) {

_tprintf(_T("CreateProcess failed. Error code: %d\n"), GetLastError());

return 1;

}

_tprintf(_T("Process created successfully. Process ID: %d\n"), pi.dwProcessId);

CloseHandle(pi.hProcess);

CloseHandle(pi.hThread);

return 0;

}

5. 总结

CreateProcess 函数是一个非常常用的 Windows API 函数,用于创建新进程。使用它时需要传递一些参数,其中包括要启动的可执行文件名称、命令行参数以及进程和线程安全等级等。在创建成功后,可以获取新进程的句柄、主线程的句柄和进程 ID。在开发过程中,需要注意新进程的安全性和资源使用问题。 如果你喜欢我们三七知识分享网站的文章, 欢迎您分享或收藏知识分享网站文章 欢迎您到我们的网站逛逛喔!https://www.37seo.cn/

点赞(33) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部