在网上看到一个“自杀弹”互斥体去终止自身的运行的程序,如何使用GetExitCodeProcess() ,GetProcessTimes()去修改这个程序,在网上查了很多资料,也查了官方文档还是不明白GetExitCodeProcess() ,GetProcessTimes()这两个参数如何使用,非常感谢路过的大哥帮帮忙给点意见,非常感谢。程序如下:子进程结束自己的父进程
// procterm项目
# include <windows.h>
# include <iostream>
# include <stdio.h>
#include <iostream.h>
static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide" ;// 创建当前进程的克隆进程的简单方法
void StartClone()
{
// 提取当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行,指明它是一个EXE文件和子进程
TCHAR szCmdLine[MAX_PATH] ;
sprintf(szCmdLine, "\"%s\"child" , szFilename) ; // 子进程的启动信息结构
STARTUPINFO si;
ZeroMemory(reinterpret_cast <void*>(&si),sizeof(si)) ;
si.cb = sizeof(si) ; // 应当是此结构的大小 // 返回的用于子进程的进程信息
PROCESS_INFORMATION pi; // 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程
BOOL bCreateOK=CreateProcess(
szFilename, // 产生的应用程序的名称 (本EXE文件)
szCmdLine, // 告诉我们这是一个子进程的标志
NULL, // 用于进程的缺省的安全性
NULL, // 用于线程的缺省安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, // 创建新窗口
NULL, // 新环境
NULL, // 当前目录
&si, // 启动信息结构
&pi ) ; // 返回的进程信息 // 释放指向子进程的引用
if (bCreateOK)
{
CloseHandle(pi.hProcess) ;
CloseHandle(pi.hThread) ;
}
}void Parent()
{
// 创建互斥体
HANDLE hMutexSuicide= CreateMutex(
NULL, // 缺省的安全性
TRUE, // 最初拥有的
g_szMutexName) ; // 为其命名
if (hMutexSuicide != NULL)
{
// 创建子进程
cout << "Creating the child process." << endl;
StartClone() ; // 暂停
Sleep(5000) ; // 指令子进程自己终止
cout << "Telling the child process to quit. "<< endl;
ReleaseMutex(hMutexSuicide) ; // 消除句柄
CloseHandle(hMutexSuicide) ;
}
}void Child()
{
// 打开互斥体
HANDLE hMutexSuicide = OpenMutex(
SYNCHRONIZE, // 打开用于同步
FALSE, // 不需要向下传递
g_szMutexName) ; // 名称
if (hMutexSuicide != NULL)
{
// 报告我们正在等待指令
cout <<"Child waiting for suicide instructions. " << endl;
WaitForSingleObject(hMutexSuicide, INFINITE) ; // 准备好终止,清除句柄
cout << "Child quiting." << endl;
CloseHandle(hMutexSuicide) ;
Sleep(5000) ;
}
}int main(int argc, char* argv[] )
{
// 决定其行为是父进程还是子进程
if (argc > 1 && strcmp(argv[1] , "child" )== 0)
{
Child() ;
}
else
{
Parent() ;
}
return 0;
}
// procterm项目
# include <windows.h>
# include <iostream>
# include <stdio.h>
#include <iostream.h>
static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide" ;// 创建当前进程的克隆进程的简单方法
void StartClone()
{
// 提取当前可执行文件的文件名
TCHAR szFilename[MAX_PATH] ;
GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行,指明它是一个EXE文件和子进程
TCHAR szCmdLine[MAX_PATH] ;
sprintf(szCmdLine, "\"%s\"child" , szFilename) ; // 子进程的启动信息结构
STARTUPINFO si;
ZeroMemory(reinterpret_cast <void*>(&si),sizeof(si)) ;
si.cb = sizeof(si) ; // 应当是此结构的大小 // 返回的用于子进程的进程信息
PROCESS_INFORMATION pi; // 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程
BOOL bCreateOK=CreateProcess(
szFilename, // 产生的应用程序的名称 (本EXE文件)
szCmdLine, // 告诉我们这是一个子进程的标志
NULL, // 用于进程的缺省的安全性
NULL, // 用于线程的缺省安全性
FALSE, // 不继承句柄
CREATE_NEW_CONSOLE, // 创建新窗口
NULL, // 新环境
NULL, // 当前目录
&si, // 启动信息结构
&pi ) ; // 返回的进程信息 // 释放指向子进程的引用
if (bCreateOK)
{
CloseHandle(pi.hProcess) ;
CloseHandle(pi.hThread) ;
}
}void Parent()
{
// 创建互斥体
HANDLE hMutexSuicide= CreateMutex(
NULL, // 缺省的安全性
TRUE, // 最初拥有的
g_szMutexName) ; // 为其命名
if (hMutexSuicide != NULL)
{
// 创建子进程
cout << "Creating the child process." << endl;
StartClone() ; // 暂停
Sleep(5000) ; // 指令子进程自己终止
cout << "Telling the child process to quit. "<< endl;
ReleaseMutex(hMutexSuicide) ; // 消除句柄
CloseHandle(hMutexSuicide) ;
}
}void Child()
{
// 打开互斥体
HANDLE hMutexSuicide = OpenMutex(
SYNCHRONIZE, // 打开用于同步
FALSE, // 不需要向下传递
g_szMutexName) ; // 名称
if (hMutexSuicide != NULL)
{
// 报告我们正在等待指令
cout <<"Child waiting for suicide instructions. " << endl;
WaitForSingleObject(hMutexSuicide, INFINITE) ; // 准备好终止,清除句柄
cout << "Child quiting." << endl;
CloseHandle(hMutexSuicide) ;
Sleep(5000) ;
}
}int main(int argc, char* argv[] )
{
// 决定其行为是父进程还是子进程
if (argc > 1 && strcmp(argv[1] , "child" )== 0)
{
Child() ;
}
else
{
Parent() ;
}
return 0;
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货