58.创建线程CreateProcess、STARTUPINFO、PROCESS_INFORMATION、ExitProcess、TerminateProcess、GetCommandLine、Get

STARTUPINFO用于指定新进程的主窗口特性的一个结构

typedef struct _STARTUPINFOW {
    DWORD   cb; //startupinfo结构体大小
    LPWSTR  lpReserved;
    LPWSTR  lpDesktop;
    LPWSTR  lpTitle;
    DWORD   dwX;
    DWORD   dwY;
    DWORD   dwXSize;
    DWORD   dwYSize;
    DWORD   dwXCountChars;
    DWORD   dwYCountChars;
    DWORD   dwFillAttribute;
    DWORD   dwFlags;
    WORD    wShowWindow;
    WORD    cbReserved2;
    LPBYTE  lpReserved2;
    HANDLE  hStdInput;
    HANDLE  hStdOutput;
    HANDLE  hStdError;
} STARTUPINFOW, *LPSTARTUPINFOW;
#ifdef UNICODE
typedef STARTUPINFOW STARTUPINFO;
typedef LPSTARTUPINFOW LPSTARTUPINFO;
#else
typedef STARTUPINFOA STARTUPINFO;
typedef LPSTARTUPINFOA LPSTARTUPINFO;
#endif // UNICODE

PROCESS_INFOMATION

typedef struct _PROCESS_INFORMATION {
    HANDLE hProcess; //进程句柄
    HANDLE hThread; //线程句柄
    DWORD dwProcessId; //进程号
    DWORD dwThreadId; //线程号
} PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;

CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。

WINBASEAPI
BOOL
WINAPI
CreateProcess(
    __in_opt    LPCSTR lpApplicationName, //新建进程名
    __inout_opt LPSTR lpCommandLine, //命令行参数,记得在命令行参数前面加个空格
    __in_opt    LPSECURITY_ATTRIBUTES lpProcessAttributes, //进程安全属性,默认使用NULL
    __in_opt    LPSECURITY_ATTRIBUTES lpThreadAttributes, //参数决定的是线程是否被继承.通常置为NULL,默认为NULL
    __in        BOOL bInheritHandles, //是否继承
    __in        DWORD dwCreationFlags, //指定附加的、用来控制优先类和进程的创建的标志。
    __in_opt    LPVOID lpEnvironment, //指向一个新进程的环境块。如果此参数为空,新进程使用调用进程的环境。
    __in_opt    LPCSTR lpCurrentDirectory, //指向一个以NULL结尾的字符串,这个字符串用来指定子进程的工作路径。这个字符串必须是一个包含驱动器名的绝对路径。如果这个参数为空,新进程将使用与调用进程相同的驱动器和目录。这个选项是一个需要启动应用程序并指定它们的驱动器和工作目录的外壳程序的主要条件
    __in        LPSTARTUPINFO lpStartupInfo, //STARTUPINFO信息
    __out       LPPROCESS_INFORMATION lpProcessInformation //PROCESS_INFORMATION信息
    );

//
// Process dwCreationFlag values
//

#define DEBUG_PROCESS                     0x00000001 //如果这个标志被设置,调用进程将被当做一个调试程序,并且新进程会被当做被调试的进程。系统把被调试程序发生的所有调试事件通知给调试器
#define DEBUG_ONLY_THIS_PROCESS           0x00000002 //如果此标志没有被设置且调用进程正在被调试,新进程将成为调试调用进程的调试器的另一个调试对象。如果调用进程没有被调试,有关调试的行为就不会产生
#define CREATE_SUSPENDED                  0x00000004//新进程的主线程会以暂停的状态被创建,直到调用ResumeThread函数被调用时才运行
#define DETACHED_PROCESS                  0x00000008//对于控制台进程,新进程没有访问父进程控制台的权限。新进程可以通过AllocConsole函数自己创建一个新的控制台。这个标志不可以与CREATE_NEW_CONSOLE标志一起使用

#define CREATE_NEW_CONSOLE                0x00000010 //新的进程将使用一个新的控制台,而不是继承父进程的控制台。这个标志不能与DETACHED_PROCESS标志一起使用
#define NORMAL_PRIORITY_CLASS             0x00000020
#define IDLE_PRIORITY_CLASS               0x00000040
#define HIGH_PRIORITY_CLASS               0x00000080

