ALERTE performance : la classe Win32_OperatingSystem !
La classe WMI Win32_OperatingSystem est très populaire (à juste titre) chez les administrateurs système. Elle est fréquemment utilisée par exemple pour exécuter des actions spécifiques ou appliquer des stratégies de groupes (GPO) spécifiques à une version de Windows.
Cette classe (cf http://msdn.microsoft.com/en-us/library/aa394239(v=vs.85).aspx ) semble bien anodine et ne « collecte » que des « informations statiques » .
C’est sans compter avec le champ NumberOfProcesses !
NumberOfProcesses
Data type: uint32
Access type: Read-only
Number of process contexts currently loaded or running on the operating system.
Pour déterminer la valeur de NumberOfProcesses, le provider WMI fait lui-même une requête WMI « SELECT __RELPATH FROM Win32_Process » qui charge considérablement le système.
Par exemple sur un « large serveur » RDS/Citrix avec :
Plusieurs GPOs ayant un filtre du type :Select * FROM Win32_OperatingSystem WHERE Version like '6.3%'
De scripts de logon avec des « select * Win32_OperatingSystem »
Des « brokers » ou des outils de monitoring exécutant des « Select * from Win32_Process »
De nombreux « logon »
Vous observerez rapidement :
une forte consommation CPU dans le process WMIPRVSE
des temps de « logon » important
une forte contention « kernel » liée à l’énumération des processus qui peut avoir des conséquences diverses et variées (lenteur lors du lancement du gestionnaire de tâches,…)
La solution est de limiter les champs retournés par la requête WQL. Le provider de la classe Win32_OperatingSystem ne collecte alors que les infos demandées. La requête « select Version from Win32_OperatingSystem » n’énumère pas la liste des processus.
Tip :
L’activation du tracing « WMI-Activity » (http://msdn.microsoft.com/en-us/library/aa826686(v=vs.85).aspx) permet d’identifier ce type de problème.
[10/17 03:46:47.0051 PM] [wbemtest.exe] [201c.1f84] ExecQuery: select * from win32_operatingsystem
[10/17 03:46:47.0401 PM] [wmiprvse.exe] [12a0.15d4] ExecQuery: references of {__Win32Provider.Name="CIMWin32"}
[10/17 03:46:47.0578 PM] [wmiprvse.exe] [12a0.15d4] ExecQuery: SELECT __RELPATH FROM Win32_Process
Travaillons aujourd’hui sur un autre scénario assez simple : Celui de la suppression accidentelle d’une partition.
Supposons que cette partition
soit devenue
Comme d’habitude, on contrôle les secteurs habituels et on voit celui qui pourrait manquer.
Au secteur 0, on a un MBR montrant une partition GPT qui occupe tout le disque
Au secteur 1, on retrouve un GPT Header :
Données:
Et le secteur 266338303 montre la même chose.
Le secteur 2 nous montre une table de partitions ne contenant que la partition MSR (comme quoi, rien n’est perdu), et le secteur 266338271 (Last usable +1) nous montre la même chose.
Allons donc voir si une partition NTFS pourrait trainer sur le disque.
Comme la partition MSR finit au secteur 262177, on devrait en trouver une plus loin, en principe aligné sur 64KB.
C’est au secteur 264192 que nous allons la trouver
Total Sectors : 266072063 (~126.8 GB) : Le secteur de fin devrait se trouver 266336255 ( = 266072063 + 264192 )
Clusters to MFT / MFTMirr : 786432 (LBA 6555648 = 264192 + 8*786432 ) / 2 (LBA 264208 = 264192 + 8*2)
Et ce sont bien des entrées de MFT que l’on trouve à ces secteurs:
Résumons-nous :
En principe, comme pour une partition MBR :
Quand vient le moment de formater, ne pas formater.
A ce moment-là, le secteur 264192 a été vidé de son contenu (puisque nous n’avons pas fourni de file system)
En écrasant ce secteur par celui que nous avons sauvegardé, c’est comme si nous formatons la partition.
DskProbe.exe permet d’écraser un secteur du disque.
Après vérification rapide (secteur de fin de partition, MFT, MFTMirr) un rescan du disque fait revenir la partition comme par magie.
Serge Gourraud55 AA
Maintenant que nous avons vu les structures qui décrivent les partitions des disques basiques GPT, voyons où nous pouvons rencontrer une corruption et comment la réparer (ou pas)
Si nous reprenons notre schéma, une corruption pourrait arriver :
La structure GPT est très robuste en ceci que windows maintient une consistance entre les GPT Header de début et de fin, ainsi que dans les tables de partitions de début et de fin, de façon à ce que si quelqu’un vient à supprimer l’un d’eux, il sera réparé au moins au prochain reboot.
La partie non protégée est le MBR (secteur 0) et c’est jusqu’à présent la seule corruption que j’ai eu à réparer sur des disques GPT Basiques.
Nous n’allons donc voir que deux types de corruption
Premier type de corruption (le seul déjà rencontré au support) : Vidage du MBR
Voilà à quoi cela ressemble dans le gestionnaire de disque :
A l’éditeur hexa, on ne voit que des 00:
Le secteur 1 contient bien ce qui ressemble à un GPT Header
Ses données semblent correctes
Signature : EFI PART
Revision: 1.0
Header Size : 92
Header CRC: 2038912732
Reserved1 : 0
This LBA : 1
Alternate LBA : 266338303
First Usable LBA: 34
Last Usable LBA : 266338270
Partition Entry LBA: 2
Partition Count : 128
Partition Entry Size : 128
Partition Array CRC : 1909465771
Disk GUID : 51063D81-877B-4536-B69E-0958EDB891C2
Si on ouvre le GPT Header alternative, on retrouve les mêmes données :
Si on parcours la table de partition (LBA 2) on trouve une table de partition contenant la MSR et 3 partitions de données. Dans mon cas, je n’ai que 3 partitions sur mon disque donc, les autres LBAs (jusqu’au 33) sont vides.
On peut reporter les données dans ce tableau (pour l’interprétation, se référer au chapitre précédent)
Partition 1
Partition 2
Partition 3
Partition 4
Partition Type
E3C9E326-0B5C-4DB8-817D-F92DF00215AE
EBD0A0A2-B9E5-4433-47C0-68B6B72699C7
Partition GUID
18516D6A-C900-4A25-888C-E27974E44EAA
0DC137A4-CEFF-48ED-8EF8-E08282AA555B
32781219-85A3-470B-A075-DBD480A9D685
3D0A2A5F-8F8A-43B6-B859-8EA9930DCBE6
Starting LBA
34
264192
184416256
245854208
Attribute Flags
0
Ending LBA
262177
184416255
245854207
266334207
Partition Name
Microsoft reserved partition
Basic data partition
Dans le cadre d’une réparation, il faut bien vérifier que les secteurs 264192/184416255 , 184416256/245854207 et 245854208/266334207 sont des secteurs NTFS et contrôler qu’ils pointent bien vers une MFT a priori correcte. (nous avons traité ces points dans les articles précédents)
Donc:
Seul le MBR est à reconstruire
Il ne nous reste plus qu’à réparer le MBR en se souvenant qu’ils sont tous identiques.
Partition table entry
Start head : 0
End head : FF (255)
Start sector : 2
End Sector : 3F (63)
Start Cylinder : 0
End Cylinder : 3FF (1023)
Relative Sector : 1
Total Sectors : FFFFFFFF (4294967295)
Partition Type : EE (GPT)
Magic number : 55 AA
En utilisant un éditeur hexa il reste à écrire ces données :
Et c’est tout. Un rescan du disque et on n’en parle plus.
Maintenant que les disques basiques MBR (partitions primaires et étendues) n’ont plus de secrets pour nous, nous allons nous intéresser au disques basiques GPT.
Reprenons le schéma qui décrit la structure d’un disque basique GPT et essayons de voir à quoi cela ressemble concrètement.
Commençons par le secteur 0:
Remarques:
Le MBR est dit “protecteur” car il contient une partition qui couvre tout le disque (Relative Sector 1 / Total Sectors FFFFFFFF), et aussi car nous avons des secteurs importants
Voici ce à quoi ressemble le secteur 1 :
Ce secteur est le GPT Header et contient ces informations :
Partition
Offset
Size
Sample value
Meaning
Sector Signature
8 bytes
"EFI PART"
Version
8
4 bytes
00 00 01 00
0.1
Header size
C
5C 00 00 00
5C
CRC32 of the header
10
0D 2C 34 EA
3929287693
Reserved
14
Current GPT Header Address
18
01 00 00 00 00 00 00 00
1
Backup GPT Header Address
20
FF FF DF 0F 00 00 00 00
266338303
First usable LBA
28
22 00 00 00 00 00 00 00
Last usable LBA
30
DE FF DF 0F 00 00 00 00
266338270
Disk GUID
38
16 bytes
85 A1 7E 9C 2D 05 3B 4A AC DD D1 FF 8F 7B 22 4A
9C7EA185-052D-4A3B-ACDD-D1FF8F7B224A
Partition Table Address
48
02 00 00 00 00 00 00 00
2
Partition Count
50
80 00 00 00
128
Partition Table Entry Size
54
CRC32 of partition table
58
3E C0 26 26
640073790
Toutes les données sont importantes, mais celles qui nous intéressent pour faire des réparations sont :
Cette structure est décrite sur http://msdn.microsoft.com/en-us/library/windows/desktop/aa365449(v=vs.85).aspx
Regardons le secteur 2 : Début de la table de partition.
Il faut y voir 4 régions de 128 bytes chacune : Une entrée dans la table de partition fait 128 bytes
Dans le cas présent, les 2 premières entrées sont occupées et les autres sont vides
Première entrée
Partition Table Entry
16 E3 C9 E3 5C 0B B8 4D 81 7D F9 2D F0 02 15 AE
E3C9E316-0B5C-4DB8-817D-F92DF00215AE
7C C6 D3 BB F9 D2 5F 42 9F 2C 7D CF 1F 1D 8B E5
BBD3C67C-D2F9-425F-9F2C-7DCF1F1D8BE5
21 00 04 00 00 00 00 00
Attribute flags
00 00 00 00 00 00 00 00
72 bytes
… too long…
Microsoft Reserved Partition
Seconde entrée
80+0
A2 A0 D0 EB E5 B9 33 44 87 C0 68 B6 B7 26 99 C7
80+10
BE 9C FD 21 F3 E8 40 49 8C C2 57 30 0A A8 1E B6
21FD9CBE-E8F3-4940-8CC2-57300AA81EB6
80+20
00 08 04 00 00 00 00 00
80+28
FF F7 DF 0F 00 00 00 00
266336255
80+30
80+38
Vous pourrez trouver des informations complémentaires sur ces structures dans l’article http://msdn.microsoft.com/en-us/library/windows/desktop/aa365449(v=vs.85).aspx
Plus d’informations sur la Microsoft Data Partition (MSR) dans la FAQ GPT:
http://msdn.microsoft.com/en-us/library/windows/hardware/dn640535(v=vs.85).aspx#gpt_faq_what_is_msr
Donc, la première entrée est pour la MSR et la seconde pour la partition de données de type « Basic Data Partition ».
Puisqu’il s’agit d’une partition NTFS, nous pouvons trouver les NTFS Boot Sectors aux LBA 264192 et 266336255
Et voilà:
On peut y lire:
Déjà on retrouve notre signature 55 AA (qui commençait à manquer un des mes amis blogueurs)
Le NTFS Boot sector de backup montrera la même information.
Le GPT Header nous avait parlé du Last Usable LBA (266338270)
Le LBA juste après montre bien une copie de la table de partition (266338270 + 1 = 266338271 )
Un espace de 128 entrées (si on en prend 4 par secteur de 512 ça fait 32 secteurs) est reservé pour y stocker toute la table de partitions
Les angoissés qui aiment que tout soit bien aligné éprouveront sans doute un plaisir non caché en constatant que 26638271 + 32 = 266338303 : C’est exactement l’emplacement du GPT Header alternatif.
C’est vrai que c’est rassurant quand même … quelque part … moi, je trouve ça rassurant.
Comme on adore les schémas qui montre la beauté de l’alignement des secteurs, en voici un qui reprend les valeurs que nous avons trouvées.
Voilà, vous savez désormais tout sur la façon dont les partitions sont référencées dans des disques GPT. Dans le prochain article, nous allons voir où peuvent se glisser des corruptions et comment les réparer (ou pas).
Supposons maintenant que ce disque qui contient ces 3 partitions :
Se soit transformé en ceci:
Ce sont des choses qui arrivent quand le MBR (secteur 0 du disque) a été vidé.
Rappelons la structure d’un disque contenant 3 partitions et essayons de voir ce qu’on a concrètement sur le disque
Le secteur 0 est vide: Pas de signature, pas de code, pas de table de partitions
Sur des disques MBR Basiques c’est au secteur 2048 que démarre la première partition (sur les anciennes architectures, on aurait cherché au secteur 63 voire 31 mais ça nous ramené à NT4.0)
Le secteur 2048 nous montre ceci :
Et nous pouvons y lire ces informations :
Pour résumer :
Le NTFS Boot Sector de backup en 163934207
Le secteur 786432 ressemble à un début de MFT
Et visiblement, on retrouve le nom du volume
Nous savons désormais que notre première partition démarre au secteur 2048 et finit au secteur 163934207
Comme tout est aligné, la seconde partition devrait démarrer au secteur 163934207 + 1 = 163934208
Fantastique!
On peut également y lire:
De même, la 3ième partition sensé démarrer un secteur plus loin y est bien présente :
225374207 + 1 = 225374208
Total sectors: 0270FFFF = 40959999 = 40959999 *512 = 20971519488 Bytes
Backup Boot Sector : 40959999 + 225374208 = 266334207
Il faudra faire un contrôle complet de chaque secteur important (NTFS / Backup NTFS / MFTMirr / MFT / MFT.$Volume) et on peut dresser cette carte du disque :
Il est très important de tout bien verifier: Si vous faites une erreur d’un secteur et que votre partition ne trouve pas sa MFT, notre vieil ami chkdsk se fera un plaisir d’un générer automatiquement une toute nouvelle MFT, tout vide, juste pour vous.
Et nous pouvons démarrer notre réparation
Première étape: Initialiser le disque (le code, la signature et une table de partition vide seront écrites)
Maintenant, il nous faut reprendre notre éditeur hexa préféré, le mien s’appelle DskProbe.exe car il permet d’appliquer un masque au données affichés par les secteurs.
(Pour information ce lien http://fr.wikipedia.org/wiki/%C3%89diteur_hexad%C3%A9cimalpropose une liste de produits)
Le secteur 0 que nous venons de réécrire (par initialisation) ressemble désormais à cela :
Avec DskProbe, nous pouvons faire paraitre la table de partition de ce secteur.
Les valeurs de début et fin de Head (=Side), Secteur et Cylindre dépendent de l’architecture, mais sont souvent les mêmes et voici celle qui convient de mettre pour la première partition de notre disque.
(Si vous avez plusieurs disques identiques sur votre ordinateur, ou un autre ordinateur avec le même disque qui n’a pas eu de soucis, vous pouvez récupérer les mêmes données)
Note : Il faut ajouter un secteur au Total Sectors du MBR par rapport au Total Sectors du NTFS Boot Sector puisqu’à cet endroit il faut compter les deux NTFS Boot Sector qui encadrent la partition, alors que dans le NTFS Boot Sector, on ne compte pas le dernier.
En récrivant « 07 » à l’offset du FileSystem de la première entrée de la table de partition.
Un rescan disk dans le Disk Manager nous fait reparaitre la partition comme par miracle:
On peut faire reparaitre les deux autres partitions en remplissant mes Start/End Side/Sector/Cylinder comme suit, et en adaptant les Relative et Total Sectors aux données relevées et en plaçant le type de système à NTFS (07) aux offset 01C2, 01D2, 01E2, 01F2 correspondant aux partitions respectives.
Si une des partitions par en chdksk, pas de chances : Soit vous vous êtes trompés dans vos calculs, soit la MFT avait besoin d’une réparation avant vos opérations.
Comme expliqué au premier article, toutes ces opérations sont des opérations de dernier recours, et ne garantissent aucunement la récupération de vos données.
Dans la prochaine série, nous nous intéressons aux disques GPT.
Pour faire reparaitre une partition disparue, nous avons besoin de peu de chose pour faire cette recuperation:
Nous allons voir comment récupérer une partition qui a disparu suite à une opération manuelle malencontreuse.
Windows étant un petit paresseux, nous savons que quand on supprime une partition, seule l’entrée dans la table de partition est supprimée.
Vérification:
Dans les architectures récentes, les partitions NTFS commencent le plus souvent au secteur 2048 (les anciennes démarraient au secteur 63).
Si ce n’est pas le cas, il faut chercher sur le disque. Certains éditeurs hexa permettent de le faire, dskprobe le permet.
Dans notre cas, le secteur 2048 est bien un secteur d’amorçage NTFS :
Nous pouvons identifier facilement :
Donc le NTFS Boot Sector de backup devrait se trouver au secteur 266334207 ( = 2048 + 266332159 )
Allons voir :
Vérifions que nous retrouvons bien la MFT
Le secteur 6293504 ressemble bien au premier metafichier de la MFT
Le metafichier $Volume nous fournit bien le bon nom de volume (à vérifier avec l’administrateur)
Donc en résumer, même si la partition a été supprimée, les données sont toujours présentes :
Ce qui reste à faire est donc la chose suivante :
Un rescan devrait faire reparaitre le disque.
Ces étapes en image :
1. Sauvegarde du contenu du secteur 2048 avec dskprobe2.exe
2. Création de la partition sans la formater
Suivant … Suivant … Jusqu’à l’option de formatage : Choisir l’option "Do not format this volume"
Nous obtenons une partition RAW :
3. Ecraser le NTFS Boot sector par celui sauvegarder
Dans DskProbe se placer sur le secteur 2048 du disque, et ouvrir le fichier que nous venons de sauvegarder Ecrire le fichier sur le secteur 2048 Vérifier qu’on écrit bien 1 secteur sur le secteur 2048 et cliquer sur "Write" Retourner au secteur 0 et remplacer le "06" à l’offset 1C2 par "07" : bien presser la touche 0 et la touche 7. Puis faire un Write
Dans DskProbe se placer sur le secteur 2048 du disque, et ouvrir le fichier que nous venons de sauvegarder
Ecrire le fichier sur le secteur 2048
Vérifier qu’on écrit bien 1 secteur sur le secteur 2048 et cliquer sur "Write"
Retourner au secteur 0 et remplacer le "06" à l’offset 1C2 par "07" : bien presser la touche 0 et la touche 7.
Puis faire un Write
Un Rescan Disk dans le Disk Manager fait reparaitre le disque
Pour pouvoir récupérer une partition NTFS, il faut savoir l'identifier. Une partition NTFS contient essentiellement:
Pour une description complète de chacun des champs : http://technet.microsoft.com/fr-fr/library/cc781134(WS.10).aspx
Pour rappel, la table de partition 0 nous montrait une partition démarrant au secteur 2048 et occupant 122972160 :
Examinons en détails le NTFS Boot Sector
Si on dresse un tableau de ces données on obtient ça:
Byte Offset
Field Length
Sample Value
Field Name
0x00
3 bytes
EB 52 90
Jump Instruction
0x03
NTFS
OEM ID
0x0B
2 bytes
00 02 (512)
Bytes per sector
0x0D
1 byte
08
Sectors per Cluster
0x0E
00 00
Reserved Sectors
0x10
00 00 00
Must be 0
0x13
0x15
F8
Media Descriptor
0x16
0x18
3F 00
Not used
0x1A
FF 00
0x1C
00 08 00 00 (0x800 = 2048)
0x20
00 00 00 00
0x24
80 00 80 00
0x28
FF 67 54 07 00 00 00 00 (122972159)*
Total Sectors
0x30
00 00 0C 00 00 00 00 00 (786432)
Clusters to $MFT
0x38
02 00 00 00 00 00 00 00 (2)
Clusters to $MFTMirr
0x40
F6 (246) **
Clusters Per MFT Record
0x41
0x44
01
Clusters Per Index Buffer
0x45
0x48
31 DD 45 AE 2B 46 AE FE
Volume Serial Number
0x50
*La table de partition présente au secteur 0 nous avait indiqué une partition occupant 122972160 secteurs. Ca fait un secteur de plus, car dans cette table, on compte le 1er secteur de la partition ainsi que le dernier. Dans le secteur d’amorçage NTFS on compte un secteur de moins. Il faudra s’en rappeler quand nous ferons des réparations.
**La taille de chaque enregistrement. NTFS fera un enregistrement pour chaque fichier et répertoire de son volume. Ceux dont la taille est inférieur à la taille d’un enregistrement sont résident dans la MFT. Si ce nombre est positif (entre 00 et 7F) alors il represente le nombre de cluster par enregistrement. Si le nombre est négatif (de 80 à FF), alors la taille d’un enregistrement est 2 à la puissance la valeur absolue de la valeur de ce champ.
Clusters to MFT est de 786432, et nous avons 8 secteurs par cluster. Donc, la MFT est localisée au secteur 6293504 ( = 2048 + 786432 * 8 )
Nous pouvons voir à cet emplacement, le premier fichier de la MFT : $MFT
Sachant que chaque enregistrement occupe 1K, il est possible de parcourir tous les enregistrements de la MFT jusqu’à, par exemple, l’enregistrement $Volume qui fournit le nom du volume. Puisqu’il s’agit du 4ième, nous le trouverons au secteur 6293510.
Si nous ne trouvons rien de ce genre à cet emplacement, c’est que soit la donnée a été écrasée, soit qu’on n’est pas au bon endroit : Le secteur d’amorçage n’est peut-être pas le bon, ou contient de mauvaises informations
Dans l’article suivant nous récupérons une partition.
Serge Gourraud
55 AA
Recupération de partitions III : Structures des disques basiques MBR - Les partitions étendues
Dans l’article précédent, nous avons vu un exemple de partitionnement contenant une et plusieurs partitions primaires. Afin de pouvoir mettre plus de quatre partitions sur un disque, il existe un système de partition étendue. En quelques mots :
- Si vous souhaitez 1 à 4 partitions : Vous aurez 4 partitions primaires
- Si vous souhaitez 5 partitions ou plus : Vous aurez 3 partitions primaires et 1 partition étendue contenant autant de volumes que souhaité.
Si on observe la table de partition à l’éditeur hexa, on sait qu’il n’y a la place que pour 4 entrées et on voit bien que les 4 entrées sont occupées.
La dernière entrée a ceci de particulier qu’elle est de type 0x0F (partition étendue), et qu’elle occupe 30722048 secteurs (ce qui nous donnerait à peu près 14 GB pour des secteurs de 512 Bytes)
Donc, si nous refaisons notre petit tableau récapitulatif:
Boot indicator
Starting Head
20 = 32
254
Starting Sector
21 = 33
63
Starting Cylinder
1023
System ID
07 (NTFS)
0F (Extended)
Ending Head
FE = 254
Ending Sector
Ending Cylinder
Relative Sector
00000800 = 2048
07547000 = 122974208
0A61B000 = 174174208
0E0B3000 = 235614208
07546800 = 122972160
030D4000 = 51200000
03A98000 = 61440000
01D4C800 = 30722048
Avant d’aller plus loin regardons à quoi ressemble le premier secteur d’une partition NTFS. La première partition (PPart01) est sensé démarrer au secteur 2048, et voici le secteur 2048 :
Nous détaillerons le contenu de ce secteur dans la partie 4, mais pour l’instant nous avons juste besoin de savoir que ce secteur est signé "55 AA" et qu’il contient bien le OEM ID "NTFS".
Regardons maintenant ce qui se trouve au secteur 235614208 (entrée de la 4ième partition). Il est quasiment vide, mais nous pouvons y reconnaitre une nouvelle table de partition dans la partie inférieure.
Cette table de partition contient deux entrées:
En passant tout ça à la moulinette, on peut construire ce petit tableau:
Entry 1
Entry 2
Entry 3
Entry 4
05 (Extended)
00FA0800 = 16386048
005DB800 = 6141952
003E8000 = 4096000
Quand on parcours une partition étendue, le Relative Sector ne fait pas référence au début du disque, mais au début de la partition étendue.
Comme notre partition étendue démarre au secteur 235614208, le premier volume NTFS devrait se trouver au secteur 235616256 ( = 235614208 + 2048 )
Cela reseemble bien à un secteur NTFS:
Maintenant, regardons ce qui se trouve à la seconde entrée de la table de partition. Son Relative Sector est 10242048 et la partition étendue démarrait au secteur 235614208. Donc l’entrée doit nous faire pointer vers le secteur 245856256 ( = 235614208 + 10242048 ). Allons voir :
C'est une nouvelle table de partition contenant ces informations:
La partition NTFS suivante démarre au secteur 245858304 ( = 245856256 + 2048 ) et la prochaine table de partition au secteur 252000256 ( = 235614208 + 16386048 )
Comme nous n’avons que 3 volumes dans la partition étendue, ce table de partition devrait être la dernière qui pointe vers une partition NTFS et nous n’avons qu’une seule entrée puisque nous n’avons pas d’autres volumes à déclarer.
Voilà comment Windows s’y prend pour faire entrer plusieurs partitions dans des tables qui ne peuvent en contenir que 4.
Dans l’article suivant, nous allons détailler le contenu d’un secteur d’amorçage NTFS afin de pouvoir commencer les réparations.
Dans l'article précédent, nous avons vu comment sont structurés les partitions et volumes sur les disques. Nous allons voir cela da façon concrète sur un disque MBR Basique.
Pour cela, j'utilise un éditeur hexadécimal et ouvre le disque aux secteurs qui m'interressent. L'éditeur que j'utilise s'apelle dskprobe.exe (un outil Microsoft assez basique qui affiche les secteurs par pages de 512 Bytes) mais vous pouvez utiliser celui qui vous convient le mieux. Une liste est disponible sur http://fr.wikipedia.org/wiki/%C3%89diteur_hexad%C3%A9cimal
Ouvrons le secteur 0 d'un disque MBR Basique.
En rouge:
En surligné : La table de partition, contenant 4 entrée.
La partie au dessus est du code.
Focalisons-nous sur la première entrée de la table de partition, et essayons de lui faire correspondre la description disponible sur http://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx
Taille du champ
Valeur
Nom du champ
01BE
00
Indicateur de boot:
01BF
Starting Head : 0x20 = 32 en décimal
01C0
6 bits
21
Starting Sector : 0x21 = 00100001 -> 00 100001 = 33
01C1
10 bits
Starting Cylinder : 0x00 = 00000000 -> 00 00000000 = 0
01C2
07
Type de partition. 07 signifie NTFS
http://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx
01C3
FE
Ending Head : 0xFE = 254
01C4
FF
Ending Sector : 0xFF = 11111111 -> 11111111
= 111111 = 63
01C5
Ending Cylinder : 0xFF = 11111111 -> 11 11111111 = 1111111111 = 1023
01C6
00 08 00 00
Relative Sector : 1er secteur de la partition (en GPT on appelera ça Starting LBA)
En little endian, lire : 00 00 08 00 = 0x800 = 2048
01CA
00 E8 DF 0F
Total Sectors : Le nombre de secteurs de la partition
0x0FDFE800 = 266332160
Ca veut dire que ce disque contient une partition NTFS qui démarre au secteur 2048 et occupe 266332160 secteurs.
Nous ne savons pas encore exactement quelle taille cela fait en Bytes, mais la plupart du temps, 1 secteur occupe 512 bytes. Ce qui nous fait (si on a des secteurs de 512 bytes)
Considérons maintenant quelque chose d'un peu plus fréquent: Un disque contenant plusieurs partitions.
Notre table de partition au secteur 0 pourrait bien ressembler à cela:
Ce qui nous donne ce petit tableau récapitulatif:
Indicateur de boot
21 * = 33
0 *
63 *
1023 *
00000800 * = 2048
07546800 * = 122972160
* *Toujours en suivant la petite moulinette de ne garder que 6 bits sur le 1er champ, et d'ajouter les 2 restants aux 8 d champs suivant
*A lire en little endian
Dans l’article suivant, nous détaillerons un disque contenant des partitions étendues.
Dans les articles qui suivent, nous évoquerons ces termes à maintes reprises. Autant se familiariser tout de suite avec ces termes :
L'objectif de ces articles est de parcourir les secteurs importants des disques pour comprendre où pourrait se placer une corruption et de la réparer (quand c'est possible) juste en écrivant la bonne information au bon endroit. Toutes les structures que nous allons parcourir sont déjà décrites dans MSDN.
Aussi, si vous souhaitez avoir plutôt une approche développeur, un bon point de départ serait d'invoquer un DeviceIoControl en utilisant le control code IOCTL_DISK_GET_DRIVE_LAYOUT_EX (cf. http://msdn.microsoft.com/fr-fr/library/windows/desktop/aa365174(v=vs.85).aspxpour plus de détails)
Ce contrôle vous fournira une structure de type DRIVE_LAYOUT_INFORMATION_EX
typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
DWORD PartitionStyle; DWORD PartitionCount; union { DRIVE_LAYOUT_INFORMATION_MBR Mbr; DRIVE_LAYOUT_INFORMATION_GPT Gpt; }; PARTITION_INFORMATION_EX PartitionEntry[1];
DWORD PartitionStyle;
DWORD PartitionCount;
union {
DRIVE_LAYOUT_INFORMATION_MBR Mbr;
DRIVE_LAYOUT_INFORMATION_GPT Gpt;
};
PARTITION_INFORMATION_EX PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
Nous n'évoquerons pas d'avantage cette approche dans cette série, mais cela pourrait faire le sujet d'une autre série si la demande est forte.
Comme expliqué, la MSDn regorge de schémas explicatifs mais essayons de les présenter différemment afin d'afficher plutôt une comparaison de ces structures, si cela peut aider.
Comparaison MBR et GPT
Différences principales (liste non exhaustive) dans les fonctionnalités:
MBR
GPT
Nombre de partitions primaires
4
Taille de disque maximale
2 TB
2^64 LBA = 8*2^30 TB
Protection de la table de partition
NON
OUI
Quelques références:
Comparaisons des structures identifiables, écrites à plat sur les disques basiques
Pour avoir une vision complète des disques basiques, aller sur http://technet.microsoft.com/en-us/library/cc739412(v=ws.10).aspx
Comparaisons des structures identifiables, écrites à plat sur les disques dynamiques
Pour avoir une vision complète des disques dynamiques, aller sur http://technet.microsoft.com/fr-fr/library/cc758035(v=WS.10).aspx
Comparaisons des disques basique et dynamiques
Différences principales (liste non exhaustive) en terme de fonctionnalités
Basiques
Dynamiques
Nombre maximal de volumes
> 4*
RAID Logiciel
Protection des volumes
Extension de volumes
OUI **
* Le nombre de volumes que peut supporter un disque dynamique n'est pas illimité car la database est limitée à 1 MB. Sachant que chaque disque dynamique attaché à un système contient la descroption de tous les volumes de ce système, rajouter des disques n'augmentera pas cette limite. Au contraire, il faudra rajouter des enregistrement pour en plus pour décrire le nouveau disque.
**Il est possible d'étendre un volume sur plusieurs disques dynamique, mais sur des disques basiques, on ne peut rester que sur le même disque.
Les différents types de volumes sont décrit sur : http://technet.microsoft.com/fr-fr/library/cc737048(v=WS.10).aspx
Dans le post suivant, nous allons tenter de voir concrètement comment cela se traduit en donnée brute écrite sur les disques.
Il arrive que les structures qui décrivent les partitions sur les disques soient perdues ou corrompues. Heureusement cela arrive assez rarement, mais quand c’est le cas, nous nous retrouvons en face d’un disque qui n’a plus du tout de partitions, ou des partitions affichées en RAW et on peut légitimement être inquiet, voire craindre d’avoir tout perdu. Comme ces données sont souvent cruciales, l’administrateur aura dans le meilleur des cas un backup (bien évident, puisque ces données sont cruciales) mais le temps de restauration de ce backup peut prendre plusieurs heures voire plusieurs journées. Dans le pire des cas, l’administrateur n’aura pas de backup (les données ne devaient pas être suffisamment importante).
Tant que (ou les) partitions sont absentes ou marquées comme RAW, la source du problème peut se trouver dans des erreurs au niveau des structures qui décrivent les partitions, et sous certaines conditions, il est possible de reconstruire ces structures et de faire reparaitre ces partitions dans Windows.
Le but des articles qui suivent est de décrire ces structures, les retrouver sur le disque, d’identifier les corruptions potentielles et de les corriger si possible.
La récupération d’une MFT corrompu ne fait pas l’objet de ces articles, et pour cela, nous ne pouvons que recommander l’utilisation de chkdsk.exe
Nous allons travailler sur les disques Basiques (MBR et GPT) et Dynamique (MBR et GPT) en suivant cet agenda: