Click here to Skip to main content
6,594,932 members and growing! (15,552 online)
Email Password   helpLost your password?
Desktop Development » Files and Folders » General     Intermediate

Writing a self destructing exe file

By Michael Walz

Explains how you can have a program delete itself once it has finished running without a reboot
VC6, VC7, VC7.1Win2K, WinXP, Visual Studio, MFC, Dev
Posted:26 Apr 2003
Views:93,099
Bookmarked:44 times
Announcements
Loading...
 
Search    
Advanced Search
Add to IE Search
printPrint   add Share
      Discuss Discuss   Broken Article?Report  
26 votes for this article.
Popularity: 5.46 Rating: 3.86 out of 5
4 votes, 15.4%
1
1 vote, 3.8%
2
3 votes, 11.5%
3
6 votes, 23.1%
4
12 votes, 46.2%
5

Introduction

Uninstall programs typically want to delete themselves at the end of the un-installation, but executable cannot delete itself by simply calling the DeleteFile function. By calling the Selfdestruct() function showed below before program exit, the calling executable will be destroyed as soon as possible. The method shown in this article works on all Win32 platforms and there is no need to reboot.

Using the code

Just call the Selfdestruct() function before program exit.

// this is the name of the temporary .bat file

static const char tempbatname[] = "_uninsep.bat" ;

void Selfdestruct() 
{
  // temporary .bat file

  static char templ[] = 
    ":Repeat\r\n"
    "del \"%s\"\r\n"
    "if exist \"%s\" goto Repeat\r\n"
    "rmdir \"%s\"\r\n"
    "del \"%s\"" ;


  char modulename[_MAX_PATH] ;    // absolute path of calling .exe file

  char temppath[_MAX_PATH] ;      // absolute path of temporary .bat file

  char folder[_MAX_PATH] ;

  GetTempPath(_MAX_PATH, temppath) ;
  strcat(temppath, tempbatname) ;

  GetModuleFileName(NULL, modulename, MAX_PATH) ;
  strcpy (folder, modulename) ;
  char *pb = strrchr(folder, '\\');
  if (pb != NULL)
    *pb = 0 ;

  HANDLE hf ;
  
  hf = CreateFile(temppath, GENERIC_WRITE, 0, NULL, 
              CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) ;
  
  if (hf != INVALID_HANDLE_VALUE)
  {
    DWORD len ;
    char *bat ;

    bat = (char*)alloca(strlen(templ) + 
               strlen(modulename) * 2 + strlen(temppath) + 20) ;

    wsprintf(bat, templ, modulename, modulename, folder, temppath) ;

    WriteFile(hf, bat, strlen(bat), &len, NULL) ;
    CloseHandle(hf) ;

    ShellExecute(NULL, "open", temppath, NULL, NULL, SW_HIDE);
  }
}

How it works

Let's assume the executable that wants to destroy itself is located in c:\myfolder\selfdestruct.exe. The Selfdestruct() function will create following .bat in the computers temp folder and then launches it:

    :Repeat
    del "c:\myfolder\selfdestruct.exe"
    if exist "c:\myfolder\selfdestruct.exe" goto Repeat
    rmdir "c:\myfolder"
    del "c:\temp\_uninsep.bat" ;

The .bat file will try to delete the c:\myfolder\selfdestruct.exe over and over until it finally succeeds (that is as soon as selfdestruct.exe has finished execution. Then it tries to remove the containing folder (here c:\myfolder) which will work only if it is empty and finally deletes itself. Fortunately .bat files can delete themselves.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

Michael Walz


Member

Location: Switzerland Switzerland

Other popular Files and Folders articles:

Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 29 (Total in Forum: 29) (Refresh)FirstPrevNext
GeneralWhat is this templ????????????? PinmemberRAJEEV_RSD0:05 25 Sep '09  
GeneralRe: What is this templ????????????? PinmemberMichael Walz0:44 25 Sep '09  
Generalbat file Pinmembertetadenovicia8:09 26 Jun '08  
QuestionSelf-Destructing Files Pinmembertao111:56 7 May '08  
GeneralHere's another safe and simple way PinmemberPaul Sanders (AlpineSoft)8:02 20 Oct '07  
QuestionIssue with deleting the directory Pinmemberccoffman976:52 29 Dec '06  
AnswerRe: Issue with deleting the directory PinmemberSF123417:43 20 Feb '07  
GeneralRe: Issue with deleting the directory Pinmemberccoffman974:09 21 Feb '07  
QuestionModification Question PinmemberDark_Xion7:51 1 Oct '06  
GeneralI wrote something like this... PinmemberKhan Shere22:22 18 Jan '05  
GeneralRe: I wrote something like this... PinmemberKhan Shere8:59 21 Jul '05  
GeneralBug fixes and enhancements PinmemberDennis Jiang10:37 4 Jul '03  
GeneralRe: Bug fixes and enhancements Pinmemberamethystwu21:23 24 Oct '05  
GeneralOther methods PinmemberPapa4:34 28 Apr '03  
GeneralRe: Other methods - Clickety PinmemberPhil J Pearson8:06 29 Apr '03  
GeneralRe: Other methods: More Methods PinmemberDoctorKoch0:40 15 Jan '07  
GeneralReally really small article HTML bug PinmemberDominik Reichl10:26 27 Apr '03  
GeneralBatch doesn't terminate PinmemberDominik Reichl10:16 27 Apr '03  
GeneralRe: Batch doesn't terminate Pinmemberjlap77714:45 27 Apr '03  
GeneralRe: Batch doesn't terminate PinmemberDominik Reichl7:45 28 Apr '03  
GeneralRe: Batch doesn't terminate PinmemberDJWALSH3:08 28 Apr '03  
GeneralRe: Batch doesn't terminate PinmemberDominik Reichl7:43 28 Apr '03  
GeneralRe: Batch doesn't terminate PinmemberMichael Walz7:50 28 Apr '03  
GeneralRe: Batch doesn't terminate PinmemberDominik Reichl8:49 28 Apr '03  
GeneralRe: Batch doesn't terminate PinmemberPater23:23 28 Apr '03  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 26 Apr 2003
Editor: Nishant Sivakumar
Copyright 2003 by Michael Walz
Everything else Copyright © CodeProject, 1999-2009
Web17 | Advertise on the Code Project