AutoSuppression et .bat

Signaler
Messages postés
184
Date d'inscription
mercredi 8 décembre 2004
Statut
Membre
Dernière intervention
1 septembre 2010
-
Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009
-
Bonjour,

j'ai un problème de suppression de répertoire dans un fichier .bat.

Je créée dans mon appli un fichier .bat d'autodestruction que j'appelle avant de quitter l'appli.
Voici le code de la fonction de création de ce fichier :

void AutoSuppression (void)
{
 HANDLE hfl;
 DWORD len, d, v, x;
 char buff[268], szexe[272], szbat[272];
 CString  tmpfnd,msg;
 
 len      = GetTempPath(264, buff);
 if(buff[len-1] != '\\')
  buff[len++] = '\\';
 buff[len]    = 't';
 buff[len+1]    = '.';
 buff[len+2]    = 'b';
 buff[len+3]    = 'a';
 buff[len+4]    = 't';
 buff[len+5]    = 0;
 hfl      = CreateFile(buff, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 if(hfl == INVALID_HANDLE_VALUE)
  return;


 //Instruction autodestruction du .bat (écrite à la fin de ce fichier)
 *((DWORD*) szbat)  = 0x206C6564; // "del "
 len      = GetShortPathName(buff, szbat+4, 264) + 4;


 //ECHO OFF
 *((DWORD*) szexe)  = 0x6F686365; // "echo"
 *((DWORD*) (szexe+4)) = 0x66666F20; // " off"
 *((WORD*) (szexe+8)) = 0x0A0D;
 WriteFile(hfl, szexe, 10, &v, 0);


 //Instruction destruction du .exe
 GetModuleFileName(0, buff, 264);
 *((DWORD*) szexe)  = 0x206C6564; // "del "
 d      = GetShortPathName(buff, szexe+4, 264) + 4;
 szexe[d]    = 13;
 szexe[d+1]    = 10;
 WriteFile(hfl, szexe, d+2, &v, 0);


 //Instruction destruction du Rep racine
 szexe[0]    = 'r';
 szexe[1]    = 'd';
 sprintf(szexe+2,"%s",sChemin);
 x = sChemin.GetLength()+2;
 szexe[x]    = '/';
 szexe[x+1]    = 's';
 szexe[x+2]    = ' ';
 szexe[x+3]    = '/';
 szexe[x+4]    = 'q';
 szexe[x+5]    = 13;
 szexe[x+6]    = 10;
 WriteFile(hfl, szexe, x+6, &v, 0);


 WriteFile(hfl, szbat, len, &v, 0);


 CloseHandle(hfl);
 *((DWORD*) szexe)  = 0x6E65706F; // "open"
 szexe[4]    = 0;
 szbat[len+4]   = 0;
 ShellExecute(0, szexe, szbat+4, 0, 0, SW_HIDE);
}

Quand j'exécute l'appli, tout se passe bien.
Quand je quitte l'appli, pas d'erreur mais le répertoire est toujours présent alors que le fichier a été supprimé.

Quelqu'un a t il une idée?

Merci d'avance,



--------------------------------------------------------------------------------
Phantom_2005

1 réponse

Messages postés
482
Date d'inscription
vendredi 26 août 2005
Statut
Membre
Dernière intervention
5 décembre 2009

Bonjour,

Le remplissage des chaînes est incorrects. Par exemple :

*((DWORD*) szexe)  = 0x206C6564; // "del "
d      = GetShortPathName(buff, szexe+4, 264) + 4;
szexe[d]    = 13;
szexe[d+1]    = 10;
WriteFile(hfl, szexe, d+2, &v, 0);



//Instruction destruction du Rep racine
szexe[0]    = 'r';
szexe[1]    = 'd';
sprintf(szexe+2,"%s",sChemin);
x = sChemin.GetLength()+2;
szexe[x]    = '/';
szexe[x+1]    = 's';
szexe[x+2]    = ' ';
szexe[x+3]    = '/';
szexe[x+4]    = 'q';
szexe[x+5]    = 13;
szexe[x+6]    = 10;


Il manque l'espace entre rd et le chemin, le chemin est tronqué et il manque le terminateur ! Pourquoi ne pas tout placer dans le sprintf() ???




sprintf(szexe,"rd %s /s/q\r\n",sChemin);




Idem avec :




//ECHO OFF
*((DWORD*) szexe)  = 0x6F686365; // "echo"
*((DWORD*) (szexe+4)) = 0x66666F20; // " off"
*((WORD*) (szexe+8)) = 0x0A0D;




Pas de terminateur !



strcpy(szexe,"echo off\r\n");



Jean-François