首页 > 系统相关 >create Process,进程

create Process,进程

时间:2023-11-29 16:46:36浏览次数:36  
标签:exe Process create SW LPCTSTR ShellExecute 进程 NULL

资源分配的基本单位,也是独立运行的基本单位是进程。

、进程由两部分构成,一部分指一个内核对象,操作系统用它来管理进程,也是系统保存进程统计信息的地方。另一部分外核,由地址空间构成,包括文本区、数据区、堆栈区。文本区存储处理器执行的代码,数据区存储变量和进程执行期间使用的的动态内存分配,堆栈区存储活动过程中调用的指令和本地变量。

三、进程的三种状态

进程在运行过程中不断改变其运行状态,通常情况下,一个运行进程必须具有以下三种状态:

  1. 就绪(Ready):当进程分配到除了CPU以外的所有必要资源,只要处理器分配资源就能立马执行时的状态。
  2. 运行(Running):当进程已经获得处理器的资源分配,进程正在运行的状态。
  3. 阻塞(Blockjer):正在执行的进程,由于等待某个事件发生而无法执行时,便放弃资源分配而处于阻塞状态,例如等待I/O完成,申请缓冲区不能满足,等待信号等等。

四、进程的创建

Windows平台创建进程的常用方法:

  1. Winexec();
  2. ShellExcute();
  3. CreateProcess()。

4.1 Winexec

4.1.1 函数原型

