AutoSuppression et .bat

phantom_2005 Messages postés 184 Date d'inscription mercredi 8 décembre 2004 Statut Membre Dernière intervention 1 septembre 2010 - 21 mai 2008 à 11:50
cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 - 21 mai 2008 à 14:48
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

cs_jfrancois Messages postés 482 Date d'inscription vendredi 26 août 2005 Statut Membre Dernière intervention 5 décembre 2009 2
21 mai 2008 à 14:48
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
0
Rejoignez-nous