zoukankan      html  css  js  c++  java
  • CreateProcess中的部分参数理解

    函数原型,这里写Unicode版本

    WINBASEAPI
    BOOL
    WINAPI
    CreateProcessW(
    _In_opt_ LPCWSTR lpApplicationName, //可执行文件名字
    _Inout_opt_ LPWSTR lpCommandLine, //命令行字符串
    _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, // 进程对象安全属性
    _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, // 线程对象安全属性
    _In_ BOOL bInheritHandles,
    _In_ DWORD dwCreationFlags, //标识
    _In_opt_ LPVOID lpEnvironment, //新进程的环境变量字符内存
    _In_opt_ LPCWSTR lpCurrentDirectory, //子进程当前驱动器目录路径
    _In_ LPSTARTUPINFOW lpStartupInfo,
    _Out_ LPPROCESS_INFORMATION lpProcessInformation
    );


    第一参数:99%传NULL,如果非要传,不允许省略.exe
    VOID CreateProcessSample()
    {
    WCHAR lpPath[] = L"WORDPAD ReadMe.txt"; //特殊启动方式
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    BOOL bStatus = CreateProcess(L"C:\Windows\System32\notepad.exe", lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }


    第二参数,类型是LPWSTR 说明我们要创建一个非常量字符串

    WCHAR lpPath[] = L"notepad ReadMe.txt";
    可以有几个命令行,而且第一部分扩展名可以省略


    这是Unicode版本
    VOID CreateProcessSample1()
    {
    WCHAR *lpPath = L"notepad.exe"; // 错误
    WCHAR lpPath[] = L"notepad.exe"; // 正确


    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;


    BOOL bStatus = CreateProcessW(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); // 正确
    BOOL bStatus = CreateProcessW(NULL, L"notepad.exe", NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); // 错误


    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }


    如果是多字节版本,上述问题都不存在

    VOID CreateProcessSample1()
    {
    CHAR *lpPath = "notepad.exe";
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    BOOL bStatus = CreateProcess(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, "CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }

    第六参数,dwCreationFlags 标识

    #define DEBUG_PROCESS 0x00000001 父进程可以调试子进程,孙进程
    #define DEBUG_ONLY_THIS_PROCESS 0x00000002 父进程可以调试子进程,不可以调试孙进程
    #define CREATE_SUSPENDED 0x00000004 主线程被挂起
    #define DETACHED_PROCESS 0x00000008 阻塞对于父进程的访问
    #define CREATE_NEW_CONSOLE 0x00000010 新进程创建新的窗口

    // 创建挂起进程
    VOID CreateProcessSample2()
    {
    WCHAR lpPath[] = L"notepad.exe";
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi;
    // 步骤1:使用CREATE_SUSPENDED创建挂起进程
    BOOL bStatus = CreateProcess(NULL, lpPath, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }

    // 步骤2:在这里对子进程进行数据处理和模块注入等操作
    // ……
    // 步骤3:恢复执行
    ResumeThread(pi.hThread);
    }


    创建隐藏进程
    VOID CreateProcessSample4()
    {
    WCHAR lpPath[] = L"notepad.exe";

    STARTUPINFO si = { sizeof(si) };
    // 设置STARTF_USESHOWWINDOW标记,使得STARTUPINFO结构的wShowWindow字段有效
    si.dwFlags |= STARTF_USESHOWWINDOW;
    // 设置窗口的显示方式,SW_HIDE表示隐藏方式
    si.wShowWindow = SW_HIDE;

    PROCESS_INFORMATION pi;
    BOOL bStatus = CreateProcess(NULL, lpPath, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    if (bStatus == FALSE)
    {
    MessageBox(0, L"CreateProcess error, notepad.exe", 0, 0);
    return;
    }
    }

    其他参数基本传NULL就可以了,必须用的时候可以深入了解一下。

  • 相关阅读:
    CentOS 6.3下安装腾达USB无线网卡遇到的问题及解决方法
    验证resneXt,densenet,mobilenet和SENet的特色结构
    比较语义分割的几种结构:FCN,UNET,SegNet,PSPNet和Deeplab
    比较 VGG, resnet和inception的图像分类效果
    强化学习基础
    深度学习的知识点
    卷积神经网络CNN
    信息论的知识点
    理论机器学习
    计算理论基础
  • 原文地址:https://www.cnblogs.com/kekoukele987/p/7538039.html
Copyright © 2011-2022 走看看