/*++ Copyright (C) Microsoft Corporation, 1996 - 1999 Module Name: ondisk.hxx Abstract: This header file defines support for manipulating the on disk structures. Author: Norbert Kusters 15-July-1996 Notes: Revision History: --*/ extern "C" { #include } class FT_LOGICAL_DISK_INFORMATION; typedef FT_LOGICAL_DISK_INFORMATION* PFT_LOGICAL_DISK_INFORMATION; class FT_LOGICAL_DISK_INFORMATION : public FT_BASE_CLASS { public: NTSTATUS Initialize( IN PROOT_EXTENSION RootExtension, IN OUT PDEVICE_OBJECT WholeDiskPdo ); NTSTATUS Write( ); PFT_LOGICAL_DISK_DESCRIPTION GetFirstLogicalDiskDescription( ); PFT_LOGICAL_DISK_DESCRIPTION GetNextLogicalDiskDescription( IN PFT_LOGICAL_DISK_DESCRIPTION CurrentDiskDescription ); PFT_LOGICAL_DISK_DESCRIPTION AddLogicalDiskDescription( IN PFT_LOGICAL_DISK_DESCRIPTION LogicalDiskDescription ); ULONG QueryDiskDescriptionFreeSpace( ); VOID DeleteLogicalDiskDescription( IN PFT_LOGICAL_DISK_DESCRIPTION LogicalDiskDescription ); BOOLEAN AddReplaceLog( IN FT_LOGICAL_DISK_ID ReplacedMemberLogicalDiskId, IN FT_LOGICAL_DISK_ID NewMemberLogicalDiskId, IN ULONG NumberOfChangedDiskIds, IN PFT_LOGICAL_DISK_ID OldLogicalDiskIds, IN PFT_LOGICAL_DISK_ID NewLogicalDiskIds ); BOOLEAN ClearReplaceLog( ); BOOLEAN BackOutReplaceOperation( ); BOOLEAN BackOutReplaceOperationIf( IN PFT_LOGICAL_DISK_INFORMATION LogicalDiskInformation ); ULONGLONG GetGptAttributes( ); NTSTATUS SetGptAttributes( IN ULONGLONG GptAttributes ); PROOT_EXTENSION GetRootExtension( ) { return _rootExtension; }; PDEVICE_OBJECT GetWholeDisk( ) { return _wholeDisk; }; PDEVICE_OBJECT GetWholeDiskPdo( ) { return _wholeDiskPdo; }; ULONG QueryDiskNumber( ) { return _diskNumber; }; ULONG QuerySectorSize( ) { return _sectorSize; }; ~FT_LOGICAL_DISK_INFORMATION( ); private: PROOT_EXTENSION _rootExtension; PDEVICE_OBJECT _wholeDisk; PDEVICE_OBJECT _wholeDiskPdo; ULONG _diskNumber; ULONG _sectorSize; LARGE_INTEGER _byteOffset; ULONG _length; PVOID _diskBuffer; BOOLEAN _isDiskSuitableForFtOnDisk; }; class FT_LOGICAL_DISK_INFORMATION_SET : public FT_BASE_CLASS { public: NTSTATUS Initialize( ); NTSTATUS AddLogicalDiskInformation( IN PFT_LOGICAL_DISK_INFORMATION LogicalDiskInformation, OUT PBOOLEAN ChangedLogicalDiskIds ); NTSTATUS RemoveLogicalDiskInformation( IN PDEVICE_OBJECT WholeDiskPdo ); BOOLEAN IsDiskInSet( IN PDEVICE_OBJECT WholeDiskPdo ); PFT_LOGICAL_DISK_DESCRIPTION GetLogicalDiskDescription( IN FT_LOGICAL_DISK_ID LogicalDiskId, IN ULONG InstanceNumber ); PFT_LOGICAL_DISK_DESCRIPTION GetParentLogicalDiskDescription( IN FT_LOGICAL_DISK_ID LogicalDiskId, OUT PULONG DiskInformationNumber = NULL ); PFT_LOGICAL_DISK_DESCRIPTION GetParentLogicalDiskDescription( IN PFT_LOGICAL_DISK_DESCRIPTION LogicalDiskDescription, IN ULONG DiskInformationNumber ); ULONG QueryNumberOfRootLogicalDiskIds( ); FT_LOGICAL_DISK_ID QueryRootLogicalDiskId( IN ULONG Index ); FT_LOGICAL_DISK_ID QueryRootLogicalDiskIdForContainedPartition( IN ULONG DiskNumber, IN LONGLONG Offset ); FT_LOGICAL_DISK_ID QueryPartitionLogicalDiskId( IN ULONG DiskNumber, IN LONGLONG Offset ); USHORT QueryNumberOfMembersInLogicalDisk( IN FT_LOGICAL_DISK_ID LogicalDiskId ); FT_LOGICAL_DISK_ID QueryMemberLogicalDiskId( IN FT_LOGICAL_DISK_ID LogicalDiskId, IN USHORT MemberNumber ); FT_LOGICAL_DISK_TYPE QueryLogicalDiskType( IN FT_LOGICAL_DISK_ID LogicalDiskId ); BOOLEAN QueryFtPartitionInformation( IN FT_LOGICAL_DISK_ID PartitionLogicalDiskId, OUT PLONGLONG Offset, OUT PDEVICE_OBJECT* WholeDisk, OUT PULONG DiskNumber, OUT PULONG SectorSize, OUT PLONGLONG PartitionSize ); PVOID GetConfigurationInformation( IN FT_LOGICAL_DISK_ID LogicalDiskId ); PVOID GetStateInformation( IN FT_LOGICAL_DISK_ID LogicalDiskId ); BOOLEAN IsLogicalDiskComplete( IN FT_LOGICAL_DISK_ID LogicalDiskId ); UCHAR QueryDriveLetter( IN FT_LOGICAL_DISK_ID LogicalDiskId ); NTSTATUS SetDriveLetter( IN FT_LOGICAL_DISK_ID LogicalDiskId, IN UCHAR DriveLetter ); NTSTATUS WriteStateInformation( IN FT_LOGICAL_DISK_ID LogicalDiskId, IN PVOID LogicalDiskState, IN USHORT LogicalDiskStateSize ); NTSTATUS CreatePartitionLogicalDisk( IN ULONG DiskNumber, IN LONGLONG Offset, IN LONGLONG PartitionSize, OUT PFT_LOGICAL_DISK_ID NewLogicalDiskId ); NTSTATUS AddNewLogicalDisk( IN FT_LOGICAL_DISK_TYPE NewLogicalDiskType, IN USHORT NumberOfMembers, IN PFT_LOGICAL_DISK_ID ArrayOfMembers, IN USHORT ConfigurationInformationSize, IN PVOID ConfigurationInformation, IN USHORT StateInformationSize, IN PVOID StateInformation, OUT PFT_LOGICAL_DISK_ID NewLogicalDiskId ); NTSTATUS BreakLogicalDisk( IN FT_LOGICAL_DISK_ID LogicalDiskId ); NTSTATUS ReplaceLogicalDiskMember( IN FT_LOGICAL_DISK_ID LogicalDiskId, IN USHORT MemberNumberToReplace, IN FT_LOGICAL_DISK_ID NewMemberLogicalDiskId, OUT PFT_LOGICAL_DISK_ID NewLogicalDiskId ); NTSTATUS MigrateRegistryInformation( IN PDEVICE_OBJECT Partition, IN ULONG DiskNumber, IN LONGLONG Offset ); VOID DeleteFtRegistryInfo( IN FT_LOGICAL_DISK_ID LogicalDiskId ); PFT_LOGICAL_DISK_INFORMATION FindLogicalDiskInformation( IN PDEVICE_OBJECT WholeDiskPdo ); ~FT_LOGICAL_DISK_INFORMATION_SET( ); private: BOOLEAN ReallocRootLogicalDiskIds( IN ULONG NewNumberOfEntries ); VOID RecomputeArrayOfRootLogicalDiskIds( ); BOOLEAN ComputeNewParentLogicalDiskIds( IN FT_LOGICAL_DISK_ID LogicalDiskId, OUT PULONG NumLogicalDiskIds, OUT PFT_LOGICAL_DISK_ID* OldLogicalDiskIds, OUT PFT_LOGICAL_DISK_ID* NewLogicalDiskIds ); BOOLEAN GetDiskDescription( IN PDISK_CONFIG_HEADER Registry, IN PDISK_PARTITION DiskPartition, IN PFT_LOGICAL_DISK_DESCRIPTION CheckDiskDescription, OUT PFT_LOGICAL_DISK_DESCRIPTION* DiskDescription ); ULONG DiskNumberFromSignature( IN ULONG Signature ); ULONG _numberOfLogicalDiskInformations; PFT_LOGICAL_DISK_INFORMATION* _arrayOfLogicalDiskInformations; ULONG _numberOfRootLogicalDisksIds; PFT_LOGICAL_DISK_ID _arrayOfRootLogicalDiskIds; }; typedef FT_LOGICAL_DISK_INFORMATION_SET* PFT_LOGICAL_DISK_INFORMATION_SET;