windows-nt/Source/XPSP1/NT/base/cluster/clusrtl/disk.h
2020-09-26 16:20:57 +08:00

534 lines
12 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name:
disk.h
Abstract:
Interface for routines that query and manipulate the
disk configuration of the current system.
Author:
John Vert (jvert) 10/10/1996
Revision History:
--*/
#ifndef _CLUSRTL_DISK_H_
#define _CLUSRTL_DISK_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <nt.h>
#include <ntrtl.h>
#include <nturtl.h>
#ifdef __cplusplus
}
#endif
#ifdef __cplusplus
#ifndef __AFX_H__
#undef ASSERT // make afx.h happy
#endif
#include <afxwin.h> // MFC core and standard components
#include <afxext.h> // MFC extensions
#include <afxcmn.h> // MFC support for Windows 95 Common Controls
#include "afxtempl.h"
#include "winioctl.h"
#include "ntddscsi.h"
#include "ntdskreg.h"
#include "ntddft.h"
#include "ntddstor.h"
//
// classes representing info stored in Machine\System\Disk\Information
// registry key
//
class CFtInfoPartition {
public:
// initialize from registry data
CFtInfoPartition(class CFtInfoDisk *Disk, DISK_PARTITION UNALIGNED *Description);
// initialize from data on disk
CFtInfoPartition(class CFtInfoDisk *Disk, class CPhysicalPartition *Partition);
CFtInfoPartition(class CFtInfoDisk *Disk, PARTITION_INFORMATION *PartitionInfo);
~CFtInfoPartition();
VOID GetData(PDISK_PARTITION pDest);
DWORD GetOffset();
VOID SetOffset(DWORD NewOffset) {m_RelativeOffset = NewOffset;};
VOID MakeSticky(UCHAR DriveLetter);
BOOL IsFtPartition() { return(m_PartitionInfo->FtType != NotAnFtMember);};
DISK_PARTITION UNALIGNED *m_PartitionInfo;
class CFtInfoDisk *m_ParentDisk;
private:
DWORD m_RelativeOffset; // relative offset from parent DISK_DESCRIPTION
BOOL m_Modified;
};
class CFtInfoDisk {
public:
// initialize from registry data
CFtInfoDisk(DISK_DESCRIPTION UNALIGNED *Description);
// initialize from data on disk
CFtInfoDisk(class CPhysicalDisk *Disk);
CFtInfoDisk(DRIVE_LAYOUT_INFORMATION *DriveLayoutData);
// ?
CFtInfoDisk(CFtInfoDisk *DiskInfo);
~CFtInfoDisk();
//
// Overloaded operators
//
BOOL operator==(const CFtInfoDisk& Disk1);
CFtInfoPartition *GetPartition(LARGE_INTEGER StartingOffset,
LARGE_INTEGER Length);
CFtInfoPartition *GetPartitionByOffset(DWORD Offset);
CFtInfoPartition *GetPartitionByIndex(DWORD Index);
DWORD FtPartitionCount();
DWORD GetSize();
VOID GetData(PBYTE pDest);
DWORD GetOffset() {return m_Offset;};
VOID SetOffset(DWORD NewOffset) {m_Offset = NewOffset;};
DWORD m_PartitionCount;
DWORD m_Signature;
private:
DWORD m_Offset;
CTypedPtrList<CPtrList, CFtInfoPartition*> m_PartitionInfo;
};
//
// class representing FTDISK registry information. Currently not used
//
class CFtInfoFtSet {
public:
CFtInfoFtSet() { m_FtDescription = NULL; }
~CFtInfoFtSet();
//
// Initialization
//
BOOL Initialize(USHORT Type, FT_STATE FtVolumeState);
BOOL Initialize(class CFtInfo *FtInfo, PFT_DESCRIPTION Description);
//
// Overloaded operators
//
BOOL operator==(const CFtInfoFtSet& FtSet1);
DWORD GetSize() const;
VOID GetData(PBYTE pDest);
DWORD GetMemberCount() const { return((DWORD)m_Members.GetSize()); };
BOOL IsAlone();
DWORD AddMember(CFtInfoPartition *Partition, PFT_MEMBER_DESCRIPTION Description, USHORT FtGroup);
CFtInfoPartition *GetMemberBySignature (DWORD Signature) const;
CFtInfoPartition *GetMemberByIndex (DWORD Index) const;
PFT_MEMBER_DESCRIPTION GetMemberDescription(DWORD Index) {
return(&m_FtDescription->FtMemberDescription[Index]);
};
USHORT GetType() const {return(m_FtDescription->Type);};
FT_STATE GetState() const {return(m_FtDescription->FtVolumeState);};
private:
BOOL m_Modified;
PFT_DESCRIPTION m_FtDescription;
CTypedPtrArray<CPtrArray, CFtInfoPartition*> m_Members;
};
//
// main registry info class. holds lists of disk and ftset registry info along
// with methods for extracting info from lists
//
class CFtInfo {
public:
CFtInfo();
CFtInfo(HKEY hKey, LPWSTR lpszValueName);
CFtInfo(PDISK_CONFIG_HEADER Header);
CFtInfo(CFtInfoFtSet *FtSet);
~CFtInfo();
//
// commit changes to FtInfo database to the registry
//
DWORD CommitRegistryData();
DWORD GetSize();
VOID GetData(PDISK_CONFIG_HEADER pDest);
CFtInfoPartition *FindPartition(DWORD Signature,
LARGE_INTEGER StartingOffset,
LARGE_INTEGER Length);
CFtInfoPartition *FindPartition(UCHAR DriveLetter);
CFtInfoDisk *FindDiskInfo(DWORD Signature);
CFtInfoDisk *EnumDiskInfo(DWORD Index);
VOID AddDiskInfo(CFtInfoDisk *NewDisk) { m_DiskInfo.AddTail( NewDisk ); }
VOID SetDiskInfo(CFtInfoDisk *NewDisk);
BOOL DeleteDiskInfo(DWORD Signature);
CFtInfoFtSet *EnumFtSetInfo(DWORD Index);
CFtInfoFtSet *FindFtSetInfo(DWORD Signature);
BOOL DeleteFtSetInfo(CFtInfoFtSet *FtSet);
VOID AddFtSetInfo(CFtInfoFtSet *FtSet, CFtInfoFtSet *OldFtSet = NULL);
private:
CTypedPtrList<CPtrList, CFtInfoDisk*> m_DiskInfo;
CTypedPtrList<CPtrList, CFtInfoFtSet*> m_FtSetInfo;
VOID Initialize(HKEY hKey, LPWSTR lpszValueName);
VOID Initialize(PDISK_CONFIG_HEADER Header, DWORD Length);
VOID Initialize();
public:
LPBYTE m_buffer;
DWORD m_bufferLength;
};
//
// disk and related partition classes built from actual probing of disks via
// IOCTLs and other disk APIs. This info is built "bottom up" in that the disk
// config is discovered via the SetupDi APIs
//
class CPhysicalDisk {
public:
CPhysicalDisk() { m_FtInfo = NULL; }
DWORD Initialize(CFtInfo *FtInfo, LPWSTR DeviceName);
BOOL IsSticky();
DWORD MakeSticky(CFtInfo *FtInfo);
BOOL IsNTFS();
DWORD FtPartitionCount() {
if (m_FtInfo == NULL) {
return(0);
} else {
return(m_FtInfo->FtPartitionCount());
}
};
DWORD m_PartitionCount;
DWORD m_Signature;
DWORD m_DiskNumber;
BOOL m_IsSCSI;
BOOL m_IsRemovable;
CTypedPtrList<CPtrList, class CPhysicalPartition*> m_PartitionList;
CTypedPtrList<CPtrList, class CLogicalDrive*> m_LogicalDriveList;
BOOL ShareBus(CPhysicalDisk *OtherDisk);
SCSI_ADDRESS m_ScsiAddress;
CString m_Identifier;
CFtInfoDisk *m_FtInfo;
private:
HANDLE GetPhysicalDriveHandle(DWORD Access);
HANDLE GetPhysicalDriveHandle(DWORD Access, LPWSTR DeviceName);
};
class CPhysicalPartition {
public:
CPhysicalPartition(CPhysicalDisk *Disk, PPARTITION_INFORMATION Info);
CPhysicalDisk *m_PhysicalDisk;
PARTITION_INFORMATION m_Info;
CFtInfoPartition *m_FtPartitionInfo;
};
//
// class representing a drive as represented by a drive letter. built in a
// "top down" fashion in that each drive letter is examined to determine the
// physical partition to which the letter is mapped. This structure only
// exists if the logical drive is a real disk, i.e., not built for CDROMs,
// etc.
//
class CLogicalDrive {
public:
CLogicalDrive() {
m_Partition = NULL;
m_ContainerSet = NULL;
}
BOOL Initialize(CPhysicalPartition *Partition);
BOOL IsSCSI(VOID);
BOOL ShareBus(CLogicalDrive *OtherDrive);
DWORD MakeSticky();
WCHAR m_DriveLetter;
CString m_VolumeLabel;
CString m_Identifier;
BOOL m_IsNTFS;
BOOL m_IsSticky;
CPhysicalPartition *m_Partition;
class CFtSet *m_ContainerSet;
};
//
// logical class for FT sets. not used
//
class CFtSet {
public:
CFtSet() { m_FtInfo = NULL; }
BOOL Initialize(class CDiskConfig *Config, CFtInfoFtSet *FtInfo);
CFtInfoFtSet *m_FtInfo;
DWORD MakeSticky();
BOOL IsSticky(VOID);
BOOL IsNTFS(VOID);
BOOL IsSCSI(VOID);
BOOL ShareBus(CLogicalDrive *OtherDrive);
CTypedPtrList<CPtrList, CLogicalDrive*> m_OtherVolumes;
CLogicalDrive Volume;
CTypedPtrList<CPtrList, CPhysicalPartition*> m_Member;
};
//
// main disk configuration class.
//
class CDiskConfig {
public:
CDiskConfig() { m_SystemVolume = NULL; }
~CDiskConfig();
BOOL Initialize(VOID);
CTypedPtrList<CPtrList, CFtSet*> m_FtSetList;
// database of physical drives indexed by drive number.
CMap<int, int, CPhysicalDisk*, CPhysicalDisk*&> m_PhysicalDisks;
// database of logical drives indexed by drive letter
CMap<WCHAR, WCHAR, CLogicalDrive*, CLogicalDrive*&> m_LogicalDrives;
VOID RemoveAllFtInfoData();
VOID RemoveDisk(CPhysicalDisk *Disk);
DWORD MakeSticky(CPhysicalDisk *Disk);
DWORD MakeSticky(CFtSet *FtSet);
VOID SetDiskInfo(CFtInfoDisk *NewDisk) {
m_FTInfo.DeleteDiskInfo(NewDisk->m_Signature);
m_FTInfo.SetDiskInfo(NewDisk);
m_FTInfo.CommitRegistryData();
};
CPhysicalPartition *FindPartition(CFtInfoPartition *FtPartition);
BOOL OnSystemBus(CPhysicalDisk *Disk);
BOOL OnSystemBus(CFtSet *FtSet);
DWORD MakeSystemDriveSticky() {
if (m_SystemVolume) {
return(MakeSticky(m_SystemVolume->m_Partition->m_PhysicalDisk));
} else {
return(ERROR_SUCCESS);
}
};
CLogicalDrive *m_SystemVolume;
private:
CFtInfo m_FTInfo;
};
typedef struct _DRIVE_LETTER_INFO {
UINT DriveType;
STORAGE_DEVICE_NUMBER DeviceNumber;
} DRIVE_LETTER_INFO, *PDRIVE_LETTER_INFO;
extern DRIVE_LETTER_INFO DriveLetterMap[];
#endif
// Some handy C wrappers for the C++ stuff.
//
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _FT_INFO *PFT_INFO;
typedef struct _FULL_FTSET_INFO *PFULL_FTSET_INFO;
typedef struct _FT_DISK_INFO *PFT_DISK_INFO;
typedef struct _DISK_INFO *PDISK_INFO;
typedef struct _FULL_DISK_INFO *PFULL_DISK_INFO;
PFT_INFO
DiskGetFtInfo(
VOID
);
VOID
DiskFreeFtInfo(
PFT_INFO FtInfo
);
DWORD
DiskEnumFtSetSignature(
IN PFULL_FTSET_INFO FtSet,
IN DWORD MemberIndex,
OUT LPDWORD MemberSignature
);
DWORD
DiskSetFullFtSetInfo(
IN PFT_INFO FtInfo,
IN PFULL_FTSET_INFO FtSet
);
PFULL_FTSET_INFO
DiskGetFullFtSetInfo(
IN PFT_INFO FtInfo,
IN LPCWSTR lpszMemberList,
OUT LPDWORD pSize
);
PFULL_FTSET_INFO
DiskGetFullFtSetInfoByIndex(
IN PFT_INFO FtInfo,
IN DWORD Index,
OUT LPDWORD pSize
);
VOID
DiskMarkFullFtSetDirty(
IN PFULL_FTSET_INFO FtSet
);
DWORD
DiskDeleteFullFtSetInfo(
IN PFT_INFO FtInfo,
IN LPCWSTR lpszMemberList
);
BOOL
DiskFtInfoEqual(
IN PFULL_FTSET_INFO Info1,
IN PFULL_FTSET_INFO Info2
);
FT_TYPE
DiskFtInfoGetType(
IN PFULL_FTSET_INFO Info
);
BOOL
DiskCheckFtSetLetters(
IN PFT_INFO FtInfo,
IN PFULL_FTSET_INFO Bytes,
OUT WCHAR *Letter
);
DWORD
DiskSetFullDiskInfo(
IN PFT_INFO FtInfo,
IN PFULL_DISK_INFO Bytes
);
PFULL_DISK_INFO
DiskGetFullDiskInfo(
IN PFT_INFO FtInfo,
IN DWORD Signature,
OUT LPDWORD pSize
);
enum {
DISKRTL_REPLACE_IF_EXISTS = 0x1,
DISKRTL_COMMIT = 0x2,
};
DWORD
DiskAddDiskInfoEx(
IN PFT_INFO DiskInfo,
IN DWORD DiskIndex,
IN DWORD Signature,
IN DWORD Options
);
DWORD
DiskAddDriveLetterEx(
IN PFT_INFO DiskInfo,
IN DWORD Signature,
IN LARGE_INTEGER StartingOffset,
IN LARGE_INTEGER PartitionLength,
IN UCHAR DriveLetter,
IN DWORD Options
);
DWORD
DiskCommitFtInfo(
IN PFT_INFO FtInfo
);
PFT_INFO
DiskGetFtInfoFromFullDiskinfo(
IN PFULL_DISK_INFO Bytes
);
PFT_DISK_INFO
FtInfo_GetFtDiskInfoBySignature(
IN PFT_INFO FtInfo,
IN DWORD Signature
);
DISK_PARTITION UNALIGNED *
FtDiskInfo_GetPartitionInfoByIndex(
IN PFT_DISK_INFO DiskInfo,
IN DWORD Index
);
DWORD
FtDiskInfo_GetPartitionCount(
IN PFT_DISK_INFO DiskInfo
);
//
// Error handlers to be defined by the user of this library
//
VOID
DiskErrorFatal(
INT MessageId,
DWORD Error,
LPSTR File,
DWORD Line
);
VOID
DiskErrorLogInfo(
LPSTR String,
...
);
#ifdef __cplusplus
}
#endif
#endif // _CLUSRTL_DISK_H_