1 1 1 1 1 1 1 1 1 1 Рейтинг 0.00 (0 Голоса(ов)

Читаем Partition Table

Описываем необходимые типы

Код Delphi:
  1. type
  2. Tmbr = packed record
  3. bootstrap_code: packed array [0..439] of byte;
  4. serial_num: packed array [0..3] of byte;
  5. reserved: packed array [0..1] of byte;
  6. end;
  7.  
  8. type
  9. TPartitionTableEntry = packed record
  10. BootIndicator: Byte; // $80, если активный (загрузочный) раздел
  11. StartingHead: Byte;
  12. StartingCylAndSect: Word;
  13. SystemIndicator: Byte;
  14. EndingHead: Byte;
  15. EndingCylAndSect: Word;
  16. StartingSector: DWORD; // начальный сектор
  17. NumberOfSects: DWORD; // количество секторов
  18. end;
  19.  
  20. type TPartitionTable = packed array [0..3] of TPartitionTableEntry;
  21.  
  22. type PDriveInfo = ^TDriveInfo;
  23. TDriveInfo = record
  24. MBR: Tmbr;
  25. PartitionTable: TPartitionTable;
  26. LogicalDrives: array [0..3] of PDriveInfo;
  27. Signature: array[0..1] of byte;
  28. end;

... константы

Код Delphi:
  1. const
  2. PartitionTableOffset = $1be;
  3. ExtendedPartitions = [5,$f];

... и функции

Код Delphi:
  1. function TForm1.DecodeSystemIndicator(si: byte):string;
  2. var s: string;
  3. begin
  4. case si of
  5. $01: s:='DOS 12-bit FAT';
  6. $02: s:='XENIX root';
  7. $03: s:='XENIX /usr';
  8. $04: s:='DOS 3.0+ 16-bit FAT (up to 32M)';
  9. $05: s:='DOS Extended partition (DOS 3.3+)';
  10. $06: s:='DOS 3.31+ 16-bit FAT (over 32M)';
  11. $07: s:='NTFS или OS/2 IFS или exFAT';
  12. $08: s:='OS/2 (v1.0-1.3 only) или AIX boot partition или SplitDrive или Commodore DOS';
  13. $09: s:='AIX data partition или Coherent filesystem или QNX 1.x and 2.x ("qnz")';
  14. $0A: s:='OS/2 Boot Manager или Coherent swap partition или OPUS';
  15. $0B: s:='FAT32';
  16. $0C: s:='FAT32, LBA-mapped';
  17. $0D: s:='SILICON SAFE';
  18. $0E: s:='FAT16, LBA-mapped';
  19. $0F: s:='Extended, LBA-mapped';
  20. $11: s:='Hidden FAT12';
  21. $12: s:='Configuration/diagnostics partition';
  22. $14: s:='Hidden DOS 16-bit FAT <32M';
  23. $16: s:='Hidden DOS 16-bit FAT >=32M';
  24. $17: s:='Hidden IFS (e.g., HPFS)';
  25. $18: s:='AST SmartSleep Partition';
  26. $1B: s:='Hidden WIN95 OSR2 FAT32';
  27. $1C: s:='Hidden WIN95 OSR2 FAT32, LBA-mapped';
  28. $1E: s:='Hidden WIN95 16-bit FAT, LBA-mapped';
  29. $24: s:='NEC DOS 3.x';
  30. $27: s:='PQservice или Windows RE hidden partition или MirOS partition или RouterBOOT kernel partition';
  31. $2A: s:='AtheOS File System (AFS)';
  32. $2B: s:='SyllableSecure (SylStor)';
  33. $32: s:='NOS';
  34. $35: s:='JFS on OS/2 or eCS';
  35. $38: s:='THEOS ver 3.2 2gb partition';
  36. $39: s:='Plan 9 partition или THEOS ver 4 spanned partition';
  37. $3A: s:='THEOS ver 4 4gb partition';
  38. $3B: s:='THEOS ver 4 extended partition';
  39. $3C: s:='PartitionMagic recovery partition';
  40. $3D: s:='Hidden NetWare';
  41. $40: s:='Venix 80286 или PICK';
  42. $41: s:='Linux/MINIX (sharing disk with DRDOS) или Personal RISC Boot или PPC PReP (Power PC Reference Platform) Boot';
  43. $42: s:='Linux swap (sharing disk with DRDOS) или SFS (Secure Filesystem) или Windows 2000 dynamic extended partition marker';
  44. $43: s:='Linux native (sharing disk with DRDOS)';
  45. $44: s:='GoBack partition';
  46. $45: s:='Boot-US boot manager или Priam или EUMEL/Elan';
  47. $46: s:='EUMEL/Elan';
  48. $47: s:='EUMEL/Elan';
  49. $48: s:='EUMEL/Elan';
  50. $4A: s:='Mark Aitchison''s ALFS/THIN lightweight filesystem for DOS или AdaOS Aquila (Withdrawn)';
  51. $4C: s:='Oberon partition';
  52. $4D: s:='QNX4.x';
  53. $4E: s:='QNX4.x 2nd part';
  54. $4F: s:='QNX4.x 3rd part или Oberon partition';
  55. $50: s:='OnTrack Disk Manager (older versions) RO или Lynx RTOS или Native Oberon (alt)';
  56. $51: s:='Ontrack extended partition или Novell';
  57. $52: s:='CP/M или Microport SysV/AT';
  58. $53: s:='Disk Manager 6.0 Aux3';
  59. $54: s:='Disk Manager 6.0 Dynamic Drive Overlay (DDO)';
  60. $55: s:='EZ-Drive';
  61. $56: s:='Golden Bow VFeature Partitioned Volume или DM converted to EZ-BIOS или AT&T MS-DOS 3.x logically sectored FAT.';
  62. $57: s:='DrivePro или VNDI Partition';
  63. $5C: s:='Priam EDisk';
  64. $61: s:='SpeedStor';
  65. $63: s:='Unix System V (SCO, ISC Unix, UnixWare, ...), Mach, GNU Hurd';
  66. $64: s:='Novell Netware 286, 2.xx';
  67. $65: s:='Novell Netware 386, 3.xx or 4.xx';
  68. $66: s:='Novell Netware SMS Partition';
  69. $67: s:='Novell';
  70. $69: s:='Novell Netware 5+, Novell Netware NSS Partition';
  71. $70: s:='DiskSecure Multi-Boot';
  72. $72: s:='V7/x86';
  73. $74: s:='Scramdisk partition';
  74. $75: s:='IBM PC/IX';
  75. $77: s:='M2FS/M2CS partition или VNDI Partition';
  76. $78: s:='XOSL FS';
  77. $80: s:='MINIX until 1.4a';
  78. $81: s:='MINIX since 1.4b, early Linux или Mitac disk manager';
  79. $82: s:='Prime или Solaris x86 или Linux swap';
  80. $83: s:='Linux native partition';
  81. $84: s:='OS/2 hidden C: drive или Hibernation partition';
  82. $85: s:='Linux extended partition';
  83. $86: s:='Old Linux RAID partition superblock или FAT16 volume set';
  84. $87: s:='NTFS volume set';
  85. $88: s:='Linux plaintext partition table';
  86. $8A: s:='Linux Kernel Partition (used by AiR-BOOT)';
  87. $8B: s:='Legacy Fault Tolerant FAT32 volume';
  88. $8C: s:='Legacy Fault Tolerant FAT32 volume using BIOS extd INT 13h';
  89. $8D: s:='Free FDISK 0.96+ hidden Primary DOS FAT12 partitition';
  90. $8E: s:='Linux Logical Volume Manager partition';
  91. $90: s:='Free FDISK 0.96+ hidden Primary DOS FAT16 partitition';
  92. $91: s:='Free FDISK 0.96+ hidden DOS extended partitition';
  93. $92: s:='Free FDISK 0.96+ hidden Primary DOS large FAT16 partitition';
  94. $93: s:='Hidden Linux native partition или Amoeba';
  95. $94: s:='Amoeba bad block table';
  96. $95: s:='MIT EXOPC native partitions';
  97. $96: s:='CHRP ISO-9660 filesystem';
  98. $97: s:='Free FDISK 0.96+ hidden Primary DOS FAT32 partitition';
  99. $98: s:='Free FDISK 0.96+ hidden Primary DOS FAT32 partitition (LBA) или Datalight ROM-DOS Super-Boot Partition';
  100. $99: s:='DCE376 logical drive';
  101. $9A: s:='Free FDISK 0.96+ hidden Primary DOS FAT16 partitition (LBA)';
  102. $9B: s:='Free FDISK 0.96+ hidden DOS extended partitition (LBA)';
  103. $9E: s:='ForthOS partition';
  104. $9F: s:='BSD/OS';
  105. $A0: s:='Laptop hibernation partition';
  106. $A1: s:='Laptop hibernation partition или HP Volume Expansion (SpeedStor variant)';
  107. $A3: s:='HP Volume Expansion (SpeedStor variant)';
  108. $A4: s:='HP Volume Expansion (SpeedStor variant)';
  109. $A5: s:='BSD/386, 386BSD, NetBSD, FreeBSD';
  110. $A6: s:='OpenBSD или HP Volume Expansion (SpeedStor variant)';
  111. $A7: s:='NeXTStep';
  112. $A8: s:='Mac OS-X';
  113. $A9: s:='NetBSD';
  114. $AA: s:='Olivetti Fat 12 1.44MB Service Partition';
  115. $AB: s:='Mac OS-X Boot partition или GO! partition';
  116. $AD: s:='RISC OS ADFS';
  117. $AE: s:='ShagOS filesystem';
  118. $AF: s:='ShagOS swap partition или MacOS X HFS';
  119. $B0: s:='BootStar Dummy';
  120. $B1: s:='HP Volume Expansion (SpeedStor variant) или QNX Neutrino Power-Safe filesystem';
  121. $B2: s:='QNX Neutrino Power-Safe filesystem';
  122. $B3: s:='HP Volume Expansion (SpeedStor variant) или QNX Neutrino Power-Safe filesystem';
  123. $B4: s:='HP Volume Expansion (SpeedStor variant)';
  124. $B6: s:='HP Volume Expansion (SpeedStor variant) или Corrupted Windows NT mirror set (master), FAT16 file system';
  125. $B7: s:='Corrupted Windows NT mirror set (master), NTFS file system или BSDI BSD/386 filesystem';
  126. $B8: s:='BSDI BSD/386 swap partition';
  127. $BB: s:='Boot Wizard hidden';
  128. $BC: s:='Acronis backup partition';
  129. $BD: s:='BonnyDOS/286';
  130. $BE: s:='Solaris 8 boot partition';
  131. $BF: s:='New Solaris x86 partition';
  132. $C0: s:='CTOS или REAL/32 secure small partition или NTFT Partition или DR-DOS/Novell DOS secured partition';
  133. $C1: s:='DRDOS/secured (FAT-12)';
  134. $C2: s:='Hidden Linux';
  135. $C3: s:='Hidden Linux swap';
  136. $C4: s:='DRDOS/secured (FAT-16, < 32M)';
  137. $C5: s:='DRDOS/secured (extended)';
  138. $C6: s:='DRDOS/secured (FAT-16, >= 32M) или Windows NT corrupted FAT16 volume/stripe set';
  139. $C7: s:='Windows NT corrupted NTFS volume/stripe set или Syrinx boot';
  140. $C8: s:='Reserved for DR-DOS 8.0+';
  141. $C9: s:='Reserved for DR-DOS 8.0+';
  142. $CA: s:='Reserved for DR-DOS 8.0+';
  143. $CB: s:='DR-DOS 7.04+ secured FAT32 (CHS)/';
  144. $CC: s:='DR-DOS 7.04+ secured FAT32 (LBA)/';
  145. $CD: s:='CTOS Memdump?';
  146. $CE: s:='DR-DOS 7.04+ FAT16X (LBA)/';
  147. $CF: s:='DR-DOS 7.04+ secured EXT DOS (LBA)/';
  148. $D0: s:='REAL/32 secure big partition или Multiuser DOS secured partition';
  149. $D1: s:='Old Multiuser DOS secured FAT12';
  150. $D4: s:='Old Multiuser DOS secured FAT16 <32M';
  151. $D5: s:='Old Multiuser DOS secured extended partition';
  152. $D6: s:='Old Multiuser DOS secured FAT16 >=32M';
  153. $D8: s:='CP/M-86';
  154. $DA: s:='Non-FS Data или Powercopy Backup';
  155. $DB: s:='Digital Research CP/M, Concurrent CP/M, Concurrent DOS или CTOS (Convergent Technologies OS -Unisys) или KDG Telemetry SCPU boot';
  156. $DD: s:='Hidden CTOS Memdump?';
  157. $DE: s:='Dell PowerEdge Server utilities (FAT fs)';
  158. $DF: s:='DG/UX virtual disk manager partition или BootIt EMBRM';
  159. $E0: s:='Reserved by STMicroelectronics for a filesystem called ST AVFS.';
  160. $E1: s:='DOS access or SpeedStor 12-bit FAT extended partition';
  161. $E3: s:='DOS R/O or SpeedStor';
  162. $E4: s:='SpeedStor 16-bit FAT extended partition < 1024 cyl.';
  163. $E5: s:='Tandy MSDOS with logically sectored FAT';
  164. $E6: s:='Storage Dimensions SpeedStor';
  165. $E8: s:='LUKS';
  166. $EA: s:='Rufus extra partition или Freedesktop boot';
  167. $EB: s:='BeOS BFS';
  168. $EC: s:='SkyOS SkyFS';
  169. $EE: s:='Indication that this legacy MBR is followed by an EFI header';
  170. $EF: s:='Partition that contains an EFI file system';
  171. $F0: s:='Linux/PA-RISC boot loader';
  172. $F1: s:='Storage Dimensions SpeedStor';
  173. $F2: s:='DOS 3.3+ secondary partition';
  174. $F4: s:='SpeedStor large partition или Prologue single-volume partition';
  175. $F5: s:='Prologue multi-volume partition';
  176. $F6: s:='Storage Dimensions SpeedStor';
  177. $F7: s:='DDRdrive Solid State File System';
  178. $F9: s:='pCache';
  179. $FA: s:='Bochs';
  180. $FB: s:='VMware File System partition';
  181. $FC: s:='VMware Swap partition';
  182. $FD: s:='Linux raid partition with autodetect using persistent superblock';
  183. $FE: s:='SpeedStor > 1024 cyl или LANstep или IBM PS/2 IML (Initial Microcode Load) partition, located at the end of the disk или Windows NT Disk Administrator hidden partition или Linux Logical Volume Manager partition (old)';
  184. $FF: s:='Xenix Bad Block Table';
  185. end;
  186. DecodeSystemIndicator:=s;
  187. end;
  188.  
  189. function TForm1.GetDriveInfo(DriveNumber: Byte; var DriveInfo: TDriveInfo;
  190. StartingSector: DWORD; BytesPerSector: DWORD = 512): Boolean;
  191. var
  192. buf: array of byte;
  193. CurExPartOffset: DWORD;
  194. i: byte;
  195. begin
  196. SetLength(buf,BytesPerSector);
  197. // читаем сектор в буфер
  198. if ReadSectors(DriveNumber,MainExPartOffset+StartingSector,1,@buf[0]) = 0 then
  199. begin
  200. Result := False;
  201. Exit;
  202. end;
  203. // заполняем MBR
  204. move(buf[0],DriveInfo.MBR,sizeof(Tmbr));
  205. // заполняем структуру DriveInfo.PartitionTable
  206. move(buf[PartitionTableOffset],DriveInfo.PartitionTable,SizeOf(TPartitionTable));
  207. // заполняем сигнатуру
  208. move(buf[$1FE],DriveInfo.Signature,SizeOf(DriveInfo.Signature));
  209. Finalize(buf); // буфер больше не нужен
  210. Result := True;
  211. for i := 0 to 3 do // для каждой записи в Partition Table
  212. if DriveInfo.PartitionTable[i].SystemIndicator in ExtendedPartitions then
  213. begin
  214. New(DriveInfo.LogicalDrives[i]);
  215. if MainExPartOffset = 0 then
  216. begin
  217. MainExPartOffset := DriveInfo.PartitionTable[i].StartingSector;
  218. CurExPartOffset := 0;
  219. end
  220. else
  221. CurExPartOffset := DriveInfo.PartitionTable[i].StartingSector;
  222. Result := Result and GetDriveInfo(DriveNumber,DriveInfo.LogicalDrives[i]^,
  223. CurExPartOffset,BytesPerSector);
  224. end
  225. else
  226. DriveInfo.LogicalDrives[i] := nil;
  227. end;

Функцию ReadSectors Вы найдете тут.

Ну и понеслось

Код Delphi:
  1. GetDriveInfo(Drive,DriveInfo,0,DiskGeometry.BytesPerSector);
  2. ToLog('==Partition table==');
  3. for i:=0 to length(DriveInfo.PartitionTable)-1 do
  4. begin
  5. if (DriveInfo.PartitionTable[i].SystemIndicator>0) then
  6. begin
  7. ToLog('>>PT'+IntToStr(i));
  8. if (DriveInfo.PartitionTable[i].BootIndicator=$80) then
  9. ToLog('>>>Загрузочный раздел ('+IntToStr(DriveInfo.PartitionTable[i].BootIndicator)+')')
  10. else
  11. ToLog('>>>Незагрузочный раздел ('+IntToStr(DriveInfo.PartitionTable[i].BootIndicator)+')');
  12. ToLog('>>>Начальная поверхность: '+IntToStr(DriveInfo.PartitionTable[i].StartingHead));
  13. ToLog('>>>Начальные цилиндр и сектор: '+IntToStr(DriveInfo.PartitionTable[i].StartingCylAndSect));
  14. ToLog('>>>Системный индикатор: '+IntToStr(DriveInfo.PartitionTable[i].SystemIndicator)+' ('+DecodeSystemIndicator(DriveInfo.PartitionTable[i].SystemIndicator)+')');
  15. ToLog('>>>Конечная поверхность: '+IntToStr(DriveInfo.PartitionTable[i].EndingHead));
  16. ToLog('>>>Конечные цилиндр и сектор: '+IntToStr(DriveInfo.PartitionTable[i].EndingCylAndSect));
  17. ToLog('>>>Начальный сектор: '+IntToStr(DriveInfo.PartitionTable[i].StartingSector));
  18. ToLog('>>>Число секторов: '+IntToStr(DriveInfo.PartitionTable[i].NumberOfSects));
  19. // Развернуть логические диски
  20. if (DriveInfo.LogicalDrives[i]<>nil) then
  21. begin
  22. ToLog('===Логический диск '+IntToStr(I)+'===');
  23. for i1:= 0 to length(DriveInfo.LogicalDrives[i].PartitionTable)-1 do
  24. begin
  25. if (DriveInfo.LogicalDrives[i].PartitionTable[i1].SystemIndicator>0) then
  26. begin
  27. ToLog('>>>>PT'+IntToStr(i1));
  28. if (DriveInfo.LogicalDrives[i].PartitionTable[i1].BootIndicator=$80) then
  29. ToLog('>>>>>Загрузочный раздел ('+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].BootIndicator)+')')
  30. else
  31. ToLog('>>>>>Незагрузочный раздел ('+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].BootIndicator)+')');
  32. ToLog('>>>>>Начальная поверхность: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].StartingHead));
  33. ToLog('>>>>>Начальные цилиндр и сектор: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].StartingCylAndSect));
  34. ToLog('>>>>>Системный индикатор: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].SystemIndicator)+' ('+DecodeSystemIndicator(DriveInfo.LogicalDrives[i].PartitionTable[i1].SystemIndicator)+')');
  35. ToLog('>>>>>Конечная поверхность: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].EndingHead));
  36. ToLog('>>>>>Конечные цилиндр и сектор: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].EndingCylAndSect));
  37. ToLog('>>>>>Начальный сектор: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].StartingSector));
  38. ToLog('>>>>>Число секторов: '+IntToStr(DriveInfo.LogicalDrives[i].PartitionTable[i1].NumberOfSects));
  39. end;
  40. end;
  41. end;
  42. end;
  43. end;

 Как вычислить DiskGeometry.BytesPerSector смотрите тут.

Оставьте свой комментарий

Оставить комментарий как гость

0
  • Комментариев нет