UINT WinExec( 
LPCSTR lpCmdLine,  // 路径名(可以带cmd命令行)
UINT uCmdShow      // 显示状态);

如果 lpCmdLine 中可执行文件的名称不包含目录路径,则系统将按以下顺序搜索可执行文件的路径:

  1. 加载应用程序的目录;
  2. 当前目录;
  3. Windows系统目录:GetSystemDirectory()接口获取此目录的路径;
  4. Windows目录:GetWindowsDirectory()接口获取此目录的路径;
  5. PATH环境变量中列出的目录;

4.1.2 示例代码

  1. 打开进程:
UINT nRet = ::WinExec(
    "C:\\Users\\shadow\\Desktop\\depends.exe",  // 进程路径名
    SW_SHOW     // 显示状态
);

Winexec()接口还可以启动 cmd,包括带参参数启动,比如: (1)/k 并显示控制台窗口; (2)/c 执行命令并关闭控制台窗口。

  1. 打开注册表:
UINT nRet = ::WinExec("cmd.exe /c regedit", SW_SHOW);
  1. 修改uac权限:
UINT nRet = ::WinExec("cmd /k %windir%\\System32\\reg.exe ADD HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System /v EnableLUA /t REG_DWORD /d 0 /f",SW_SHOW);

4.2 ShellExcute

4.2.1 函数原型

HINSTANCE ShellExecute(
      HWND hwnd,            // 指定窗口的句柄
      LPCTSTR lpOperation,  // 指定要进行的操作
      LPCTSTR lpFile,       // 文件路径
      LPCTSTR lpParameters, // 若lpFile是可执行文件,则此参数指定命令行参数
      LPCTSTR lpDirectory,  // 指定默认目录
      INT nShowCmd          // 指定程序窗口初始化显示方式
   );

4.2.2 示例代码

/* 打开进程 */
ShellExecute(NULL, "open","C:\\Users\\shadow\\Desktop\\depends.exe",NULL, NULL,SW_SHOWNORMAL);

/* 打开网址 */
ShellExecute(NULL, "open", "www.baidu.com/s?wd=\"拼音\"", NULL, NULL,SW_SHOW);

/* 浏览文件夹 */
ShellExecute(NULL, "explore", "D:\\360", NULL, NULL, SW_SHOWNORMAL);

/* 打印指定文件 */
ShellExecute(NULL, "print", "C:\\Users\\shadow\\Desktop\\t.txt", NULL, NULL, SW_HIDE);

/* 自动搜索exe路径 */
ShellExecute(NULL, "open", "cmd.exe", "/k dir", NULL, SW_SHOWNORMAL);

4.3 CreateProcess

4.3.1 函数原型

BOOL CreateProcess
(
LPCTSTR lpApplicationName,                 // 应用程序名称(路径)
LPTSTR lpCommandLine,                      // 命令行字符串
LPSECURITY_ATTRIBUTES lpProcessAttributes,// 进程安全性
LPSECURITY_ATTRIBUTES lpThreadAttributes,  // 线程安全性
BOOL bInheritHandles,                      // 是否继承父进程属性
DWORD dwCreationFlags,                     // 创建标志符,比如CREATE_NEW_CONSOLE表示创建一个新的控制台,具体请查阅MSDN
LPVOID lpEnvironment,                      // 指向新的环境块的指针,指向一个新进程的环境块,如果该参数为空,新进程使用调用进程环境
LPCTSTR lpCurrentDirectory,                // 指向一个以NULL结尾的字符串,该字符串用来指定子进程的工作路径。
LPSTARTUPINFO lpStartupInfo,               // 传递给新进程的信息
LPPROCESS_INFORMATION lpProcessInformation // 新进程返回的信息
);

4.3.2 示例代码

void CProcessDlg::OnBnClickedButton() {
    STARTUPINFO si = { 0 };
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi = { 0 };

    BOOL bRet = ::CreateProcess(
        "C:\\Users\\shadow\\Desktop\\depends.exe",
        NULL, //命令行参数
        NULL,
        NULL,
        FALSE,
        0,    //没有别的需求,创建标志填0
        NULL, //环境块
        NULL, //当前目录
        &si,  //启动进程一些配置
        &pi
    );

    if (!bRet) {
        AfxMessageBox(_T("Create Process FAIL!"));
    }
}

五、进程的退出

    1. ExitProcess(0);   执行后直接退出进程,后边代码将无法执行;
    2. TerminateProcess (不推荐使用,因为目标进程没有机会清理资源);
    3. 进程中的所有线程自行终止运行(这种情况几乎从未发生);
 

 

标签:exe,Process,create,SW,LPCTSTR,ShellExecute,进程,NULL
From: https://www.cnblogs.com/judyks/p/17865225.html

相关文章

  • Linux 进程管理
    在Linux系统中,进程是正在执行的程序的实例。进程管理是操作系统的核心功能之一,它允许用户查看、创建、终止和管理系统中运行的进程。以下是一些常见的Linux进程管理操作:1.查看正在运行的进程:2.ps命令用于显示当前运行的进程的快照。$psaux3.top命令提供一个动态实时的进程监......
  • Python使用多进程及代理ip爬取小说
    前言在爬虫的过程中,为了提高爬取速度,我们可以采用多进程、多线程、协程等方式。本文将介绍Python使用多进程进行爬取的方法,并结合代理IP爬取小说为例子,帮助读者了解如何使用Python多进程和代理IP来进行爬取,以提高爬取效率和规避反爬机制。一、使用多进程爬取小说多进程是一种并发编......
  • Linux进程管理
    学习笔记:Linux进程管理引言在计算机科学领域,操作系统是一个核心概念,而进程管理是操作系统的一个重要组成部分。Linux作为一个开源、强大的操作系统,其进程管理机制为用户提供了丰富的功能和灵活性。本文将深入研究Linux中的进程管理,包括进程的创建、调度、通信和终止等方面的知识......
  • Linux进程管理
    每个用户均可同时运行多个程序。为了区分每一个运行的程序,Linux给每个进程都做了标识,称为进程号(processID),每个进程的进程号是唯一的。Linux给每个进程都打上了运行者的标志,用户可以控制自己的进程:给自己的进程分配不同的优先级,也可以随时终止自己的进程。进程从执行它的用户......
  • SpringBoot JPA实践之EntityManage查询返回自定义DTO entityManager.createNativeQuer
    SpringBootJPA实践之EntityManage查询返回自定义DTOentityManager.createNativeQuery(sql)  在很多时候我更喜欢随意组合查询出来返回一个DTO对象的实现,JPA提供的多数查询均以返回Entity居多,它提供的EntityManager对象可以实现将SQL语句查询的结果转换为自定义DTO对象(这与......
  • Linux、进程优先级
    Linux、进程优先级在Linux系统中,每个进程都有一个优先级,该优先级决定了进程在系统中使用CPU资源的权重。进程的优先级通常是动态调整的,取决于多个因素。以下是一些与Linux进程优先级相关的关键概念:1. **Nice值:** 进程的Nice值是一个表示进程优先级的数值。Nice值的范围通常在-20......
  • linux查看进程的基本方法
    要在Linux中查看进程,可以使用以下基本方法:1. **top命令:** 在终端中输入`top`,可以查看运行中的进程列表,以及它们的资源使用情况,如CPU和内存。2. **ps命令:** 使用`ps`命令可以列出当前用户的进程。例如,`ps aux`将显示所有用户的详细进程列表。3. **htop命令:** 这是top命令的......
  • 进程间通讯
    https://learn.microsoft.com/zh-cn/windows/win32/api/winuser/ns-winuser-copydatastructhttps://learn.microsoft.com/en-us/windows/win32/api/winuser/ns-winuser-copydatastructhttps://learn.microsoft.com/zh-cn/windows/win32/api/winuser/nf-winuser-findwindowahtt......
  • 进程管理
    1、了解了进程的概念、进程的状态,以及如何使用ps与top命令查看进程。2、了解了用户可以通过给予进程信号的方式对进程进行控制。3、了解了作业控制的基本原理。4、进程是一个其中运行着一个或多个线程的地址空间和这些线程所需要的系统资源。......
  • 你知道Spring中BeanFactoryPostProcessors是如何执行的吗?
    Spring中的BeanFactoryPostProcessor是在Spring容器实例化Bean之后,初始化之前执行的一个扩展机制。它允许开发者在Bean的实例化和初始化之前对BeanDefinition进行修改和处理,从而对Bean的创建过程进行干预和定制化。BeanFactoryPostProcessor接口定义了一个方法:postProcessBeanFac......