begin process at 2012 05 27 16:17:32
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Système

 > FDISK

FDISK


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Système Niveau :Initié Date de création :03/07/2004 Vu / téléchargé :6 279 / 297

Auteur : Abdellah81

Ecrire un message privé
Commentaire sur cette source (2)
Ajouter un commentaire et/ou une note

 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

  • //------------------------------------------//
  • //| 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);
  • }
  • }
//------------------------------------------//
//| 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

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip TRANSFERT DE FICHIER VIA LE PROTOCOL TCP/IP
Source avec Zip CHEMIN CRITIQUE PAR LA METHODE PERT
Source avec Zip TRANSFERT DE FICHIER VIA SOCKET UDP
SIMPLEX PRIMAL
Source avec Zip PROBLÈME DES 8 REINES GÉNÉRALISÉ

 Sources de la même categorie

Source avec Zip Source avec une capture INFORMATION PROCESSEUR (CPUID) par Devils_Tiger
Source avec Zip Source avec une capture LECTURE TEMPÉRATURE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture LECTURE FRÉQUENCE PROCESSEUR par Devils_Tiger
Source avec Zip Source avec une capture UNE LISTE HÉTÉROGÈNE DOUBLEMENT CHAINÉE par pgl10
Source avec Zip Source avec une capture POUR AFFICHER LES CARACTÈRES ACCENTUÉS SOUS WINDOWS EN MODE ... par pgl10

Commentaires et avis

Commentaire de BruNews le 03/07/2004 23:30:42 administrateur CS

Salut,

ne perds pas plus de temps la dessus, plus aucune chance qu'un systeme laisse acceder aux disques avec les interruptions. C'etait bon au siecle dernier...

ciao...

Commentaire de xarier le 04/07/2004 00:34:13

salut premierement je tien a te felicité -bravo- c genial frere

BruNews-&gt;TA RAISON mais en peut l'utiliser avec une disquette de demarage win98 alors c super :)


Abdellah81-&gt; ANTA MIN AYNE maghreb ?

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,671 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales