ACTIVER OU DÉSACTIVER UNE PARTITION D'UN DISQUE DUR IDE

SwordONe0v3riDe Messages postés 15 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 août 2005 - 15 avril 2003 à 06:32
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 - 26 févr. 2006 à 02:15
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/15294-activer-ou-desactiver-une-partition-d-un-disque-dur-ide

CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
26 févr. 2006 à 02:15
Désolé pour cette réponse très tardive, j'ai été très occupé.
Pour les doc ATAPI, je pense qu'en lançant une recherche tu devrais tomber sur le site officiel de la norme. Tu y trouveras la doc. Mais là je m'en souviens plus désolé. Honnêtement je pense qu'il ne devrait pas être trop difficile à trouver car c'est une norme publique.

Merci pour la correction, effectivement je ne l'avais pas testé car à l'époque, je n'avais plus d'espace disque pour installer une partition linux. Maintenant les temps ont changé. Dès que j'aurais eu le temps de changer la source, voire de l'améliorer, je vous le ferais savoir. En attendant, la correction fera l'affaire.
pcmat2000 Messages postés 1 Date d'inscription mardi 12 avril 2005 Statut Membre Dernière intervention 1 juillet 2005
1 juil. 2005 à 14:47
Je voulais juste faire un méga gros bisouxXxX au programmeur génial qui nous a pondu ce code, j'ai fait la connerie d'activer 2 partitions primaires sur mon disque (pas fais exprès j'vous jure...) => ca c'est vite réglé avec ce petit prog! :) Vraiment merci beaucoup beaucoup beaucoup !!!
+++
zoran_8000 Messages postés 9 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 15 août 2007
4 mai 2005 à 10:50
J'ai modifié un peu le code de ton source C pour qu'il fonctionne sous Linux (tu ne l'avais pas testé), voilà le résultat :

#include <stdio.h>


struct Partition
{
unsigned char flag;
char description[15];
};

struct Mbr
{
char bootCode[0x1BE];
struct Partition table[4];
char signature[2];
};

void displayError (void)
{
printf("usage : activate {-h <disqueIDE> | -s <disqueSCSI>} {-a | -d }\n");
printf(" -h : disque IDE a selectionner {0-3}\n");
printf(" -s : disque SCSI a selectionner {0-7}\n");
printf(" -a : activation de la partition (0-3)\n");
printf(" -d : désactivation de la partition (0-3)\n");
}

void affichageMBR(Mbr mbr) {
printf("Contenu du MBR :\n\n");
printf("Partition 0 : 0x%X\n",mbr.table[0].flag);
printf("Partition 1 : 0x%X\n",mbr.table[1].flag);
printf("Partition 2 : 0x%X\n",mbr.table[2].flag);
printf("Partition 3 : 0x%X\n",mbr.table[3].flag);
}

int main(int argc, char *argv[])
{
struct Mbr mbr;
int scsi;
char disk;
char disk_desc[]= "/dev/?d?";
FILE* fd;
unsigned char flag;
int part;

if (argc < 5) {
displayError();
return 1;
};


if (argv[1][1] == 'h') {
scsi= 0; // 0=IDE 1=SCSI
} else if (argv[1][1] == 's') {
scsi= 1;
} else {
displayError();
return 1;
};

if (argv[2][0] >= '0' && argv[2][0] < '8') {
disk= argv[2][0]; // numéro de disque IDE:0-3 SCSI:0-7
} else {
displayError();
return 1;
};

disk_desc[5]= (char) argv[1][1];
disk_desc[7]= 'a';
if (disk > '0') disk_desc[8]= disk;

fd= fopen(disk_desc, "rb+");

if (argv[3][1] == 'a') {
flag = 0x80;
} else if (argv[3][1] == 'd') {
flag = 0x00;
} else {
displayError();
return 1;
};

printf("Disque : %s\nPartition : %c\n",disk_desc,argv[4][0]);
printf("Action (a:activation, d: desactivation) : %c\n",argv[3][1]);
part = argv[4][0] - '0';

if( fd && fread(&mbr, sizeof(mbr), 1, fd) )
{
// Avant
affichageMBR(mbr);

// activation(rendre bootable) => 0x80, sinon (non bootable) => 0x00
//mbr.table[0].flag= 0x00; // 1ère partition
//mbr.table[1].flag= 0x00; // 2ème partition
//mbr.table[2].flag= 0x00; // 3ème partition
//mbr.table[3].flag= 0x00; // 4ème partition
mbr.table[part].flag= flag;
printf("Partition sélectionnée : %i\n",part);
printf("Flag : 0x%X\n",flag);

// Apres
affichageMBR(mbr);

if( !fseek(fd, 0, SEEK_SET) )
{
if( fwrite(&mbr, sizeof(mbr), 1, fd) ) {
printf("Ecriture dans le fichier reussie\n");
fclose(fd);
return 0;
} else {
printf("Erreur d'ecriture dans le fichier\n");
fclose(fd);
return 3;
}

}
else {
fclose(fd);
return 2;
}
}
else {
printf("Erreur de lecteur\n");
return 1; // erreur de lecteur
}
}
bofur Messages postés 39 Date d'inscription lundi 13 novembre 2000 Statut Membre Dernière intervention 5 juin 2009
11 avril 2005 à 17:37
serai t'il possible d'avoir les docs ATA et ATAPI
et toute les doc pour acceder aux disque sans le bios
zoran_8000 Messages postés 9 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 15 août 2007
7 mars 2005 à 12:03
Merci pour ta réponse/solution ultra-rapide.

Ton code est super bien commenté en plus je vais pouvoir m'en servir !

Encore chapeau !
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
7 mars 2005 à 11:53
Le source ASM ne prend pas en charge les disques SCSI, mais le source C pour linux, indique comment faire pour activer une partition SCSI
zoran_8000 Messages postés 9 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 15 août 2007
7 mars 2005 à 09:30
Juste une derniere question, est-ce que ton prog peux prendre en charge des disques SCSI ????

Merci d'avance !
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
5 mars 2005 à 10:24
Malheuresement, les sources fournies sont pas conçu pour linux.
Mais il suffit d'adapter le code source C en utilisant le fichiers /dev/hd? et /dev/sd? (?=a,b,c,d) pour accéder aux disques.

Je fournirai une version C pour linux.
zoran_8000 Messages postés 9 Date d'inscription lundi 26 janvier 2004 Statut Membre Dernière intervention 15 août 2007
3 mars 2005 à 17:28
J'ai une question !

Est-ce que ce programme fonctionne sous les deux mondes (Linux et Windows) ?

En fait j'aimerais m'en serveir pour booter automatiquement d'un système à l'autre en tapant une seule commande sans avoir à choisir au démarrage.

Merci !
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
13 juil. 2004 à 22:58
Oui bien sûr j'ai les docs ATA et ATAPI, je peux accéder aux disques P'n'P sans le BIOS, par les ports IO
mais ça fait longtemps
Le seul truc que je connais pas c'est les structures des systèmes NTFS car j'ai pas chercher à savoir
teknocrack Messages postés 18 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 17 juin 2011
9 juil. 2004 à 10:00
ok merci a toi pour cette réponse rapide, je vais essayé ça. As tu essayé d'autres commandes comme les demandes d'infos du disque, le n° de série (avec la commande EC je crois)?
CoreBreaker Messages postés 540 Date d'inscription dimanche 23 mars 2003 Statut Membre Dernière intervention 5 octobre 2007 1
8 juil. 2004 à 23:33
Merci les gars ça fait plaisir
Attention ce programme, n'est pas compilable dans des environnements de développement 32bits comme Visual que ce soit pour la version C ou ASM. Car on accède au disque par le BIOS et donc au bas niveau. Il faut un environnement de dev 16bit comme turboC ou BorlandC/C++ 4.0
FP_SEG, FP_OFF, et int86x sont la bibliothèque DOS.H qui en l'occurence n'existe pas sous Visual
teknocrack Messages postés 18 Date d'inscription mercredi 9 avril 2003 Statut Membre Dernière intervention 17 juin 2011
8 juil. 2004 à 13:23
le code vraiment digne d'expert, condensé, clair et commenté, et je trouve le niveau tres haut. Toutefois chez moi ça ne marche pas. Je suis loin d'être un expert en C et encore moins en assembleur, mais j'ai ^dû recréer l'union REGS, et la structure SREGS. Apres ça mon Visual C++ 6 me demande toujours ce que signifie int86x, FP_SEG et FP_OFF. C'est dû à visual C++ 6?
Merci de dire aussi à quoi servent ces "fonctions".
SwordONe0v3riDe Messages postés 15 Date d'inscription mardi 6 août 2002 Statut Membre Dernière intervention 29 août 2005
15 avril 2003 à 06:32
Comme quoi yen a qui déchire bien... :)
Un p'tit bout d'code qui peut être bien utile... :)
Je parle bien sûr de la source C... Cela dit il m'a suffit de lire le code asm pour avoir envie d'm'y remettre... :)
Merci d'avoir commenté tes sources... (faut encourager le peu de gens qui le font...)
Bonne continuation...