Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

270 lines
5.3 KiB

  1. /*++
  2. Copyright (c) 1999 Microsoft Corporation
  3. Module Name:
  4. ex.h
  5. Abstract:
  6. Private header file for ex.c
  7. Author:
  8. Matthew D Hendel (math) 07-Sept-1999
  9. Revision History:
  10. --*/
  11. #pragma once
  12. //
  13. // Macro definitions
  14. //
  15. #define FSTUB_TAG ('BtsF')
  16. #define PARTITION_ENTRY_SIZE (128)
  17. #define MIN_PARTITION_COUNT (128)
  18. //
  19. // The disk information structure contains all the information required to
  20. // partition the disk.
  21. //
  22. typedef struct _DISK_INFORMATION {
  23. //
  24. // The DeviceObject representing this disk.
  25. //
  26. PDEVICE_OBJECT DeviceObject;
  27. //
  28. // The sector size of the disk.
  29. //
  30. ULONG SectorSize;
  31. //
  32. // The geometry information for the disk.
  33. //
  34. INTERNAL_DISK_GEOMETRY Geometry;
  35. //
  36. // A scratch buffer of size SectorSize where information can be read into.
  37. //
  38. PVOID ScratchBuffer;
  39. //
  40. // How many logical blocks there are in this disk.
  41. //
  42. ULONGLONG SectorCount;
  43. } DISK_INFORMATION, *PDISK_INFORMATION;
  44. enum {
  45. PRIMARY_PARTITION_TABLE,
  46. BACKUP_PARTITION_TABLE
  47. };
  48. C_ASSERT (PARTITION_ENTRY_SIZE == sizeof (EFI_PARTITION_ENTRY));
  49. #define IS_VALID_DISK_INFO(_Disk) \
  50. ((_Disk) != NULL && \
  51. (_Disk)->DeviceObject != NULL && \
  52. (_Disk)->SectorSize != 0 && \
  53. (_Disk)->ScratchBuffer != NULL && \
  54. (_Disk)->SectorCount != 0)
  55. #define ROUND_TO(_val,_factor) \
  56. ((((_val) + (_factor) - 1) / (_factor)) * (_factor))
  57. #define max(a,b) (((a) > (b)) ? (a) : (b))
  58. #define IS_NULL_GUID(_guid)\
  59. ((_guid).Data1 == 0 && \
  60. (_guid).Data2 == 0 && \
  61. (_guid).Data3 == 0 && \
  62. (_guid).Data4[0] == 0 && \
  63. (_guid).Data4[1] == 0 && \
  64. (_guid).Data4[2] == 0 && \
  65. (_guid).Data4[3] == 0 && \
  66. (_guid).Data4[4] == 0 && \
  67. (_guid).Data4[5] == 0 && \
  68. (_guid).Data4[6] == 0 && \
  69. (_guid).Data4[7] == 0)
  70. NTSTATUS
  71. FstubReadPartitionTableMBR(
  72. IN PDISK_INFORMATION Disk,
  73. IN BOOLEAN RecognizedPartitionsOnly,
  74. OUT PDRIVE_LAYOUT_INFORMATION_EX* ReturnedDriveLayout
  75. );
  76. NTSTATUS
  77. FstubDetectPartitionStyle(
  78. IN PDISK_INFORMATION Disk,
  79. OUT PARTITION_STYLE* PartitionStyle
  80. );
  81. NTSTATUS
  82. FstubGetDiskGeometry(
  83. IN PDEVICE_OBJECT DeviceObject,
  84. IN PINTERNAL_DISK_GEOMETRY Geometry
  85. );
  86. NTSTATUS
  87. FstubAllocateDiskInformation(
  88. IN PDEVICE_OBJECT DeviceObject,
  89. OUT PDISK_INFORMATION * DiskBuffer,
  90. IN PINTERNAL_DISK_GEOMETRY Geometry OPTIONAL
  91. );
  92. NTSTATUS
  93. FstubFreeDiskInformation(
  94. IN OUT PDISK_INFORMATION Disk
  95. );
  96. NTSTATUS
  97. FstubWriteBootSectorEFI(
  98. IN CONST PDISK_INFORMATION Disk
  99. );
  100. PDRIVE_LAYOUT_INFORMATION
  101. FstubConvertExtendedToLayout(
  102. IN PDRIVE_LAYOUT_INFORMATION_EX LayoutEx
  103. );
  104. NTSTATUS
  105. FstubWritePartitionTableMBR(
  106. IN PDISK_INFORMATION Disk,
  107. IN PDRIVE_LAYOUT_INFORMATION_EX LayoutEx
  108. );
  109. NTSTATUS
  110. FstubWriteEntryEFI(
  111. IN PDISK_INFORMATION Disk,
  112. IN ULONG PartitionEntryBlockCount,
  113. IN ULONG EntryNumber,
  114. IN PEFI_PARTITION_ENTRY PartitionEntry,
  115. IN ULONG Partition,
  116. IN BOOLEAN Flush,
  117. IN OUT ULONG32* PartialCheckSum
  118. );
  119. NTSTATUS
  120. FstubWriteHeaderEFI(
  121. IN PDISK_INFORMATION Disk,
  122. IN ULONG PartitionEntryBlockCount,
  123. IN GUID DiskGUID,
  124. IN ULONG32 MaxPartitionCount,
  125. IN ULONG64 FirstUsableLBA,
  126. IN ULONG64 LastUsableLBA,
  127. IN ULONG32 CheckSum,
  128. IN ULONG Partition
  129. );
  130. VOID
  131. FstubAdjustPartitionCount(
  132. IN ULONG SectorSize,
  133. IN OUT PULONG PartitionCount
  134. );
  135. NTSTATUS
  136. FstubCreateDiskEFI(
  137. IN PDEVICE_OBJECT DeviceObject,
  138. IN PCREATE_DISK_GPT DiskInfo
  139. );
  140. NTSTATUS
  141. FstubCreateDiskMBR(
  142. IN PDEVICE_OBJECT DeviceObject,
  143. IN PCREATE_DISK_MBR DiskInfo
  144. );
  145. NTSTATUS
  146. FstubCreateDiskRaw(
  147. IN PDEVICE_OBJECT DeviceObject
  148. );
  149. VOID
  150. FstubCopyEntryEFI(
  151. OUT PEFI_PARTITION_ENTRY Entry,
  152. IN PPARTITION_INFORMATION_EX Partition,
  153. IN ULONG SectorSize
  154. );
  155. NTSTATUS
  156. FstubWritePartitionTableEFI(
  157. IN PDISK_INFORMATION Disk,
  158. IN GUID DiskGUID,
  159. IN ULONG32 MaxPartitionCount,
  160. IN ULONG64 FirstUsableLBA,
  161. IN ULONG64 LastUsableLBA,
  162. IN ULONG PartitionTable,
  163. IN ULONG PartitionCount,
  164. IN PPARTITION_INFORMATION_EX PartitionArray
  165. );
  166. NTSTATUS
  167. FstubReadHeaderEFI(
  168. IN PDISK_INFORMATION Disk,
  169. IN ULONG PartitionTable,
  170. OUT PEFI_PARTITION_HEADER* HeaderBuffer
  171. );
  172. NTSTATUS
  173. FstubReadPartitionTableEFI(
  174. IN PDISK_INFORMATION Disk,
  175. IN ULONG PartitionTable,
  176. OUT PDRIVE_LAYOUT_INFORMATION_EX* ReturnedDriveLayout
  177. );
  178. NTSTATUS
  179. FstubWriteSector(
  180. IN PDEVICE_OBJECT DeviceObject,
  181. IN ULONG SectorSize,
  182. IN ULONG64 SectorNumber,
  183. IN PVOID Buffer
  184. );
  185. NTSTATUS
  186. FstubReadSector(
  187. IN PDEVICE_OBJECT DeviceObject,
  188. IN ULONG SectorSize,
  189. IN ULONG64 SectorNumber,
  190. OUT PVOID Buffer
  191. );
  192. NTSTATUS
  193. FstubSetPartitionInformationEFI(
  194. IN PDISK_INFORMATION Disk,
  195. IN ULONG PartitionNumber,
  196. IN SET_PARTITION_INFORMATION_GPT* PartitionInfo
  197. );
  198. NTSTATUS
  199. FstubUpdateDiskGeometryEFI(
  200. IN PDISK_INFORMATION OldDisk,
  201. IN PDISK_INFORMATION NewDisk
  202. );
  203. NTSTATUS
  204. FstubVerifyPartitionTableEFI(
  205. IN PDISK_INFORMATION Disk,
  206. IN BOOLEAN FixErrors
  207. );