首页
社区
课程
招聘
[求助]用NSIS制作的安装包里面的uninst.exe,用CreateProcess(x,..\uninst.exe,...如何判断是否进程结束?
发表于: 2012-12-9 20:43 6079

[求助]用NSIS制作的安装包里面的uninst.exe,用CreateProcess(x,..\uninst.exe,...如何判断是否进程结束?

2012-12-9 20:43
6079
用NSIS向导制作了一个安装包(无任何文件)setup.exe,安装完毕会在安装位置产生一个uninst.exe(执行卸载功能的),用CreateProcess创建了这个卸载进程,
if(!CreateProcess(NULL,(LPTSTR)(LPCTSTR)m_exefilePath/*path*/,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi))
{
MessageBox(_T("创建进程失败!"));
return;
}
else
{
DWORD nID=GetProcessId(pi.hProcess);
WaitForSingleObject(pi.hProcess,INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);

发现得到的进程ID(PID)跟任务管理器中的不同,就其原因是这样的:执行uninst.exe,会产生uninst.exe进程(进程名就是uninst.exe),然而马上uninst.exe就不见了进而变成了一个叫Au_.exe的新进程,该进程才是真正实现卸载功能的。
现在情况如下:
我想等待卸载进程结束,结束之后我查看注册表或者文件(uninst.exe文件)来判断用户是真正执行了卸载操作还是中途取消卸载了,现在由于是等待的pi.hProcess-----uninst.exe,并非真正的卸载进程Au_.exe,所以是无法实现的。
耍了个小聪明:
当进程创建之后,首先调用GetProcessidFromName(_T("Au_.exe"))来得到进程ID,如果ID不为0说明uninst.exe结束后产生的Au_.exe进程存在,然后根据PID得到HANDLE,再调用WaitForSingleObject(HANDLE,X)来实现。
以上的办法不够理想,不晓得大侠们有什么好的思路没有。(ps:卸载程序不是自己编写的,完全不受自己控制的),上传了一个用nsis制作的最简单的安装包,方便大家交流。三克油先!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 778
活跃值: (208)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
2
注入DLL、写Shell代码,或者直接给uninst.exe动手术
2012-12-9 21:54
0
雪    币: 938
活跃值: (938)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
创建个全局Event就好了
2012-12-10 09:38
0
雪    币: 132
活跃值: (214)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
4
已经解决,感谢各位。
2012-12-10 15:51
0
游客
登录 | 注册 方可回帖
返回
//