Description

Ce programme est un petit utilitaire de partitionemment, mais il est efficace en cas de problème avec des logiciel comercial(Des fois il est impossible de supprimer la partiton étendue avec pmagic ou fdisk).

Il permet aussi de sauvgarder le secteur de partition dans un fichier, et de le restituer en cas de problème( il faut le sauvgarder dans la disquette, parceque si vous détruirez le secteur de partition aucune partition ne peut etre accede ni de lecteur). Donc soyez prident si vous l'utilisez.

Source / Exemple :


//------------------------------------------//
//| Universitee Djillali Liabes ( SBA )    |//
//| D‚partement d'informatique           |//
//| El Antri Abdellah                           |//
//| Email : el_emir_2002@yahoo.fr      |//
//------------------------------------------//

// Ce programme est sous liscence GNU
// Compiler avec TC3  a partir d'une disquette de demarrage Win98

// Il doit etre utiliser avec les systmes Win9x/Dos
// ou a partir d'une disquette de demarage (pour un fonctionement parfait)

// Ce programme peut detruire facilement vos donnees, donc soyez prudent !!!???
// Par contre, il peut regler le probleme de l'impossibilite de supprimer
// la partition etendue avec les logiciels commercial.

// Ce programme est extensible facilement (la methode de conception est
// base sur une decomposition fonctionelle simple), personnelement je conte
// etendre ces fonctionalitees et surtout la creation de nouvelle partition
// et le code de secteur de partition.(C'est une question de temps), mais ca peut
// etre fait par une autre personne.

#include<string.h>  // Pour strlen
#include<ctype.h>   // Pour toupper
#include<stdlib.h>  // Pour exit
#include<mem.h>     // Pour memcpy
#include<bios.h>    // Pour biosdisk
#include<stdio.h>   // Pour les E/S
#include<conio.h>   // Pour getch

char *msg_err_disk[]=
  {
  "  Lecture du secteur de partition avec succe",
  "  Commande invalide",
  "  Marqueur d'adresses introuvable",
  "  Tentative d'ecriture sur disque protege en ecriture",
  "  Secteur introuvable",
  "  Echec de Reset (dique dur)",
  "  Interversion de disquette depuis derniere operation",
  "  Echec d'activite des paramŠtres disques",
  "  Debordement DMA",
  "  DMA en franchissement de frontiere de 60Ko",
  "  Secteur defectueux detecte ",
  "  Piste defectueuse detectee",
  "  Piste inconnue",
  "  CRC/ECC defectueux en lecture",
  "  CRC/ECC en erreur apres corrrection",
  "  Echec du controleur",
  "  Echec d'operation recherche (seek)",
  "  Pas de reponse connexion (attachment)",
  "  Disque non pret (disque dur)",
  "  Erreur inconnue (disque dur)",
  "  Erreur en ecriture ",
  "  Erreur de statut ",
  "  Echec d'operation 'sense'",
  };

typedef struct  entree_tab_part{unsigned char etat,tete_debut;unsigned int sect_cyl_debut;unsigned char type,tete_fin;unsigned int sect_cyl_fin; unsigned long int distance_boot_part, nbr_sect;};

void presentation(char *msg);
void lire_sect_part(unsigned char buf_sect_part[]);
void ecrire_sect_part(unsigned char buf_sect_part[]);
void extraire_tab_part(unsigned char buf_sect_part[],entree_tab_part *buf_tab_part);
void process(entree_tab_part *buf_tab_par, unsigned char *buf_sect_part);
void afficher_menu(char *menu[], int nbr_cmd); //nbr_cmd: c'est le nbr d'entrer de ce menu
int  choisir_cmd(int debut,int fin); // Debut et fin indique l'interval des comandes valides
int  confirmer();
char *type(int type); // Conversion de l'identificateur d'une partition en un nom
void afficher(entree_tab_part *buf_tab_part);
void supprimer(entree_tab_part *buf_tab_part,unsigned char *buf_sect_part,int num_part);
void activer(entree_tab_part *buf_tab_part,unsigned char *buf_sect_part,int num_part);
void supprimer_table();
void sauver_sect(char *chemin);
void restaurer_sect(char *chemin);

