182 lines
3.2 KiB
C
182 lines
3.2 KiB
C
|
//
|
||
|
// DISK.H - Classes for partition table manipulation
|
||
|
//
|
||
|
// Revision History:
|
||
|
//
|
||
|
|
||
|
#ifndef _SRT__DISK_H_
|
||
|
#define _SRT__DISK_H_
|
||
|
|
||
|
extern "C"
|
||
|
{
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <ntdddisk.h>
|
||
|
#include <diskguid.h>
|
||
|
}
|
||
|
#include <windows.h>
|
||
|
#include <sys.h>
|
||
|
|
||
|
|
||
|
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_
|