/*++ 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 #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_