#define REALTIME_PRIORITY_CLASS           0x00000100
#define CREATE_NEW_PROCESS_GROUP          0x00000200 //新进程将是一个进程树的根进程。进程树中的全部进程都是根进程的子进程。新进程树的用户标识符与这个进程的标识符是相同的,由lpProcessInformation参数返回。进程树经常使用GenerateConsoleCtrlEvent函数允许发送CTRL+C或CTRL+BREAK信号到一组控制台进程
#define CREATE_UNICODE_ENVIRONMENT        0x00000400//如果被设置,由lpEnvironment参数指定的环境块使用Unicode字符,如果为空,环境块使用ANSI字符
#define CREATE_SEPARATE_WOW_VDM           0x00000800//如果被设置,新进程将会在一个私有的虚拟DOS机(VDM)中运行。另外,默认情况下所有的16位Windows应用程序都会在同一个共享的VDM中以线程的方式运行。单独运行一个16位程序的优点是一个应用程序的崩溃只会结束这一个VDM的运行;其他那些在不同VDM中运行的程序会继续正常的运行。同样的,在不同VDM中运行的16位Windows应用程序拥有不同的输入队列,这意味着如果一个程序暂时失去响应,在独立的VDM中的应用程序能够继续获得输入。

#define CREATE_SHARED_WOW_VDM             0x00001000 //如果WIN.INI中的Windows段的DefaultSeparateVDM选项被设置为真,这个标识使得CreateProcess函数越过这个选项并在共享的虚拟DOS机中运行新进程
#define CREATE_FORCEDOS                   0x00002000
#define BELOW_NORMAL_PRIORITY_CLASS       0x00004000
#define ABOVE_NORMAL_PRIORITY_CLASS       0x00008000

#define INHERIT_PARENT_AFFINITY           0x00010000
#define INHERIT_CALLER_PRIORITY           0x00020000    // Deprecated
#define CREATE_PROTECTED_PROCESS          0x00040000
#define EXTENDED_STARTUPINFO_PRESENT      0x00080000

#define PROCESS_MODE_BACKGROUND_BEGIN     0x00100000
#define PROCESS_MODE_BACKGROUND_END       0x00200000

#define CREATE_BREAKAWAY_FROM_JOB         0x01000000
#define CREATE_PRESERVE_CODE_AUTHZ_LEVEL  0x02000000
#define CREATE_DEFAULT_ERROR_MODE         0x04000000 //的进程不继承调用进程的错误模式。CreateProcess函数赋予新进程当前的默认错误模式作为替代。应用程序可以调用SetErrorMode函数设置当前的默认错误模式
#define CREATE_NO_WINDOW                  0x08000000//系统不为新进程创建CUI窗口,使用该标志可以创建不含窗口的CUI程序

#define PROFILE_USER                      0x10000000
#define PROFILE_KERNEL                    0x20000000
#define PROFILE_SERVER                    0x40000000
#define CREATE_IGNORE_SYSTEM_DEFAULT      0x80000000

ExitProcess

WINBASEAPI
DECLSPEC_NORETURN
VOID
WINAPI
ExitProcess(
__in UINT uExitCode //该进程和所有线程的退出代码
);

GetProcessCode 获得进行退出码的函数

WINBASEAPI
BOOL
WINAPI
GetExitCodeProcess(
__in  HANDLE hProcess, //进程句柄
__out LPDWORD lpExitCode //进程退出码
);

TerminateProcess结束指定进程

WINBASEAPI
BOOL
WINAPI
TerminateProcess(
__in HANDLE hProcess, //进行句柄
__in UINT uExitCode  //退出代码
    );

GetCommandLine获得命令行参数

WINBASEAPI
__out
LPSTR
WINAPI
GetCommandLine(VOID);

返回值为字符串地址

GetCurrentProcessId获取当前进程一个唯一的标识符
GetCurrentProcess获得当前进程 的句柄

WINBASEAPI
__out
HANDLE
WINAPI
GetCurrentProcess(VOID);

WINBASEAPI
DWORD
WINAPI
GetCurrentProcessId(VOID);

你可能感兴趣的:(win32,API)