int main()
{
unsigned char buf_sect_part[512];
entree_tab_part  buf_tab_part[4];

presentation("Copyright (C) El Antri Abdellah 2004");
textcolor(WHITE);
process(buf_tab_part,buf_sect_part);
return 0;
}

void presentation(char *msg)
{
clrscr();
printf("%s",msg);
}

void lire_sect_part(unsigned char buf_sect_part[])
{
int nbr_err = 0;
unsigned char resultat;
do
  {
  resultat = biosdisk(_DISK_READ,0x80,0,0,1,1,buf_sect_part);
  nbr_err = nbr_err + 1;
  }while(resultat & 0XFF00 != 0 && nbr_err < 5);
if(nbr_err == 5)
		{
		printf("\n\r %s\n\r",msg_err_disk[resultat&0X00FF]);
		getch();
		exit(1);
		}
}

void ecrire_sect_part(unsigned char buf_sect_part[])
{
int nbr_err = 0;
unsigned char resultat=0;

do
  {
  biosdisk(_DISK_RESET,0x80,0,0,1,1,NULL); // Reinisialisation du disque dur
  resultat = biosdisk(_DISK_WRITE,0x80,0,0,1,1,buf_sect_part); // Ecriture du buf_sect_part dans le secteur de partition
							       // voir le help pour plus de detail
  nbr_err = nbr_err + 1;
  }while(resultat & 0xFF00 != 0 && nbr_err < 5);
if(nbr_err == 5)printf("\n\r %s\n\r",msg_err_disk[resultat&0x00FF]);
}

void extraire_tab_part(unsigned char buf_sect_part[],entree_tab_part *buf_tab_part)
{
if(memcpy(buf_tab_part,(buf_sect_part+0x1be),16*4) == NULL)// Copy la table de partition a partir
							   // du sect de part dans une var structuree
  {
  printf("\n\r Erreur interne: impossible d'utiliser la RAM");
  printf("\n\r Tapper sur une touche ...");
  getch();
  exit(1);
  }

}

char *type(int type)
{
char *msg;
switch(type)
      {
      case 0x01 :return("FAT 12");
      case 0x02 :
      case 0x03 :return("XENIX");
      case 0x04 :return("FAT 16");
      case 0x05: return("EXTEND");
      case 0x06 :return("FAT 16");
      case 0x07 :return("NTFS");
      case 0x80:return("MINIX");
      case 0x81:
      case 0x82:return("SWAP");
      case 0x83:return("Linux");
      default:
	      sprintf(msg,"%d",type);
	      return(msg);
      }
}

void process(entree_tab_part *buf_tab_part,unsigned char *buf_sect_part)
{
int cmd, num_part;
int changement = 0;
char *chemin;
char *menu_gle[]=
		  {
		  "Afficher toutes les partitions:",
		  "Activer une partition:"       ,
		  "Supprimer une partition:"     ,
		  "Supprimer le secteur de partition (Dans le cas des problemes graves))" ,
		  "Sauvegarder le secteur de partition dans un fichier:",
		  "Restaurer le secteur de partition a partir d'un ficher:",
		  "Quitter le programme:"
		  };

do
  {
  clrscr();
  lire_sect_part(buf_sect_part);
  extraire_tab_part(buf_sect_part,buf_tab_part);
  cprintf("Commandes disponibles:");
  afficher_menu(menu_gle,7);
  cmd = choisir_cmd(1,7); // Veut dire choisir une commande entre 1 et 4
  switch(cmd)
	 {
	 case 1 : // Affichage des partitions
		 afficher(buf_tab_part);
		 break;
	 case 2 :// Activer une partition
		 if(confirmer() == 1)
		    {
		    printf("Entrer le numero de partition a activer:");
		    scanf("%d",&num_part);
		    activer(buf_tab_part,buf_sect_part,num_part-1);
		    printf("\n\rTapper une touche ...\n\r");
		    getch();
		    changement = 1 ;
		    }
		 break;
	 case 3 :// Supprimer une partition
		 if(confirmer())
		    {
		    printf("Entrer le numero de partition a supprimer:");
		    scanf("%d",&num_part);
		    supprimer(buf_tab_part,buf_sect_part,num_part-1);
		    changement = 1;
		    }
		 break;
	 case 4:// Supprimer la table
		 if(confirmer())
		    {
		    changement = 1;
		    supprimer_table();
		    }
		 break;
	 case 5:// Suvegarde du secteur de part
		printf("\n\r Entrer le chemin du fichier:");
		scanf("%s",chemin);
		sauver_sect(chemin);
		break;
	 case 6:// Restaurartion du sect de part
		printf("\n\r Entrer le chemin du fichier:");
		scanf("%s",chemin);
		restaurer_sect(chemin);
		break;
	 case 7:// Sortir
		 if(changement)
		    printf("\n\r Vous dever redemarer pour terminer l'operation.\n\r");
		    printf(" Tapper une touche pour terminer ...\n\r");
		    getch();
		 exit(0);
	 default:
		 printf("\n\r Commande invalide.");
	 }
  }while(1);
}

