/*++ Copyright (c) 1999 Microsoft Corporation Module Name: ex.h Abstract: Private header file for ex.c Author: Matthew D Hendel (math) 07-Sept-1999 Revision History: --*/ #pragma once // // Macro definitions // #define FSTUB_TAG ('BtsF') #define PARTITION_ENTRY_SIZE (128) #define MIN_PARTITION_COUNT (128) // // The disk information structure contains all the information required to // partition the disk. // typedef struct _DISK_INFORMATION { // // The DeviceObject representing this disk. // PDEVICE_OBJECT DeviceObject; // // The sector size of the disk. // ULONG SectorSize; // // The geometry information for the disk. // INTERNAL_DISK_GEOMETRY Geometry; // // A scratch buffer of size SectorSize where information can be read into. // PVOID ScratchBuffer; // // How many logical blocks there are in this disk. // ULONGLONG SectorCount; } DISK_INFORMATION, *PDISK_INFORMATION; enum { PRIMARY_PARTITION_TABLE, BACKUP_PARTITION_TABLE }; C_ASSERT (PARTITION_ENTRY_SIZE == sizeof (EFI_PARTITION_ENTRY)); #define IS_VALID_DISK_INFO(_Disk) \ ((_Disk) != NULL && \ (_Disk)->DeviceObject != NULL && \ (_Disk)->SectorSize != 0 && \ (_Disk)->ScratchBuffer != NULL && \ (_Disk)->SectorCount != 0) #define ROUND_TO(_val,_factor) \ ((((_val) + (_factor) - 1) / (_factor)) * (_factor)) #define max(a,b) (((a) > (b)) ? (a) : (b)) #define IS_NULL_GUID(_guid)\ ((_guid).Data1 == 0 && \ (_guid).Data2 == 0 && \ (_guid).Data3 == 0 && \ (_guid).Data4[0] == 0 && \ (_guid).Data4[1] == 0 && \ (_guid).Data4[2] == 0 && \ (_guid).Data4[3] == 0 && \ (_guid).Data4[4] == 0 && \ (_guid).Data4[5] == 0 && \ (_guid).Data4[6] == 0 && \ (_guid).Data4[7] == 0) NTSTATUS FstubReadPartitionTableMBR( IN PDISK_INFORMATION Disk, IN BOOLEAN RecognizedPartitionsOnly, OUT PDRIVE_LAYOUT_INFORMATION_EX* ReturnedDriveLayout ); NTSTATUS FstubDetectPartitionStyle( IN PDISK_INFORMATION Disk, OUT PARTITION_STYLE* PartitionStyle ); NTSTATUS FstubGetDiskGeometry( IN PDEVICE_OBJECT DeviceObject, IN PINTERNAL_DISK_GEOMETRY Geometry ); NTSTATUS FstubAllocateDiskInformation( IN PDEVICE_OBJECT DeviceObject, OUT PDISK_INFORMATION * DiskBuffer, IN PINTERNAL_DISK_GEOMETRY Geometry OPTIONAL ); NTSTATUS FstubFreeDiskInformation( IN OUT PDISK_INFORMATION Disk ); NTSTATUS FstubWriteBootSectorEFI( IN CONST PDISK_INFORMATION Disk ); PDRIVE_LAYOUT_INFORMATION FstubConvertExtendedToLayout( IN PDRIVE_LAYOUT_INFORMATION_EX LayoutEx ); NTSTATUS FstubWritePartitionTableMBR( IN PDISK_INFORMATION Disk, IN PDRIVE_LAYOUT_INFORMATION_EX LayoutEx ); NTSTATUS FstubWriteEntryEFI( IN PDISK_INFORMATION Disk, IN ULONG PartitionEntryBlockCount, IN ULONG EntryNumber, IN PEFI_PARTITION_ENTRY PartitionEntry, IN ULONG Partition, IN BOOLEAN Flush, IN OUT ULONG32* PartialCheckSum ); NTSTATUS FstubWriteHeaderEFI( IN PDISK_INFORMATION Disk, IN ULONG PartitionEntryBlockCount, IN GUID DiskGUID, IN ULONG32 MaxPartitionCount, IN ULONG64 FirstUsableLBA, IN ULONG64 LastUsableLBA, IN ULONG32 CheckSum, IN ULONG Partition ); VOID FstubAdjustPartitionCount( IN ULONG SectorSize, IN OUT PULONG PartitionCount ); NTSTATUS FstubCreateDiskEFI( IN PDEVICE_OBJECT DeviceObject, IN PCREATE_DISK_GPT DiskInfo ); NTSTATUS FstubCreateDiskMBR( IN PDEVICE_OBJECT DeviceObject, IN PCREATE_DISK_MBR DiskInfo ); NTSTATUS FstubCreateDiskRaw( IN PDEVICE_OBJECT DeviceObject ); VOID FstubCopyEntryEFI( OUT PEFI_PARTITION_ENTRY Entry, IN PPARTITION_INFORMATION_EX Partition, IN ULONG SectorSize ); NTSTATUS FstubWritePartitionTableEFI( IN PDISK_INFORMATION Disk, IN GUID DiskGUID, IN ULONG32 MaxPartitionCount, IN ULONG64 FirstUsableLBA, IN ULONG64 LastUsableLBA, IN ULONG PartitionTable, IN ULONG PartitionCount, IN PPARTITION_INFORMATION_EX PartitionArray ); NTSTATUS FstubReadHeaderEFI( IN PDISK_INFORMATION Disk, IN ULONG PartitionTable, OUT PEFI_PARTITION_HEADER* HeaderBuffer ); NTSTATUS FstubReadPartitionTableEFI( IN PDISK_INFORMATION Disk, IN ULONG PartitionTable, OUT PDRIVE_LAYOUT_INFORMATION_EX* ReturnedDriveLayout ); NTSTATUS FstubWriteSector( IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG64 SectorNumber, IN PVOID Buffer ); NTSTATUS FstubReadSector( IN PDEVICE_OBJECT DeviceObject, IN ULONG SectorSize, IN ULONG64 SectorNumber, OUT PVOID Buffer ); NTSTATUS FstubSetPartitionInformationEFI( IN PDISK_INFORMATION Disk, IN ULONG PartitionNumber, IN SET_PARTITION_INFORMATION_GPT* PartitionInfo ); NTSTATUS FstubUpdateDiskGeometryEFI( IN PDISK_INFORMATION OldDisk, IN PDISK_INFORMATION NewDisk ); NTSTATUS FstubVerifyPartitionTableEFI( IN PDISK_INFORMATION Disk, IN BOOLEAN FixErrors );