windows-nt/Source/XPSP1/NT/base/ntsetup/textmode/kernel/spdrpriv.h
2020-09-26 16:20:57 +08:00

660 lines
15 KiB
C

/*++
Copyright (c) 1993 Microsoft Corporation
Module Name:
spdrpriv.h
Abstract:
Header file for disaster recovery symbols in text-mode setup. These
symbols are not to be referenced by modules other than those in the
ASR family.
Revision History:
Initial Code Michael Peterson (v-michpe) 13.May.1997
Code cleanup and changes Guhan Suriyanarayanan (guhans) 21.Aug.1999
--*/
#pragma once
#if defined(ULONG_MAX) && !defined(_INC_LIMITS)
#undef ULONG_MAX
#endif
#include <limits.h>
#ifndef _SPDRPRIV_DEFN_
#define _SPDRPRIV_DEFN_
///////////////////////////////////////////////////////////////////////////////
// Data Types //
///////////////////////////////////////////////////////////////////////////////
//
// For the InstallFiles section, we allow the file to end up on
// one of the following directories.
//
typedef enum _AsrCopyDirEnum {
_Temp = 0,
_Tmp,
_SystemRoot,
_Default
} AsrCopyDirEnum;
#define ASR_ALWAYS_PROMPT_FOR_MEDIA 0x00000001
#define ASR_PROMPT_USER_ON_MEDIA_ERROR 0x00000002
#define ASR_FILE_IS_REQUIRED 0x00000004
#define ASR_OVERWRITE_ON_COLLISION 0x00000010
#define ASR_PROMPT_USER_ON_COLLISION 0x00000020
typedef struct _SIF_INSTALLFILE_RECORD {
struct _SIF_INSTALLFILE_RECORD *Next;
PWSTR SystemKey;
PWSTR CurrKey;
PWSTR SourceMediaExternalLabel;
PWSTR DiskDeviceName;
PWSTR SourceFilePath;
PWSTR DestinationFilePath;
PWSTR VendorString;
DWORD Flags;
AsrCopyDirEnum CopyToDirectory;
} SIF_INSTALLFILE_RECORD, *PSIF_INSTALLFILE_RECORD;
typedef struct _SIF_INSTALLFILE_LIST {
PSIF_INSTALLFILE_RECORD First;
ULONG Count;
} SIF_INSTALLFILE_LIST, *PSIF_INSTALLFILE_LIST;
typedef struct _SIF_PARTITION_RECORD {
GUID PartitionTypeGuid; // GPT only
GUID PartitionIdGuid; // GPT only
ULONG64 GptAttributes; // GPT only
ULONGLONG StartSector;
ULONGLONG SectorCount;
ULONGLONG SizeMB; // value is calculated
struct _SIF_PARTITION_RECORD *Next;
struct _SIF_PARTITION_RECORD *Prev;
PWSTR PartitionName; // GPT only
//
// This member is valid iff this a boot partition record. Otherwise, this
// member is NULL
//
PWSTR NtDirectoryName;
PWSTR CurrPartKey;
PWSTR DiskKey;
PWSTR VolumeGuid; // May be NULL
//
// If this is a descriptor or container record, then this member
// refers to the logical disk record it contains. Otherwise, the
// value of this member is NULL. Valid only for MBR partitions.
//
PWSTR LogicalDiskKey;
//
// If this is a logical disk partition record, then this member
// refers to its Descriptor or Container partition record. Otherwise,
// the value of this member is NULL. Valid only for MBR partitions.
//
PWSTR DescriptorKey;
//
// This is a bit mask. Valid bits are
// 1: Boot partition (ASR_PTN_MASK_BOOT)
// 2: System partition (ASR_PTN_MASK_SYS)
// 4: DC1--tbd (ASR_PTN_MASK_DC1)
// 8: DC2--tbd (ASR_PTN_MASK_DC1)
//
ULONG PartitionFlag;
DWORD ClusterSize;
DWORD PartitionTableEntryIndex;
//
// GPT or MBR
//
PARTITION_STYLE PartitionStyle;
//
// The values of these members are read directly from the asr.sif file
//
UCHAR PartitionType; // mbr only
UCHAR ActiveFlag; // mbr only
UCHAR FileSystemType;
BOOLEAN IsPrimaryRecord;
//
// These can only be true for MBR partitions. All GPT partitions are
// primary partitions.
//
BOOLEAN IsContainerRecord;
BOOLEAN IsDescriptorRecord;
BOOLEAN IsLogicalDiskRecord;
BOOLEAN WillBeAutoextended;
// Used for dynamic disks.
BOOLEAN NeedsLdmRetype;
BOOLEAN IsAligned;
} SIF_PARTITION_RECORD, *PSIF_PARTITION_RECORD;
typedef struct _SIF_PARTITION_RECORD_LIST {
ULONGLONG DiskSectorCount;
ULONGLONG LastUsedSector;
ULONGLONG TotalMbRequired;
PSIF_PARTITION_RECORD First;
PSIF_PARTITION_RECORD Last;
ULONG ElementCount;
} SIF_PARTITION_RECORD_LIST, *PSIF_PARTITION_RECORD_LIST;
typedef struct _SIF_DISK_RECORD {
GUID SifDiskGptId; // Valid only for GPT disks
ULONGLONG TotalSectors;
//
// The values of these members are calculated from the partition records
// referencing this disk. If the disk does not contain an extended
// partition, then the value of the ExtendedPartitionStartSector is
// ULONG_MAX and the ExtendedPartitionSectorCount is zero (0).
//
ULONGLONG ExtendedPartitionStartSector;
ULONGLONG ExtendedPartitionSectorCount;
ULONGLONG ExtendedPartitionEndSector;
ULONGLONG LastUsedSector;
ULONGLONG LastUsedAlignedSector;
PSIF_PARTITION_RECORD_LIST PartitionList;
struct _DISK_PARTITION_SET *pSetRecord;
//
// The values of these members are read directly from the asr.sif
// file.
//
PWSTR SystemKey;
PWSTR CurrDiskKey;
ULONG SifDiskNumber;
DWORD BytesPerSector;
DWORD SectorsPerTrack;
DWORD TracksPerCylinder;
ULONG BusKey;
//
// This is only valid if this is an MBR disk
//
ULONG SifDiskMbrSignature;
ULONG MaxGptPartitionCount;
STORAGE_BUS_TYPE BusType;
//
// Either an MBR or a GPT Disk
//
PARTITION_STYLE PartitionStyle;
//
// If this record has been assigned to a partition set, this value
// is TRUE. Unassigned disk records are FALSE;
//
BOOLEAN Assigned;
BOOLEAN ContainsSystemPartition;
BOOLEAN ContainsNtPartition;
BOOLEAN IsCritical;
} SIF_DISK_RECORD, *PSIF_DISK_RECORD;
typedef struct _DISK_PARTITION_SET {
ULONGLONG ActualDiskSizeMB;
PSIF_DISK_RECORD pDiskRecord;
PWSTR NtPartitionKey;
ULONG ActualDiskSignature;
ULONG Index;
PARTITION_STYLE PartitionStyle;
BOOLEAN PartitionsIntact;
BOOLEAN IsReplacementDisk;
BOOLEAN IsAligned;
} DISK_PARTITION_SET, *PDISK_PARTITION_SET, **DISK_PARTITION_SET_TABLE;
typedef struct _ASR_PHYSICAL_DISK_INFO {
ULONGLONG TrueDiskSize; // size of partition0
ULONG BusKey; // used for grouping
DWORD ControllerNumber;
STORAGE_BUS_TYPE BusType; // scsi, ide, 1394, etc
UCHAR PortNumber;
} ASR_PHYSICAL_DISK_INFO, *PASR_PHYSICAL_DISK_INFO;
///////////////////////////////////////////////////////////////////////////////
// Macro Declaration Section //
///////////////////////////////////////////////////////////////////////////////
#define BYTES_PER_SECTOR(d) (HardDisks[(d)].Geometry.BytesPerSector)
#define SECTORS_PER_TRACK(disk) (HardDisks[(disk)].Geometry.SectorsPerTrack)
#define DISK_IS_REMOVABLE(d) (HardDisks[(d)].Characteristics & FILE_REMOVABLE_MEDIA)
#define STRING_TO_LONG(s) (SpStringToLong((s),NULL,10))
#define COMPARE_KEYS(k1,k2) (STRING_TO_LONG(k1) == STRING_TO_LONG(k2))
#define STRING_TO_ULONG(str) (ULONG) SpAsrStringToULong(str, NULL, 10)
#define STRING_TO_ULONGLONG(str) (ULONGLONG) SpAsrStringToULongLong(str, NULL, 10)
#define STRING_TO_LONGLONG(str) (LONGLONG) SpAsrStringToLongLong(str, NULL, 10)
#define STRING_TO_HEX(str) SpStringToLong(str + 2, NULL, 16)
#define IsRecognizedFatPartition(PartitionType) ( \
(PartitionType == PARTITION_HUGE) \
)
#define IsRecognizedFat32Partition(PartitionType) ( \
(PartitionType == PARTITION_FAT32) \
)
#define IsRecognizedNtfsPartition(PartitionType) ( \
(PartitionType == PARTITION_IFS) \
)
#define INTERNAL_ERROR(msg) \
SpAsrRaiseInternalError(THIS_MODULE,THIS_MODULE_CODE,__LINE__,msg)
#define BYTES_PER_MB 1048576 // 2^20, or 1024*1024
#define ASR_PTN_MASK_BOOT 1
#define ASR_PTN_MASK_SYS 2
#define ASR_PTN_MASK_DC1 4
#define ASR_PTN_MASK_DC2 8
//
// Debug Trace Messages
//
#define _asrinfo DPFLTR_SETUP_ID, ((ASRMODE_NORMAL == SpAsrGetAsrMode()) ? DPFLTR_INFO_LEVEL: DPFLTR_ERROR_LEVEL)
#define _asrwarn DPFLTR_SETUP_ID, ((ASRMODE_NORMAL == SpAsrGetAsrMode()) ? DPFLTR_WARNING_LEVEL: DPFLTR_ERROR_LEVEL)
#define _asrerr DPFLTR_SETUP_ID, DPFLTR_ERROR_LEVEL
#define DbgMesg \
KdPrintEx((_asrinfo, " ")); \
KdPrintEx
#define DbgStatusMesg \
KdPrintEx((_asrinfo, "ASR [%ws:%4d] (.) ", THIS_MODULE, __LINE__)); \
KdPrintEx
#define DbgErrorMesg \
KdPrintEx((_asrwarn, "ASR [%ws:%4d] (!) ", THIS_MODULE, __LINE__)); \
KdPrintEx
#define DbgFatalMesg \
KdPrintEx((_asrerr, "ASR [%ws:%4d] (X) ", THIS_MODULE, __LINE__)); \
KdPrintEx
///////////////////////////////////////////////////////////////////////////////
// Global Variable Declarations //
///////////////////////////////////////////////////////////////////////////////
// Defined in spdrpset.c
DISK_PARTITION_SET_TABLE Gbl_PartitionSetTable1;
DISK_PARTITION_SET_TABLE Gbl_PartitionSetTable2;
PVOID Gbl_HandleToDrStateFile;
// Imported from non-Asr modules
extern WCHAR TemporaryBuffer[];
//
PWSTR ASR_SIF_SYSTEM_KEY;
///////////////////////////////////////////////////////////////////////////////
// Functions Declaration Section //
///////////////////////////////////////////////////////////////////////////////
//
// Exported from spdrsif.c
//
//
// [VERSION] section functions
//
VOID
SpAsrCheckAsrStateFileVersion();
//
// [SYSTEMS] section functions
//
PWSTR
SpAsrGetNtDirectoryPathBySystemKey(IN PWSTR SystemKey);
BOOLEAN
SpAsrGetAutoExtend(IN PWSTR SystemKey);
//
// [ASRFLAGS] section functions
//
BOOLEAN
SpAsrGetSilentRepartitionFlag(IN PWSTR SystemKey);
//
// [DISKS.MBR] and [DISKS.GPT] sections functions
//
ULONG
SpAsrGetMbrDiskRecordCount(VOID);
ULONG
SpAsrGetGptDiskRecordCount(VOID);
ULONG
SpAsrGetDiskRecordCount();
PWSTR
SpAsrGetDiskKey(
IN PARTITION_STYLE Style, // GPT or MBR
IN ULONG Index
);
PSIF_DISK_RECORD
SpAsrGetDiskRecord(
IN PARTITION_STYLE PartitionStyle,
IN PWSTR DiskKey
);
PSIF_DISK_RECORD
SpAsrCopyDiskRecord(IN PSIF_DISK_RECORD pInput);
//
// [PARTITIONS.MBR] and [PARTITIONS.GPT] section functions
//
ULONG
SpAsrGetMbrPartitionRecordCount(VOID);
ULONG
SpAsrGetGptPartitionRecordCount(VOID);
PWSTR
SpAsrGetMbrPartitionKey(IN ULONG Index);
PWSTR
SpAsrGetGptPartitionKey(IN ULONG Index);
PWSTR
SpAsrGetDiskKeyByMbrPartitionKey(IN PWSTR PartitionKey);
PWSTR
SpAsrGetDiskKeyByGptPartitionKey(IN PWSTR PartitionKey);
ULONGLONG
SpAsrGetSectorCountByMbrDiskKey(IN PWSTR DiskKey);
ULONGLONG
SpAsrGetSectorCountByGptDiskKey(IN PWSTR DiskKey);
PSIF_PARTITION_RECORD
SpAsrGetMbrPartitionRecord(IN PWSTR PartitionKey);
PSIF_PARTITION_RECORD
SpAsrGetGptPartitionRecord(IN PWSTR PartitionKey);
PSIF_PARTITION_RECORD
SpAsrCopyPartitionRecord(IN PSIF_PARTITION_RECORD pInput);
PSIF_PARTITION_RECORD_LIST
SpAsrCopyPartitionRecordList(PSIF_PARTITION_RECORD_LIST pSrcList);
VOID
SpAsrInsertPartitionRecord(
IN PSIF_PARTITION_RECORD_LIST pList,
IN PSIF_PARTITION_RECORD pRec
);
PSIF_PARTITION_RECORD
SpAsrPopNextPartitionRecord(IN PSIF_PARTITION_RECORD_LIST pList);
// [INSTALLFILES] section functions
PSIF_INSTALLFILE_RECORD
SpAsrRemoveInstallFileRecord(IN SIF_INSTALLFILE_LIST *InstallFileList);
VOID
SpAsrDeleteInstallFileRecord(IN OUT PSIF_INSTALLFILE_RECORD pRec);
PSIF_INSTALLFILE_LIST
SpAsrInit3rdPartyFileList(IN PCWSTR SetupSourceDevicePath);
//
// Exported from spdrpset.c
//
ULONGLONG
SpAsrGetTrueDiskSectorCount(IN ULONG Disk);
VOID
SpAsrCreatePartitionSets(
IN PWSTR SetupSourceDevicePath,
IN PWSTR DirectoryOnSetupSource
);
PDISK_REGION
SpAsrDiskPartitionExists(
IN ULONG Disk,
IN PSIF_PARTITION_RECORD pRec
);
VOID SpAsrDbgDumpPartitionSets(VOID);
VOID SpAsrDbgDumpPartitionLists(BYTE DataOption, PWSTR Msg);
//
// Exported from spdrmmgr.c
//
NTSTATUS
SpAsrDeleteMountPoint(IN PWSTR PartitionDevicePath);
NTSTATUS
SpAsrSetVolumeGuid(
IN PDISK_REGION pRegion,
IN PWSTR VolumeGuid
);
WCHAR
SpAsrGetPartitionDriveLetter(IN PDISK_REGION pRegion);
NTSTATUS
SpAsrSetPartitionDriveLetter(
IN PDISK_REGION pRegion,
IN WCHAR DriveLetter);
//
// Exported from spdrutil.c
//
ULONGLONG
SpAsrConvertSectorsToMB(
IN ULONGLONG SectorCount,
IN ULONG BytesPerSector);
PWSTR
SpAsrGetRegionName(IN PDISK_REGION pRegion);
ULONG
SpAsrGetActualDiskSignature(IN ULONG Disk);
PVOID
SpAsrMemAlloc(
IN ULONG Size,
IN BOOLEAN IsErrorFatal);
BOOLEAN
SpAsrIsValidBootDrive(PWSTR NtDir);
BOOLEAN
SpAsrIsBootPartitionRecord(IN ULONG CriticalPartitionFlag);
BOOLEAN
SpAsrIsSystemPartitionRecord(IN ULONG CriticalPartitionFlag);
VOID
SpAsrDeleteStorageVolumes();
VOID
SpAsrRaiseFatalError(
IN ULONG ErrorCode,
IN PWSTR KdPrintStr);
VOID
SpAsrRaiseFatalErrorWs(
IN ULONG ErrorCode,
IN PWSTR KdPrintStr,
IN PWSTR MessagStr
);
VOID
SpAsrRaiseFatalErrorWsWs(
IN ULONG ErrorCode,
IN PWSTR KdPrintStr,
IN PWSTR MessagStr1,
IN PWSTR MessagStr2
);
VOID
SpAsrRaiseFatalErrorWsLu(
IN ULONG ErrorCode,
IN PWSTR KdPrintStr,
IN PWSTR MessagStr,
IN ULONG MessagVal
);
VOID
SpAsrRaiseFatalErrorLu(
IN ULONG ErrorCode,
IN PWSTR KdPrintStr,
IN ULONG MessagVal
);
VOID
SpAsrRaiseFatalErrorLuLu(
IN ULONG ErrorCode,
IN PWSTR KdPrintStr,
IN ULONG MessagVal1,
IN ULONG MessagVal2
);
BOOL
SpAsrFileErrorDeleteSkipAbort(
IN ULONG ErrorCode,
IN PWSTR DestinationFile
);
BOOL
SpAsrFileErrorRetrySkipAbort(
IN ULONG ErrorCode,
IN PWSTR SourceFile,
IN PWSTR Label,
IN PWSTR Vendor,
IN BOOL AllowSkip
);
VOID
SpAsrRaiseInternalError(
IN PWSTR ModuleName,
IN PWSTR ModuleCode,
IN ULONG LineNumber,
IN PWSTR KdPrintStr);
ULONGLONG
SpAsrStringToULongLong(
IN PWSTR String,
OUT PWCHAR *EndOfValue,
IN unsigned Radix
);
LONGLONG
SpAsrStringToLongLong(
IN PWSTR String,
OUT PWCHAR *EndOfValue,
IN unsigned Radix
);
ULONG
SpAsrStringToULong(
IN PWSTR String,
OUT PWCHAR *EndOfValue,
IN unsigned Radix
);
VOID
SpAsrGuidFromString(
IN OUT GUID* Guid,
IN PWSTR GuidString
);
BOOLEAN
SpAsrIsZeroGuid(
IN GUID * Guid
);
VOID SpAsrDeleteMountedDevicesKey(VOID);
#endif // _SPDRPRIV_DEFN_