void afficher_menu(char *menu[], int nbr_cmd)
{
int i; // pour parcourir le menu

for(i = 1; i<=nbr_cmd;i++)
   {
   printf("\n\r %d) %s",i,menu[i-1]);
   }
printf("\n\r");
}

int choisir_cmd(int debut,int fin)
{
int cmd;
int x,y;

textcolor(RED);
cprintf("Entrer une commande: ");
x = wherex();
y = wherey();
do
  {
  gotoxy(x,y);
  textcolor(GREEN);
  scanf("%10d",&cmd);
  if(cmd < debut || cmd > fin) // un choix non valide
    {
    gotoxy(x,y) ;
    textcolor(BLACK) ;
    printf("         "); // Pour effacer le choix invalide
    gotoxy(1,23);
    textcolor(YELLOW);
    cprintf("Commande invalide ..\n\r");
    textcolor(WHITE);
    cprintf("Tapper une touche pour continuer ..");
    getch();
    textcolor(BLACK);
    gotoxy(1,23);
    cprintf("Commande invalide ..\n\r");
    cprintf("Tapper une touche pour continuer ..");
    }
  fflush(stdin);
  } while(cmd < debut || cmd > fin);
textcolor(WHITE);
return cmd;
}

int confirmer()
{
char rep;

textcolor(RED);
cprintf("\n\r      Avertissement:");
printf("\n\r\t Cette operation peut endomager vos donnee.");
printf("\n\r\t Si vous n'ete pas experimentez, faut mieu \n\r\t abondonner l'operation.");
do
  {
  cprintf("\n\rvous ete sur de vouloir continuer(Y | N):");
  rep = getchar();
  }while(toupper(rep) != 'Y' && toupper(rep) != 'N');
textcolor(WHITE);
if(toupper(rep) == 'Y')return(1);
  else return(0);
}

void afficher(entree_tab_part *buf_tab_part)
{
int indice; // Pour le parcour de la table de partition //
unsigned long int nbr_sect = 0 ; // pour calculer la taille du disque //
unsigned long int taille;  // Taille totale du disque
unsigned long int t[4]; //taille de chaque partition

printf("\n\r -----------------------------------------------------------------------------\n\r");
printf(" | Etat | Tete | Cyl | Sect | Type | Tete | Cyl | Sect | Distance | Nbr sect |");
printf("\n\r -----------------------------------------------------------------------------");
for(indice = 0; indice < 4; indice++)
   {
     printf("\n\r");
     printf("%d",indice+1);
     if(buf_tab_part[indice].etat == 0x80)printf("|   A  |");
       else printf("|      |");
     printf("%6d|",buf_tab_part[indice].tete_debut);
     printf("%5d|",buf_tab_part[indice].sect_cyl_debut>>8 + (buf_tab_part[indice].sect_cyl_debut<<2)&0x0300);
     // Voir la bible de PC pour le format du mot secteur-cylindre
     printf("%6d|",buf_tab_part[indice].sect_cyl_debut&0x003F);
     printf("%6s|",type(buf_tab_part[indice].type));
     printf("%6d|",buf_tab_part[indice].tete_fin);
     printf("%5d|",buf_tab_part[indice].sect_cyl_fin>>8 +(buf_tab_part[indice].sect_cyl_fin<<2)&0x0300);
     printf("%6d|",buf_tab_part[indice].sect_cyl_debut&0x003F);
     printf("%10li|",buf_tab_part[indice].distance_boot_part);
     printf("%10li|",buf_tab_part[indice].nbr_sect);
     t[indice] = buf_tab_part[indice].nbr_sect/(2*1024);
     nbr_sect = nbr_sect + buf_tab_part[indice].nbr_sect;
   }
printf("\n\r -----------------------------------------------------------------------------\n\r");
printf("\n\r Taille de chaque partition:\n\r");
for(indice = 0; indice < 4; indice++)
   printf(" %d) %li MO    ",indice+1,t[indice]);
taille = (nbr_sect)/(2*1024);
printf("\n\r\n\r Taille du disque dur (approximativement): %li MO (%li GO)",taille,taille/1024);
gotoxy(2,24);
textcolor(WHITE+BLINK);
cprintf("Tapper une touche pour continuer...");
getch();
textcolor(WHITE);
}

