2012-04-25 2 views
7

एक स्वयं हटाने कार्यक्रमसी में एक स्वयं को हटाने कार्यक्रम ++ समझना

#include <windows.h> 
#include <stdio.h> 

void main(int argc, char* argv[]) 
{ 
    STARTUPINFO si = {0}; 
    PROCESS_INFORMATION pi = {0}; 
    si.cb = sizeof(si); 

    if (argc == 1) 
    { 
     SECURITY_ATTRIBUTES sa; 
     sa.nLength = sizeof(sa); 
     sa.lpSecurityDescriptor = NULL; 
     sa.bInheritHandle = TRUE; 

     CopyFile(argv[0], "1.exe", FALSE); 
     MoveFile(argv[0], "2.exe"); 

     CreateFile("1.exe", 0, FILE_SHARE_READ, &sa, 
      OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); 

     CreateProcess(NULL, "1.exe x", NULL, NULL, 
      TRUE, 0, NULL, NULL, &si, &pi); 
    } 
    else if (argc == 2) 
    { 
     while(!DeleteFile("2.exe")); 

     CreateProcess(NULL, "net", NULL, NULL, TRUE, 
      DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 
    } 
} 

अगर मैं इस को दूर नहीं है।
क्या कोई मुझे बता सकता है कि यह कैसे काम करता है?

+0

, यह काम नहीं करता ... अजीब। – Benj

+0

क्योंकि फ़ाइल नाम स्ट्रिंग एसीआई कोडिंग है। शायद आप stirring के आसपास _T() जोड़ सकते हैं। – pl8787

+0

हाहा, मैंने ऐसा किया, यह संकलित हुआ, मेरा मतलब है कि यह रनटाइम पर काम नहीं करता है। – Benj

उत्तर

8

यहाँ आप इस एक wmain और रन यूनिकोड का उपयोग करने के लिए कनवर्ट हैं (जैसा कि मैं चीजों को समझने) व्याख्या दी गई है

void main(int argc, char* argv[]) 
{ 
    STARTUPINFO si = {0}; 
    PROCESS_INFORMATION pi = {0}; 
    si.cb = sizeof(si); 

    if (argc == 1) 
    { 
     SECURITY_ATTRIBUTES sa; 
     sa.nLength = sizeof(sa); 
     sa.lpSecurityDescriptor = NULL; 
     sa.bInheritHandle = TRUE; 

     // Make a copy of ourselves which we'll use to delete the version we were run from 
     CopyFile(argv[0], "1.exe", FALSE); 

     // Rename the running copy of ourself to another name 
     MoveFile(argv[0], "2.exe"); 

     // Make sure we delete the copy of ourselves that's going to delete us when we die 
     CreateFile("1.exe", 0, FILE_SHARE_READ, &sa, OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL); 

     // Invoke the process that will delete us 
     // allowing it to inherit the handle we just created above. 
     CreateProcess(NULL, "1.exe x", NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); 
    } 
    else if (argc == 2) 
    { 
     // Wait for the original program to die (deleting us and closing a handle), then delete it 
     while(!DeleteFile("2.exe")); 

     // Launch a child process which will inherit our file handles 
     // -- This keeps the file handle with FILE_FLAG_DELETE_ON_CLOSE (which we inherited) alive beyond our lifetime 
     // this allowing us to be deleted after we've died and our own handle is closed. 
     CreateProcess(NULL, "notepad", NULL, NULL, TRUE, DEBUG_ONLY_THIS_PROCESS, NULL, NULL, &si, &pi); 
    } 
} 
+0

आपका मतलब है कि CreatProcess इस कार्यक्रम का संचालन रखता है? लेकिन मुझे अभी भी समझ में नहीं आता कि यह कैसे काम करता है। क्या इसका मतलब यह है कि अगर मैं इसे हटा देता हूं, तो प्रोग्राम को खुद को हटाने के लिए पर्याप्त समय नहीं है? – pl8787

+1

यदि FILE_FLAG_DELETE_ON_CLOSE हैंडल बहुत जल्दी बंद हो गया है, तो डिलीट विफल हो जाएगी क्योंकि 1.exe प्रक्रिया अभी भी चल रही है। एक बच्चे को लॉन्च करके जो हैंडल को विरासत में लेता है, 1.exe का हैंडल बंद होने पर इसे हटा दिया जा सकता है। – Benj

+0

बहुत बहुत धन्यवाद ~ मुझे लगता है कि मैं समझता हूं कि आपका क्या मतलब है। – pl8787