Accueil > > > FDISK
FDISK
Information sur la source
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
Sources du même auteur
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Forum
MATRICE TEMPLATEMATRICE TEMPLATE par hjr2610
Cliquez pour lire la suite par hjr2610 RE : SAC A DOS RE : SAC A DOS par hadjkaddour
Cliquez pour lire la suite par hadjkaddour
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|