void activer(entree_tab_part *buf_tab_part,unsigned char *buf_sect_part, int num_part)
{

for(int i = 0; i < 4; i++)
   {
   if(i != num_part)
     {
     //Desactiver les autres partitions por ne pas avoir des conflicts
     buf_tab_part[i].etat = 0x00;
     }
     else
	{
	//Activer la partition designer
	buf_tab_part[num_part].etat = 0x80;
	}
   }
//Preparer le buffer pour ecrire dans le disque la table modifiee
if(!memcpy((buf_sect_part+0x1be),buf_tab_part,16*4)) // Copy la table de partition a partir
						    // du sect de part dans une var structuree
						    // Ici les 4 entree doivent etre changees
  {
  printf("\n\r Erreur interne: impossible d'utiliser la RAM");
  printf("\n\r Tapper sur une touche ...");
  getch();
  exit(1);
  }

//Ecriture proprement dite
ecrire_sect_part(buf_sect_part);
}

void supprimer(entree_tab_part *buf_tab_part,unsigned char *buf_sect_part,int num_part)
{
buf_tab_part[num_part].type = 0x00; // Type 0 corrspond a une partition vide
if(!memcpy((buf_sect_part + num_part*16 + 0x1be),buf_tab_part,16)) // Seul l'entree cancerner va etre changer
  {
  printf("\n\r Erreur interne: impossible d'utiliser la RAM");
  printf("\n\r Tapper sur une touche ...");
  getch();
  exit(1);
  }
ecrire_sect_part(buf_sect_part);
}

void supprimer_table()
{
unsigned char buf[512];

// Preparation d'un buffer plein de 0 pour le mettre dans le secteur de partition
for(int i=0; i <= 511; i++)
    buf[i]=0;
ecrire_sect_part(buf);
}

void sauver_sect(char *chemin)
{
FILE *handle;
unsigned char buf[512];

lire_sect_part(buf);
handle = fopen(chemin,"w");
if(handle == NULL)
  {
  printf("\n\r Erreur de creation du fichier %s.",chemin);
  }
  else
      {
      if(fwrite(buf,512,1,handle) != 1)
	 printf("\n\r Erreur d'ecriture dans le fichier %s.",chemin);
      fclose(handle);
      }
}

void restaurer_sect(char *chemin)
{
FILE *handle;
unsigned char buf[512];

handle = fopen(chemin,"r");
if(handle == NULL)
  printf("\n\rImpossible d'ouvrir le fichier %s.",chemin);
  else
     {
     if(fread(buf,512,1,handle) == 1)
	ecrire_sect_part(buf);
	else printf("\n\rErreur de lire le fichier %s.",chemin);
      fclose(handle);
     }
}

Conclusion :


Mon programme ne permet pas de créé de partition ni de voir les partitions logiques dans la partition etendue. C'est un probleme de temps, mais si vous voyez que ca est interessant je peut le terminé.
Si vous avez des questions, suggestions n'hésiter pas a me contacter sur:
el_emir_2002@yahoo.fr

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.