483 lines
11 KiB
C
483 lines
11 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 2000 Microsoft Corporation
|
||
|
|
||
|
File Name:
|
||
|
|
||
|
asrpriv.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Private header file containing definitions and function
|
||
|
prototypes for items used across the ASR Files.
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
Naming conventions:
|
||
|
_AsrpXXX private ASR Macros
|
||
|
AsrpXXX private ASR routines
|
||
|
AsrXXX Publically defined and documented routines
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Guhan Suriyanarayanan (guhans) 27-May-2000
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
27-May-2000 guhans
|
||
|
Moved common items from asr.c to asrpriv.h
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
|
||
|
#ifndef _INC_ASRPRIV_H_
|
||
|
#define _INC_ASRPRIV_H_
|
||
|
|
||
|
#include <ntddscsi.h> // PSCSI_ADDRESS
|
||
|
|
||
|
|
||
|
//
|
||
|
// --------
|
||
|
// #defines and constants common to the ASR modules.
|
||
|
// --------
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Size of temporary buffers used in ASR.
|
||
|
//
|
||
|
#define ASR_BUFFER_SIZE 4096
|
||
|
|
||
|
//
|
||
|
// Maximum length of \??\Volume{Guid}
|
||
|
//
|
||
|
#define ASR_CCH_MAX_VOLUME_GUID 64
|
||
|
|
||
|
//
|
||
|
// Maximum length of \Device\Harddisk1234\Partition1234
|
||
|
//
|
||
|
#define ASR_CCH_DEVICE_PATH_FORMAT 60
|
||
|
extern const WCHAR ASR_WSZ_DEVICE_PATH_FORMAT[];
|
||
|
|
||
|
//
|
||
|
// \??\Volume{
|
||
|
//
|
||
|
extern const WCHAR ASR_WSZ_VOLUME_PREFIX[];
|
||
|
|
||
|
extern const WCHAR ASR_SIF_SYSTEM_SECTION[];
|
||
|
extern const WCHAR ASR_SIF_BUSES_SECTION[];
|
||
|
extern const WCHAR ASR_SIF_MBR_DISKS_SECTION[];
|
||
|
extern const WCHAR ASR_SIF_GPT_DISKS_SECTION[];
|
||
|
extern const WCHAR ASR_SIF_MBR_PARTITIONS_SECTION[];
|
||
|
extern const WCHAR ASR_SIF_GPT_PARTITIONS_SECTION[];
|
||
|
|
||
|
|
||
|
//
|
||
|
// --------
|
||
|
// typedefs common to the ASR modules.
|
||
|
// --------
|
||
|
//
|
||
|
|
||
|
typedef struct _ASR_PTN_INFO {
|
||
|
|
||
|
//
|
||
|
// The GUID of the volume on this partition. For 0x42 parititions,
|
||
|
// this value is a blank string.
|
||
|
//
|
||
|
WCHAR szVolumeGuid[ASR_CCH_MAX_VOLUME_GUID];
|
||
|
|
||
|
//
|
||
|
// next pointer in chain sorted by starting offset
|
||
|
//
|
||
|
struct _ASR_PTN_INFO *pOffsetNext;
|
||
|
|
||
|
//
|
||
|
// next pointer in chain sorted by partition length
|
||
|
//
|
||
|
struct _ASR_PTN_INFO *pLengthNext;
|
||
|
|
||
|
//
|
||
|
// The index into the PartitionEntry[] array
|
||
|
//
|
||
|
DWORD SlotIndex;
|
||
|
|
||
|
|
||
|
DWORD ClusterSize;
|
||
|
|
||
|
//
|
||
|
// Special flags for the partition that we're interested in.
|
||
|
// Currently, the values defined are
|
||
|
// 0: not interesting
|
||
|
// 1: Boot partition
|
||
|
// 2: System partition
|
||
|
//
|
||
|
// Care must be taken that this partition flag is in sync with
|
||
|
// the partition flags defined in setupdd.sys
|
||
|
//
|
||
|
USHORT PartitionFlags;
|
||
|
|
||
|
//
|
||
|
// FAT, FAT32, NTFS
|
||
|
//
|
||
|
UCHAR FileSystemType;
|
||
|
|
||
|
UCHAR Reserved;
|
||
|
|
||
|
//
|
||
|
// The partition table entry for this partition.
|
||
|
//
|
||
|
PARTITION_INFORMATION_EX PartitionInfo;
|
||
|
|
||
|
|
||
|
} ASR_PTN_INFO, *PASR_PTN_INFO;
|
||
|
|
||
|
|
||
|
typedef struct _ASR_PTN_INFO_LIST {
|
||
|
|
||
|
//
|
||
|
// This list is sorted by the starting offset of the partitions
|
||
|
//
|
||
|
PASR_PTN_INFO pOffsetHead;
|
||
|
PASR_PTN_INFO pOffsetTail;
|
||
|
|
||
|
//
|
||
|
// This chain is through the same list, but is sorted by the
|
||
|
// partition lengths.
|
||
|
//
|
||
|
PASR_PTN_INFO pLengthHead;
|
||
|
PASR_PTN_INFO pLengthTail;
|
||
|
|
||
|
DWORD numTotalPtns;
|
||
|
|
||
|
DWORD numExtendedPtns;
|
||
|
|
||
|
} ASR_PTN_INFO_LIST, *PASR_PTN_INFO_LIST;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Info about each disk on the system. An ASR_DISK_INFO
|
||
|
// struct will exist for each physical disk that exists
|
||
|
// on the system.
|
||
|
//
|
||
|
typedef struct _ASR_DISK_INFO {
|
||
|
|
||
|
struct _ASR_DISK_INFO *pNext;
|
||
|
|
||
|
//
|
||
|
// Device Path used to open the Disk.
|
||
|
// Obtained from SetupDiGetDeviceInterfaceDetail
|
||
|
//
|
||
|
PWSTR DevicePath;
|
||
|
|
||
|
//
|
||
|
// Partition layout information for partitions on the disk
|
||
|
//
|
||
|
PDRIVE_LAYOUT_INFORMATION_EX pDriveLayoutEx;
|
||
|
|
||
|
//
|
||
|
// Geometry: obtained from IOCTL_GET_DRIVE_GEOMETRY call
|
||
|
//
|
||
|
PDISK_GEOMETRY pDiskGeometry;
|
||
|
|
||
|
//
|
||
|
//
|
||
|
// Information about partition 0 = the entire disk
|
||
|
//
|
||
|
PPARTITION_INFORMATION_EX pPartition0Ex;
|
||
|
|
||
|
//
|
||
|
// Additional Information about the partitions, including volume Guid, FS-Type, etc
|
||
|
//
|
||
|
PASR_PTN_INFO PartitionInfoTable;
|
||
|
|
||
|
PSCSI_ADDRESS pScsiAddress;
|
||
|
|
||
|
// For sif disks, this points to the physical disk they've been assigned
|
||
|
// to, and vice versa. Used only at restore time.
|
||
|
//
|
||
|
struct _ASR_DISK_INFO *AssignedTo;
|
||
|
|
||
|
DWORD sizeDriveLayoutEx;
|
||
|
DWORD sizeDiskGeometry;
|
||
|
DWORD sizePartition0Ex;
|
||
|
DWORD sizePartitionInfoTable;
|
||
|
|
||
|
//
|
||
|
// Device number for disk, constant through sessions
|
||
|
//
|
||
|
ULONG DeviceNumber;
|
||
|
|
||
|
ULONG SifDiskKey;
|
||
|
|
||
|
|
||
|
ULONG SifBusKey;
|
||
|
|
||
|
DEVINST ParentDevInst;
|
||
|
|
||
|
//
|
||
|
// Flag on whether this disk is Critical. At backup time, the backup
|
||
|
// app provides us with this info. At restore time, the Critical disks
|
||
|
// are expected to be restored by textmode Setup, before
|
||
|
// RestoreNonCriticalDisks is called. Critical disks are not
|
||
|
// re-partitioned by RestoreNonCriticalDisks.
|
||
|
//
|
||
|
BOOL IsCritical;
|
||
|
|
||
|
//
|
||
|
// A flag set to TRUE (at restore time) if a disk has the same signature
|
||
|
// (or DiskId, for GPT disks) as specified in asr.sif, and if all the
|
||
|
// partitions specified in asr.sif exist. Intact disks are not re-partitioned
|
||
|
// by RestoreNonCriticalDisks.
|
||
|
//
|
||
|
BOOL IsIntact;
|
||
|
|
||
|
//
|
||
|
// If the struct is packed
|
||
|
//
|
||
|
BOOL IsPacked;
|
||
|
|
||
|
BOOL IsClusterShared;
|
||
|
|
||
|
BOOL IsAligned;
|
||
|
|
||
|
//
|
||
|
// This is needed at restore time, since the signature is read in before
|
||
|
// the drive layout is created (and we need a temporary holding place).
|
||
|
//
|
||
|
DWORD TempSignature;
|
||
|
|
||
|
WORD wReserved;
|
||
|
//
|
||
|
// Information about the bus this disk is on. This is only
|
||
|
// used to group all the disks on a bus together.
|
||
|
//
|
||
|
STORAGE_BUS_TYPE BusType;
|
||
|
|
||
|
//
|
||
|
// GPT or MBR
|
||
|
//
|
||
|
PARTITION_STYLE Style;
|
||
|
|
||
|
|
||
|
} ASR_DISK_INFO, *PASR_DISK_INFO;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Info about the system--only one struct exists globally.
|
||
|
//
|
||
|
typedef struct _ASR_SYSTEM_INFO {
|
||
|
//
|
||
|
// Boot (Windows) Directory
|
||
|
//
|
||
|
PWSTR BootDirectory;
|
||
|
|
||
|
//
|
||
|
// OsLoader Path
|
||
|
//
|
||
|
PWSTR SystemPath;
|
||
|
|
||
|
//
|
||
|
// Platform = x86 or ia64
|
||
|
//
|
||
|
PWSTR Platform;
|
||
|
|
||
|
// Name of the backup app
|
||
|
// Passed in by backup app
|
||
|
// PWSTR Provider;
|
||
|
|
||
|
PWSTR pwReserved;
|
||
|
|
||
|
//
|
||
|
// Disk Auto-extension:
|
||
|
// Passed in by backup app
|
||
|
//
|
||
|
BOOL AutoExtendEnabled;
|
||
|
|
||
|
DWORD sizeComputerName;
|
||
|
//
|
||
|
// Obtained from GetComputerName
|
||
|
//
|
||
|
WCHAR ComputerName[MAX_COMPUTERNAME_LENGTH + 1];
|
||
|
|
||
|
//
|
||
|
// Obtained from GetOsVersionEx
|
||
|
//
|
||
|
OSVERSIONINFOEX OsVersionEx;
|
||
|
|
||
|
//
|
||
|
// TimeZone info we save and restore
|
||
|
//
|
||
|
TIME_ZONE_INFORMATION TimeZoneInformation;
|
||
|
|
||
|
|
||
|
} ASR_SYSTEM_INFO, *PASR_SYSTEM_INFO;
|
||
|
|
||
|
|
||
|
//
|
||
|
// --------
|
||
|
// Macros common to the ASR modules.
|
||
|
// --------
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Macro Description:
|
||
|
// This macro wraps calls that are expected to return SUCCESS (retcode).
|
||
|
// If ErrorCondition occurs, it sets the LocalStatus to the ErrorCode
|
||
|
// passed in, calls SetLastError() to set the Last Error to ErrorCode,
|
||
|
// and jumps to the EXIT label in the calling function
|
||
|
//
|
||
|
// Arguments:
|
||
|
// ErrorCondition // Result of some function call or conditional expression.
|
||
|
// LocalStatus // Status variable in the calling function
|
||
|
// LONG ErrorCode // An ErrorCode specific to the error and calling function
|
||
|
//
|
||
|
#define _AsrpErrExitCode( ErrorCondition, LocalStatus, ErrorCode ) { \
|
||
|
\
|
||
|
if ((BOOL) ErrorCondition) { \
|
||
|
\
|
||
|
LocalStatus = (DWORD) ErrorCode; \
|
||
|
\
|
||
|
SetLastError((DWORD) ErrorCode); \
|
||
|
\
|
||
|
goto EXIT; \
|
||
|
} \
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Simple macro to check a pointer, free it if non-NULL, and set it to NULL.
|
||
|
//
|
||
|
#define _AsrpHeapFree( p ) \
|
||
|
if ( p ) { \
|
||
|
HeapFree(heapHandle, 0L, p); \
|
||
|
p = NULL; \
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Simple macro to check if a handle is valid and close it
|
||
|
//
|
||
|
#define _AsrpCloseHandle( h ) \
|
||
|
if ((h) && (INVALID_HANDLE_VALUE != h)) { \
|
||
|
CloseHandle(h); \
|
||
|
h = NULL; \
|
||
|
}
|
||
|
|
||
|
|
||
|
#define _AsrpIsVolumeGuid(data, numBytes) \
|
||
|
( \
|
||
|
((96 == numBytes) || ((98 == numBytes) && data[48] == '\\')) && \
|
||
|
(!_wcsnicmp(L"\\??\\Volume{", data, 11)) && \
|
||
|
L'-' == data[19] && \
|
||
|
L'-' == data[24] && \
|
||
|
L'-' == data[29] && \
|
||
|
L'-' == data[34] && \
|
||
|
L'}' == data[47] \
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
//
|
||
|
// --------
|
||
|
// debug #defines
|
||
|
// --------
|
||
|
//
|
||
|
|
||
|
#define _asrerror THIS_MODULE, __LINE__, DPFLTR_ERROR_LEVEL
|
||
|
#define _asrwarn THIS_MODULE, __LINE__, DPFLTR_WARNING_LEVEL
|
||
|
#define _asrlog THIS_MODULE, __LINE__, DPFLTR_TRACE_LEVEL
|
||
|
|
||
|
//
|
||
|
// In pre-release mode, let's log everything so it's easier to debug
|
||
|
//
|
||
|
#ifdef PRERELEASE
|
||
|
#define _asrinfo THIS_MODULE, __LINE__, DPFLTR_TRACE_LEVEL
|
||
|
#else
|
||
|
#define _asrinfo THIS_MODULE, __LINE__, DPFLTR_INFO_LEVEL
|
||
|
#endif
|
||
|
|
||
|
//
|
||
|
// --------
|
||
|
// routines common to the ASR modules.
|
||
|
// --------
|
||
|
//
|
||
|
|
||
|
//
|
||
|
// Implemented in asrback.c
|
||
|
//
|
||
|
BOOL
|
||
|
AsrpGetMountPoints(
|
||
|
IN PCWSTR DeviceName,
|
||
|
IN CONST DWORD SizeDeviceName,
|
||
|
PMOUNTMGR_MOUNT_POINTS *pMountPointsOut // caller must free this
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
AsrpInitLayoutInformation(
|
||
|
IN CONST PASR_SYSTEM_INFO pSystemInfo,
|
||
|
IN PASR_DISK_INFO pDiskList,
|
||
|
OUT PULONG MaxDeviceNumber,
|
||
|
IN BOOL AllDetails
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
AsrpInitDiskInformation(
|
||
|
OUT PASR_DISK_INFO *ppDiskList
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
AsrpFreeNonFixedMedia(
|
||
|
IN OUT PASR_DISK_INFO *ppDiskList
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
AsrpFreeStateInformation(
|
||
|
IN OUT PASR_DISK_INFO *ppDiskList,
|
||
|
IN OUT PASR_SYSTEM_INFO pSystemInfo
|
||
|
);
|
||
|
|
||
|
VOID
|
||
|
AsrpFreePartitionList(
|
||
|
IN OUT PASR_PTN_INFO_LIST *ppPtnList
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Implemented in asrclus.c
|
||
|
//
|
||
|
BOOL
|
||
|
AsrpInitClusterSharedDisks(
|
||
|
IN PASR_DISK_INFO OriginalDiskList
|
||
|
);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Implemented in setupasr.c
|
||
|
//
|
||
|
PWSTR // must be freed by caller
|
||
|
AsrpExpandEnvStrings(
|
||
|
IN CONST PCWSTR OriginalString
|
||
|
);
|
||
|
|
||
|
BOOL
|
||
|
AsrIsEnabled(VOID);
|
||
|
|
||
|
VOID
|
||
|
AsrpInitialiseLogFile();
|
||
|
|
||
|
VOID
|
||
|
AsrpInitialiseErrorFile();
|
||
|
|
||
|
VOID
|
||
|
AsrpPrintDbgMsg(
|
||
|
IN CONST char Module,
|
||
|
IN CONST ULONG Line,
|
||
|
IN CONST ULONG MesgLevel,
|
||
|
IN PCSTR FormatString,
|
||
|
...);
|
||
|
|
||
|
VOID
|
||
|
AsrpCloseLogFiles();
|
||
|
|
||
|
|
||
|
#endif // _INC_ASRPRIV_H_
|