以挂起的形式创建进程

来源:互联网 发布:mindnode有windows版么 编辑:程序博客网 时间:2024/05/20 21:23

原文转自:http://www.cnblogs.com/zheh/p/5223697.html

程序工能说明:通过process.exe创建出两个进程(run.exe ie.exe),实现通过run.exe控制ie。将run.cpp编译后将生成的exe路径复制process.cpp的相应位置,编译process.cpp并运行完成整个Demo测试,观察运行的结果。(一个cpp一个项目不要写到一个项目内)

工具: vs 2008

*字符集:使用多字节字符集(不用会报错)

 

复制代码
// process.cpp #include "stdafx.h"#include <Windows.h>int _tmain(int argc, _TCHAR* argv[]){    char szBuffer[256] = {0};    char szHandle[8] = {0};        SECURITY_ATTRIBUTES ie_sa_p = {0};//    ie_sa_p.nLength  = sizeof(ie_sa_p);    ie_sa_p.lpSecurityDescriptor = NULL;    ie_sa_p.bInheritHandle = TRUE;//默认为flase 设置为true则句柄表可继承    SECURITY_ATTRIBUTES ie_sa_t = {0};    ie_sa_t.nLength  = sizeof(ie_sa_t);    ie_sa_t.lpSecurityDescriptor = NULL;    ie_sa_t.bInheritHandle = TRUE;    STARTUPINFO ie_si = {0};    PROCESS_INFORMATION ie_pi;    ie_si.cb = sizeof(ie_si);    TCHAR szCmdLine[] = TEXT("C:\\Program Files (x86)\\Internet Explorer\\iexplore.exe www.baidu.com");    //第三与第四个属性为安全属性,可以简单的理解为未设置为true时当前创建线程、进程的内核句柄表不可被继承    //打开IE    CreateProcess(        NULL,        szCmdLine,        &ie_sa_p,//进程安全属性 进程表可被继承        &ie_sa_t,//线程安全属性 线程表可被继承        FALSE,//为true时代表此进程可被继承        CREATE_NEW_CONSOLE,        NULL,        NULL,        &ie_si,        &ie_pi);        sprintf(szHandle, "%x %x", ie_pi.hProcess, ie_pi.hThread);    sprintf(szBuffer, TEXT("run.exe %s"), szHandle);//拼接cmdLine 将进程和线程的参数拼接到run.exe    STARTUPINFO si = {0};    PROCESS_INFORMATION pi = {0};    si.cb = sizeof(si);    //创建进程run.exe控制之前创建的ie    CreateProcess(        NULL,        szBuffer,        NULL,        NULL,        TRUE,        CREATE_NEW_CONSOLE,        NULL,        NULL,        &si,        &pi);    return 0;}
复制代码

 

复制代码
// run.cpp#include "stdafx.h"#include <Windows.h>int _tmain(int argc, _TCHAR* argv[]){    DWORD dwProcessHandle = -1;    DWORD dwThreadHandle = -1;    char szBuffer[256] = {0};    //接收命令行参数    memcpy(szBuffer, argv[2], 8);    sscanf(szBuffer, "%x", &dwThreadHandle);    memcpy(szBuffer, argv[1], 8);    sscanf(szBuffer, "%x", &dwProcessHandle);    printf("获取IE主线程句柄 %0x\n", dwThreadHandle);    printf("获取IE进程句柄 %0x\n", dwProcessHandle);    Sleep(5000);    //挂起主线程    ::SuspendThread((HANDLE)dwThreadHandle);    printf("挂起主线程 %x\n", dwThreadHandle);    Sleep(10000);    //恢复主线程    ::ResumeThread((HANDLE)dwThreadHandle);    printf("恢复主线程\n");    Sleep(5000);    //关闭ID进程    ::TerminateProcess((HANDLE)dwProcessHandle, 1);    ::WaitForSingleObject((HANDLE)dwProcessHandle, INFINITE);    printf("ID进程已经关闭。。。。\n");    Sleep(1000);    return 0;}

原创粉丝点击