反安装程序雏形

  1. #include   <Windows.h>     
  2. #include   <stdlib.h>    
  3. #include   <tchar.h>  
  4. #include    <iostream.h>   
  5. BOOL DeleteFolder(LPCTSTR lpszPath)
  6. {
  7.     SHFILEOPSTRUCT FileOp;
  8.     ZeroMemory((void*)&FileOp,sizeof(SHFILEOPSTRUCT));
  9.     FileOp.fFlags = FOF_NOCONFIRMATION;
  10.     FileOp.hNameMappings = NULL;
  11.     FileOp.hwnd = NULL;
  12.     FileOp.lpszProgressTitle = NULL;
  13.     FileOp.pFrom = lpszPath;
  14.     FileOp.pTo = NULL;
  15.     FileOp.wFunc = FO_DELETE;
  16.     return SHFileOperation(&FileOp) == 0;
  17. }
  18. int main()
  19. {
  20.     
  21.     if   (__argc   ==   1)   
  22.     {      
  23.     //   Original   EXE:   Spawn   clone   EXE   to   delete   this   EXE   
  24.         //   Copy   this   EXEcutable   image   into   the   user's   temp   directory
  25.         char del;
  26.         cout << "delete self or not?(y/n)/n";
  27.         cin >> del;
  28.         if(del == 'n')
  29.             return 0;
  30.         TCHAR   szPathOrig[_MAX_PATH],   szPathClone[_MAX_PATH];    
  31.         GetModuleFileName(NULL,   szPathOrig,   _MAX_PATH);    
  32.         GetTempPath(_MAX_PATH,   szPathClone);      
  33.         GetTempFileName(szPathClone,   __TEXT("Del"),   0,   szPathClone);       
  34.         CopyFile(szPathOrig,   szPathClone,   FALSE);         
  35.         //***注意了***:      
  36.         //   Open   the   clone   EXE   using   FILE_FLAG_DELETE_ON_CLOSE     
  37.         HANDLE   hfile   =   CreateFile(szPathClone,0,   FILE_SHARE_READ,   NULL,   OPEN_EXISTING,   FILE_FLAG_DELETE_ON_CLOSE,   NULL);       
  38.         //   Spawn   the   clone   EXE   passing   it   our   EXE's   process   handle   
  39.         //   and   the   full   path   name   to   the   Original   EXE   file.    
  40.         TCHAR   szCmdLine[512];    
  41.         HANDLE   hProcessOrig   =   OpenProcess(SYNCHRONIZE,   TRUE,   GetCurrentProcessId());      
  42.         wsprintf(szCmdLine,   __TEXT("%s   %d   /"%s/""),   szPathClone,   hProcessOrig,   szPathOrig);       
  43.         STARTUPINFO   si;   
  44.         ZeroMemory(&si,   sizeof(si));    
  45.         si.cb   =   sizeof(si);   
  46.         PROCESS_INFORMATION   pi;    
  47.         CreateProcess(NULL,szCmdLine,NULL,NULL,TRUE,0,NULL,NULL,&si,&pi);    
  48.         CloseHandle(hProcessOrig);    
  49.         CloseHandle(hfile);      
  50.         //   This   original   process   can   now   terminate.     
  51.     }   
  52.     else   
  53.     {      
  54.         //   Clone   EXE:   When   original   EXE   terminates,   delete   it
  55.         HANDLE   hProcessOrig   =   (HANDLE)   _ttoi(__targv[1]);     
  56.         WaitForSingleObject(hProcessOrig,   INFINITE);       
  57.         CloseHandle(hProcessOrig); 
  58.         char str[256];
  59.         memset(str,0,256);
  60.         strcpy(str,__targv[2]);
  61.         int len = strlen(str);
  62.         while(true)
  63.         {
  64.             if(str[len] == '//')
  65.             {
  66.                 str[len] = '/0';
  67.                 break;
  68.             }
  69.             str[len] = '/0';
  70.             len--;
  71.         }
  72.         DeleteFolder(str);
  73. //      DeleteFile(__targv[2]);  
  74.         // Delete the clone one
  75.         SHELLEXECUTEINFO sei;  
  76.        TCHAR szModule [MAX_PATH],szComspec[MAX_PATH],szParams [MAX_PATH];  
  77.        //获取文件路径名  
  78.        if((GetModuleFileName(0,szModule,MAX_PATH)!=0) &&  
  79.             (GetShortPathName(szModule,szModule,MAX_PATH)!=0) &&  
  80.                 (GetEnvironmentVariable("COMSPEC",szComspec,MAX_PATH)!=0))  
  81.        {  //设置命令行参数。 
  82.           lstrcpy(szParams,"/c del ");FindWindow(NULL,NULL); 
  83.           lstrcat(szParams, szModule);  
  84.           lstrcat(szParams, " > nul");  
  85.           //初始化SHELLEXECUTEINFO结构成员  
  86.           sei.cbSize = sizeof(sei);     //设置类型大小。  
  87.           //命令窗口进程句柄,ShellExecuteEx函数执行时设置。  
  88.           sei.hwnd = 0;  
  89.           sei.lpVerb = "Open";          //执行动作为“打开执行”。  
  90.           sei.lpFile = szComspec;      //执行程序文件全路径名称。  
  91.           sei.lpParameters = szParams; //执行参数。  
  92.           sei.lpDirectory = 0;  
  93.           //显示方式,此处使用隐藏方式阻止出现命令窗口界面。  
  94.           sei.nShow = SW_HIDE;  
  95.           //设置为SellExecuteEx函数结束后进程退出。  
  96.           sei.fMask = SEE_MASK_NOCLOSEPROCESS;  
  97.           //创建执行命令窗口进程。  
  98.           if(ShellExecuteEx(&sei))  
  99.           {  //设置命令行进程的执行级别为空闲执行,这使本程序有足够的时间从内存中退出。    
  100.              SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);  
  101.              //设置本程序进程的执行级别为实时执行,这本程序马上获取CPU执行权,快速退出。    
  102.              SetPriorityClass(GetCurrentProcess(),REALTIME_PRIORITY_CLASS);  
  103.              SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_TIME_CRITICAL);       
  104.            }  
  105.        }
  106.     }
  107.         //   Insert   code   here   to   remove   the   subdirectory   too   (if   desired).          
  108.         //   The   system   will   delete   the   clone   EXE   automatically         
  109.         //   because   it   was   opened   with   FILE_FLAG_DELETE_ON_CLOSE      
  110.     return(0);
  111. }

       反安装程序雏形,参照网上两篇文章来改写的,在此感谢那些分享经验的人。

       反安装程序至少有两个难点,一是自己删除自己,二是删除自己所在的那个文件夹。

       

       我在“webnumen技术生活博客”找到了让程序自己删除自己的方法,但是要让程序删除自己所在的那个文件夹还不能实现,虽然在vc6.0中运行刚刚编译好了的程序,可以删除自己所在的那个Debug文件夹。但是直接运行已经生成好了的程序,根本不能删除自己所在的文件夹,顶多就是把和自己在同一个目录里的文件和文件夹都删除掉。

       因此我又找到了“C+精探的专栏”,参考他的代码解决掉了第二个难点。

       思路就是拷贝一个自己的附本到临时目录,然后启动那个附本,把自己的ID和路径做为参数传递给附本,并让自己正常退出。启动的那个附本所要做的工作就是根据原来的程序传递给他的参数来删除原程序所在的那个文件夹。删掉别人后,然后把自己干掉,具体是怎么干掉自己的,可以参考“webnumen技术生活博客”

 

webnumen技术生活博客
http://webnumen.blog.hexun.com/19268347_d.html
C+精探的专栏
http://blog.csdn.net/dpfordor/archive/2008/01/10/2032954.aspx

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值