// // DISK.H - Classes for partition table manipulation // // Revision History: // #ifndef _SRT__DISK_H_ #define _SRT__DISK_H_ extern "C" { #include #include #include #include #include } #include #include class CDrive; #define PARTITION_NAME_LENGTH 36 typedef struct Geometry { LONGLONG cylinders; MEDIA_TYPE mediaType; ULONG tracksPerCylinder; // heads ULONG sectorsPerTrack; ULONG bytesPerSector; // sectorSize ULONGLONG totalSectorCount; // cylinders*tracksPerCylinder*sectorsPerTrack ULONG bytesPerCylinder; // tracksPerCylinder*sectorsPerTack*bytesPerSector ULONG bytesPerTrack; // sectorsPerTack*bytesPerSector } GEOMETRY, *PGEOMETRY; class CDrive { public: ULONG m_diskNumber; ULONG m_numPartitions; LONGLONG m_length; GEOMETRY m_geometry; LONGLONG m_trueLength; BOOLEAN m_isNEC98; PARTITION_STYLE m_style; // The partitioning style of the disk (MBR, GPT, unknown) union { // Information specific to the partitioning style struct { // The discriminator of the union is the field "style" ULONG m_signature; } m_mbr; struct { GUID m_diskId; LONGLONG m_startingUsableOffset; LONGLONG m_usableLength; ULONG m_maxPartitionCount; } m_gpt; } m_info; public: HRESULT Initialize( LPCTSTR lpszLogicalDrive ); ~CDrive( ); public: HRESULT ReadBootRecord( LPCTSTR lpszLogicalDrive, UINT nSectors, PBYTE *buffer ); HRESULT WriteBootRecord( LPCTSTR lpszLogicalDrive, UINT nSectors, PBYTE *buffer ); HRESULT WriteBootRecordXP( LPCTSTR lpszLogicalDrive, UINT nSectors, PBYTE *buffer ); }; /* * Low level functions for manipulating disks, partitions, * volumes, filesystems */ HANDLE LowOpenDisk( ULONG diskNumber ); HANDLE LowOpenPartition( ULONG diskNumber, ULONG partitionNumber ); HANDLE LowOpenPartition( LPCTSTR lpszLogicalDrive ); HRESULT LowGetGeometry( HANDLE handle, PDISK_GEOMETRY geometry ); HRESULT LowGetLength( HANDLE handle, PLONGLONG length ); HRESULT LowReadSectors( HANDLE handle, ULONG sectorSize, ULONG startingSector, ULONG numberOfSectors, PVOID buffer ); HRESULT LowWriteSectors( HANDLE handle, ULONG sectorSize, ULONG startingSector, ULONG numberOfSectors, PVOID buffer ); HRESULT LowFsLock( HANDLE handle ); HRESULT LowFsUnlock( HANDLE handle ); HRESULT LowFsDismount( HANDLE handle ); /* * Arithmetics */ LONGLONG RoundUp( LONGLONG value, LONGLONG factor ); LONGLONG RoundDown( LONGLONG value, LONGLONG factor ); #endif // _SRT__DISK_H_