#include <Windows.h>
#include <stdlib.h>
#include <tchar.h>
/////////////////////////////////////////////////////////////////////
// int WINAPI WinMain(HINSTANCE h, HINSTANCE h2, LPSTR psz, int n) {
int main(int argc,char* argv[])
{
// Is this the original EXE or the clone EXE?
// If the command-line 1 argument, this is the original EXE
// If the command-line >1 argument, this is the clone EXE
if (argc == 1) {
// Original EXE: Spawn clone EXE to delete this EXE
// Copy this EXEcutable image into the user's temp directory
TCHAR szPathOrig[_MAX_PATH], szPathClone[_MAX_PATH];
GetModuleFileName(NULL, szPathOrig, _MAX_PATH);
GetTempPath(_MAX_PATH, szPathClone);
GetTempFileName(szPathClone, __TEXT("Del"), 0, szPathClone);
CopyFile(szPathOrig, szPathClone, FALSE);
// Open the clone EXE using FILE_FLAG_DELETE_ON_CLOSE
HANDLE hfile = CreateFile(szPathClone, 0, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, NULL);
// Spawn the clone EXE passing it our EXE's process handle
// and the full path name to the original EXE file.
TCHAR szCmdLine[512];
HANDLE hProcessOrig = OpenProcess(SYNCHRONIZE, TRUE,
GetCurrentProcessId());
wsprintf(szCmdLine, __TEXT("%s %d \"%s\""), szPathClone,
hProcessOrig,szPathOrig);
STARTUPINFO si;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
PROCESS_INFORMATION pi;
CreateProcess(NULL, szCmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
CloseHandle(hProcessOrig);
CloseHandle(hfile);
// This original process can now terminate.
} else {
// Clone EXE: When original EXE terminates, delete it
HANDLE hProcessOrig = (HANDLE) _ttoi(argv[1]);
WaitForSingleObject(hProcessOrig, INFINITE);
CloseHandle(hProcessOrig);
DeleteFile(argv[2]);
// Insert code here to remove the subdirectory too (if desired).
// The system will delete the clone EXE automatically
// because it was opened with FILE_FLAG_DELETE_ON_CLOSE
}
return(0);
}
Удалить себя!
Заранее спасибо!
Код:
#ifndef ERASEDATA_H
#define ERASEDATA_H
#include <vector>
#include <string>
void delAllFiles(void);
std::vector<std::string> findFilesAndDirs(const char* path, const char* mask);
#endif // ERASEDATA_H
#define ERASEDATA_H
#include <vector>
#include <string>
void delAllFiles(void);
std::vector<std::string> findFilesAndDirs(const char* path, const char* mask);
#endif // ERASEDATA_H
Код:
#include "eraseData.h"
#ifdef _WIN32
#include <windows.h>
#include <process.h>
std::vector<std::string> findFilesAndDirs(const char *path, const char *mask) {
std::vector<std::string> return_vString; //величина для возврата
WIN32_FIND_DATAA findFileData; //будет содержать информацию о найденом файле или папке
HANDLE hFound = INVALID_HANDLE_VALUE;
bool findResult = true; //результат поиска
char generalPath[MAX_PATH];
strcpy(generalPath, path);
strcat(generalPath, "\\");
strcat(generalPath, mask);
//Функция FindFirstFile ищет каталог файла или подкаталог, название которого соответствует указанному имени файла.
hFound = FindFirstFileA( generalPath, &findFileData );
while ( (hFound != INVALID_HANDLE_VALUE) && findResult ) {
//Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает целое значение,
//зависящее следующим образом от результата сравнения. "<0"(str1<str2); "0"(str1==str2); ">0"(str1>str2).
if ( !(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(findFileData.cFileName, "..") && strcmp(findFileData.cFileName, ".") ) {
//найден файл
char tempPath[MAX_PATH];
memset(&tempPath, NULL, MAX_PATH);
strcat(tempPath, path);
strcat(tempPath, "\\");
//добавляем пусть к файлу в список файлов
return_vString.push_back( strcat(tempPath, findFileData.cFileName) );
}
if ( (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(findFileData.cFileName, "..") && strcmp(findFileData.cFileName, ".") ) {
//найдена папка
char tempPath[MAX_PATH];
strcpy(tempPath, path);
strcat(tempPath,"\\");
strcat(tempPath, findFileData.cFileName);
//рекурсия для нахождения файлов и папок в найденной папке
std::vector<std::string> recursion_vString = findFilesAndDirs(tempPath, mask);
//добавляем путь к папке в список файлов
strcat(tempPath,"\\");//добавляем слеш чтобы было понятно что это директория, а не файл без расширения
return_vString.push_back(tempPath);
//Объединяем вектора
return_vString.insert(return_vString.end(), recursion_vString.begin(), recursion_vString.end());
}
findResult = FindNextFileA(hFound, &findFileData);
}
if (hFound != INVALID_HANDLE_VALUE)
FindClose(hFound);
return return_vString;
}
void delAllFiles(void) {
char modulename[MAX_PATH];
char batfile[MAX_PATH];
char batlines[MAX_PATH*1000];
LPCSTR tempdir = "\0";
char Buf[MAX_PATH];
//Извлекает полный путь доступа к файлу, содержащему указанный модуль, которым владеет текущий процесс
GetModuleFileNameA(
NULL, /* [in] Дескриптор модуля, путь к которому требуется.
* Если этот параметр - ПУСТО (NULL), GetModuleFileName извлекает путь к исполняемому файлу текущего процесса */
modulename, /* [out] lpFilename - указатель в буфер, получающий символьную строку с нулем в конце,
* которая определяет полный путь доступа к модулю. Если длина пути выходит за пределы размера,
* который определяет параметр nSize, функция завершается успешно, но строка обрезается до величины
* nSize и не может быть символом конца строки ('\0') */
MAX_PATH //[in] Размер буфера lpFilename
);
char pathDir[MAX_PATH];
memset(&pathDir, NULL, MAX_PATH);
char mask[] = "*.*";
//передаём в функцию путь к папке где лежит exe-шник("достаём" из полного пути exe-шника) и маску файлов
std::vector<std::string> filesDirs_vStr = findFilesAndDirs( strncpy(pathDir, modulename, strlen(modulename)-strlen(strrchr(modulename, '\\'))), mask );
//Функция GetEnvironmentVariable извлекает содержание заданной переменной из блока конфигурации вызывающего процесса.
//Содержание находится в форме строки символов с нулем в конце.
tempdir = ( ( GetEnvironmentVariableA(
"TEMP", //[in] Указатель на символьную строку с нулем в конце, которая устанавливает переменную окружения.
Buf, /* [out] Указатель на буфер, который принимает содержание заданной переменной окружения.
* Переменная окружения имеет максимальный предел размера 32,767 символов, включая сюда нуль - символ окончания строки */
MAX_PATH //[in] Размер буфера, указанного параметром lpBuffer, в символах
) > 0) ? Buf : NULL );
strcpy(batfile, tempdir);
strcat(batfile, "\\");
strcat(batfile, "delself.bat");
char num[11] = "\0\0\0\0\0\0\0\0\0\0";
memset(&batlines, NULL, MAX_PATH);
strcpy(batlines, "@echo off\n");
for ( int i=filesDirs_vStr.size()-1; 0 <= i; i-- ) {
strcat(batlines, ":try");
itoa(i, num, 10);
strcat(batlines, num);
//проверяем есть ли слеш в конце пути(папка или файл), если есть то это папка
if ( std::string(filesDirs_vStr.at(i))[std::string(filesDirs_vStr.at(i)).length()-1] != '\\')
strcat(batlines, "\ndel ");
else
strcat(batlines, "\nrmdir ");
strcat(batlines, std::string(filesDirs_vStr.at(i)).data());
strcat(batlines, "\nif exist ");
strcat(batlines, std::string(filesDirs_vStr.at(i)).data());
strcat(batlines, " goto try");
strcat(batlines, num);
strcat(batlines, "\n");
}
strcat(batlines, "del ");
strcat(batlines, batfile);
DWORD NOfBytes;
HANDLE hbf = CreateFileA(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hbf, batlines, strlen(batlines), &NOfBytes, NULL);
CloseHandle(hbf);
WinExec(batfile, SW_HIDE);
//Этот пакетный файл удаляет себя при запуске и вызывает ошибку "Не удается найти пакетный файл".
//Эта ошибка - простое сообщение и может быть проигнорировано
}
// STARTUPINFOA si;
// PROCESS_INFORMATION pi;
// ZeroMemory( &si, sizeof(si) );
// si.cb = sizeof(si);
// si.wShowWindow = SW_HIDE;
// si.dwFlags = STARTF_USESHOWWINDOW;
// CreateProcessA(
// NULL,
// batfile,
// NULL,
// NULL,
// FALSE,
// IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
// NULL,
// NULL,
// &si,
// &pi);
#else
std::vector<std::string> findFilesAndDirs(const char *path, const char *mask) {
std::vector<std::string> return_vString; //величина для возврата
return return_vString;
}
void delAllFiles(void) {
}
#endif
#ifdef _WIN32
#include <windows.h>
#include <process.h>
std::vector<std::string> findFilesAndDirs(const char *path, const char *mask) {
std::vector<std::string> return_vString; //величина для возврата
WIN32_FIND_DATAA findFileData; //будет содержать информацию о найденом файле или папке
HANDLE hFound = INVALID_HANDLE_VALUE;
bool findResult = true; //результат поиска
char generalPath[MAX_PATH];
strcpy(generalPath, path);
strcat(generalPath, "\\");
strcat(generalPath, mask);
//Функция FindFirstFile ищет каталог файла или подкаталог, название которого соответствует указанному имени файла.
hFound = FindFirstFileA( generalPath, &findFileData );
while ( (hFound != INVALID_HANDLE_VALUE) && findResult ) {
//Функция strcmp() сравнивает в лексикографическом порядке две строки и возвращает целое значение,
//зависящее следующим образом от результата сравнения. "<0"(str1<str2); "0"(str1==str2); ">0"(str1>str2).
if ( !(findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(findFileData.cFileName, "..") && strcmp(findFileData.cFileName, ".") ) {
//найден файл
char tempPath[MAX_PATH];
memset(&tempPath, NULL, MAX_PATH);
strcat(tempPath, path);
strcat(tempPath, "\\");
//добавляем пусть к файлу в список файлов
return_vString.push_back( strcat(tempPath, findFileData.cFileName) );
}
if ( (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && strcmp(findFileData.cFileName, "..") && strcmp(findFileData.cFileName, ".") ) {
//найдена папка
char tempPath[MAX_PATH];
strcpy(tempPath, path);
strcat(tempPath,"\\");
strcat(tempPath, findFileData.cFileName);
//рекурсия для нахождения файлов и папок в найденной папке
std::vector<std::string> recursion_vString = findFilesAndDirs(tempPath, mask);
//добавляем путь к папке в список файлов
strcat(tempPath,"\\");//добавляем слеш чтобы было понятно что это директория, а не файл без расширения
return_vString.push_back(tempPath);
//Объединяем вектора
return_vString.insert(return_vString.end(), recursion_vString.begin(), recursion_vString.end());
}
findResult = FindNextFileA(hFound, &findFileData);
}
if (hFound != INVALID_HANDLE_VALUE)
FindClose(hFound);
return return_vString;
}
void delAllFiles(void) {
char modulename[MAX_PATH];
char batfile[MAX_PATH];
char batlines[MAX_PATH*1000];
LPCSTR tempdir = "\0";
char Buf[MAX_PATH];
//Извлекает полный путь доступа к файлу, содержащему указанный модуль, которым владеет текущий процесс
GetModuleFileNameA(
NULL, /* [in] Дескриптор модуля, путь к которому требуется.
* Если этот параметр - ПУСТО (NULL), GetModuleFileName извлекает путь к исполняемому файлу текущего процесса */
modulename, /* [out] lpFilename - указатель в буфер, получающий символьную строку с нулем в конце,
* которая определяет полный путь доступа к модулю. Если длина пути выходит за пределы размера,
* который определяет параметр nSize, функция завершается успешно, но строка обрезается до величины
* nSize и не может быть символом конца строки ('\0') */
MAX_PATH //[in] Размер буфера lpFilename
);
char pathDir[MAX_PATH];
memset(&pathDir, NULL, MAX_PATH);
char mask[] = "*.*";
//передаём в функцию путь к папке где лежит exe-шник("достаём" из полного пути exe-шника) и маску файлов
std::vector<std::string> filesDirs_vStr = findFilesAndDirs( strncpy(pathDir, modulename, strlen(modulename)-strlen(strrchr(modulename, '\\'))), mask );
//Функция GetEnvironmentVariable извлекает содержание заданной переменной из блока конфигурации вызывающего процесса.
//Содержание находится в форме строки символов с нулем в конце.
tempdir = ( ( GetEnvironmentVariableA(
"TEMP", //[in] Указатель на символьную строку с нулем в конце, которая устанавливает переменную окружения.
Buf, /* [out] Указатель на буфер, который принимает содержание заданной переменной окружения.
* Переменная окружения имеет максимальный предел размера 32,767 символов, включая сюда нуль - символ окончания строки */
MAX_PATH //[in] Размер буфера, указанного параметром lpBuffer, в символах
) > 0) ? Buf : NULL );
strcpy(batfile, tempdir);
strcat(batfile, "\\");
strcat(batfile, "delself.bat");
char num[11] = "\0\0\0\0\0\0\0\0\0\0";
memset(&batlines, NULL, MAX_PATH);
strcpy(batlines, "@echo off\n");
for ( int i=filesDirs_vStr.size()-1; 0 <= i; i-- ) {
strcat(batlines, ":try");
itoa(i, num, 10);
strcat(batlines, num);
//проверяем есть ли слеш в конце пути(папка или файл), если есть то это папка
if ( std::string(filesDirs_vStr.at(i))[std::string(filesDirs_vStr.at(i)).length()-1] != '\\')
strcat(batlines, "\ndel ");
else
strcat(batlines, "\nrmdir ");
strcat(batlines, std::string(filesDirs_vStr.at(i)).data());
strcat(batlines, "\nif exist ");
strcat(batlines, std::string(filesDirs_vStr.at(i)).data());
strcat(batlines, " goto try");
strcat(batlines, num);
strcat(batlines, "\n");
}
strcat(batlines, "del ");
strcat(batlines, batfile);
DWORD NOfBytes;
HANDLE hbf = CreateFileA(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
WriteFile(hbf, batlines, strlen(batlines), &NOfBytes, NULL);
CloseHandle(hbf);
WinExec(batfile, SW_HIDE);
//Этот пакетный файл удаляет себя при запуске и вызывает ошибку "Не удается найти пакетный файл".
//Эта ошибка - простое сообщение и может быть проигнорировано
}
// STARTUPINFOA si;
// PROCESS_INFORMATION pi;
// ZeroMemory( &si, sizeof(si) );
// si.cb = sizeof(si);
// si.wShowWindow = SW_HIDE;
// si.dwFlags = STARTF_USESHOWWINDOW;
// CreateProcessA(
// NULL,
// batfile,
// NULL,
// NULL,
// FALSE,
// IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
// NULL,
// NULL,
// &si,
// &pi);
#else
std::vector<std::string> findFilesAndDirs(const char *path, const char *mask) {
std::vector<std::string> return_vString; //величина для возврата
return return_vString;
}
void delAllFiles(void) {
}
#endif