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