/*++

Copyright (c) 2001 Microsoft Corporation

Module Name:

    uninstall.h

Abstract:

    General uninstall-related functions and structure.

Author:

    Aghajanyan Souren 27-Mar-2001

Revision History:

    sourenag 27-Mar-2001 persistence support

--*/
#if (_WIN32_WINNT >= 0x500)
                           
#ifndef _UNINSTALL_GENERAL_
#define _UNINSTALL_GENERAL_

#include "winioctl.h"

#define MAX_DRIVE_NUMBER ('Z' - 'A' + 1)

typedef enum{
    DiskInfoCmp_Equal, 
    DiskInfoCmp_DifferentLetter, 
    DiskInfoCmp_FileSystemHasChanged, 
    DiskInfoCmp_GeometryHasChanged, 
    DiskInfoCmp_WrongParameters, 
    DiskInfoCmp_DriveMountPointHasChanged, 
    DiskInfoCmp_PartitionPlaceHasChanged, 
    DiskInfoCmp_PartitionLengthHasChanged, 
    DiskInfoCmp_PartitionTypeHasChanged, 
    DiskInfoCmp_PartitionStyleHasChanged, 
    DiskInfoCmp_PartitionCountHasChanged, 
    DiskInfoCmp_PartitionNumberHasChanged, 
    DiskInfoCmp_RewritePartitionHasChanged, 
    DiskInfoCmp_PartitionAttributesHasChanged
}DISKINFO_COMPARATION_STATUS, *PDISKINFO_COMPARATION_STATUS;

typedef struct {
    DISK_GEOMETRY                   DiskGeometry;
    DRIVE_LAYOUT_INFORMATION_EX *   DiskLayout;
} DISKINFO, *PDISKINFO;

typedef struct {
    WCHAR   Drive;
    
    PCWSTR  FileSystemName;
    DWORD   FileSystemFlags;

    PCWSTR  VolumeNTPath;
} DRIVEINFO, *PDRIVEINFO;


typedef struct {
    PCWSTR FileName;
    BOOL   IsCab;
    ULARGE_INTEGER FileSize;
} FILEINTEGRITYINFO, *PFILEINTEGRITYINFO;

typedef struct {
    ULARGE_INTEGER BootFilesDiskSpace;
    ULARGE_INTEGER BackupFilesDiskSpace;
    ULARGE_INTEGER UndoFilesDiskSpace;

    UINT NumberOfDrives;
    PDRIVEINFO  DrivesInfo;
    
    UINT NumberOfDisks;
    PDISKINFO   DisksInfo;

    UINT NumberOfFiles;
    PFILEINTEGRITYINFO   FilesInfo;
} BACKUPIMAGEINFO, *PBACKUPIMAGEINFO;


BOOL 
GetDriveInfo(
    IN      WCHAR Drive, 
    IN OUT  DRIVEINFO * pInfo
    );

BOOL 
GetDrivesInfo(
    IN OUT      DRIVEINFO *  pInfo, 
    IN OUT      UINT      *  pDiskInfoRealCount, 
    IN          UINT         DiskInfoMaxCount
    );

BOOL 
GetPhysycalDiskNumber(
    OUT UINT * pNumberOfPhysicalDisks
    );

BOOL 
GetDiskInfo(
    IN      UINT    Drive, 
    IN OUT  DISKINFO * pInfo
    );

BOOL 
GetDisksInfo(
    OUT     DISKINFO ** pInfo, 
    OUT     UINT * pNumberOfItem
    );

BOOL 
GetIntegrityInfoW(
    IN  PCWSTR FileName, 
    IN  PCWSTR DirPath, 
    OUT FILEINTEGRITYINFO * IntegrityInfoPtr
);

VOID 
FreeDisksInfo(
    IN  DISKINFO *  pInfo, 
    IN  UINT        NumberOfItem
    );

BOOL 
GetDrivesInfo(
    IN OUT      DRIVEINFO *  pInfo, 
    IN OUT      UINT     *  pDiskInfoRealCount, 
    IN          UINT        DiskInfoMaxCount
);

BOOL 
GetUndoDrivesInfo(
    OUT DRIVEINFO * pInfo, 
    OUT UINT      * pNumberOfDrive, 
    IN  WCHAR       BootDrive, 
    IN  WCHAR       SystemDrive, 
    IN  WCHAR       UndoDrive
    );
    
DISKINFO_COMPARATION_STATUS 
CompareDriveInfo(
    IN      DRIVEINFO * FirstInfo,
    IN      DRIVEINFO * SecondInfo
    );

BOOL 
CompareDrivesInfo(
    IN      DRIVEINFO *                     FirstInfo,
    IN      DRIVEINFO *                     SecondInfo, 
    IN      UINT                            DriveInfoCount, 
    OUT     PDISKINFO_COMPARATION_STATUS    OutDiskCmpStatus,           OPTIONAL
    OUT     UINT     *                      OutIfFailedDiskInfoIndex    OPTIONAL
    );

DISKINFO_COMPARATION_STATUS 
CompareDiskInfo(
    IN      DISKINFO * FirstInfo,
    IN      DISKINFO * SecondInfo
    );

BOOL 
CompareDisksInfo(
    IN      DISKINFO *                      FirstInfo,
    IN      DISKINFO *                      SecondInfo, 
    IN      UINT                            DiskInfoCount, 
    OUT     PDISKINFO_COMPARATION_STATUS    OutDiskCmpStatus,           OPTIONAL
    OUT     UINT     *                      OutIfFailedDiskInfoIndex    OPTIONAL
    );

#define BACKUPIMAGEINFO_VERSION         2

#define DRIVE_LAYOUT_INFORMATION_EX_PERSISTENCE \
                                        PERSIST_BEGIN_DECLARE_STRUCT(DRIVE_LAYOUT_INFORMATION_EX, BACKUPIMAGEINFO_VERSION)  \
                                            PERSIST_FIELD_BY_VALUE(DRIVE_LAYOUT_INFORMATION_EX, DWORD, PartitionStyle), \
                                            PERSIST_FIELD_BY_VALUE(DRIVE_LAYOUT_INFORMATION_EX, DWORD, PartitionCount), \
                                            PERSIST_FIELD_BY_VALUE(DRIVE_LAYOUT_INFORMATION_EX, DRIVE_LAYOUT_INFORMATION_MBR, Mbr), \
                                            PERSIST_FIELD_BY_VALUE(DRIVE_LAYOUT_INFORMATION_EX, DRIVE_LAYOUT_INFORMATION_GPT, Gpt), \
                                            PERSIST_STRUCT_BY_VALUE_VARIABLE_LENGTH(DRIVE_LAYOUT_INFORMATION_EX, PARTITION_INFORMATION_EX, PartitionEntry, PartitionCount, 1), \
                                        PERSIST_END_DECLARE_STRUCT(DRIVE_LAYOUT_INFORMATION_EX, BACKUPIMAGEINFO_VERSION)

#define DISKINFO_PERSISTENCE            PERSIST_BEGIN_DECLARE_STRUCT(DISKINFO, BACKUPIMAGEINFO_VERSION)     \
                                            PERSIST_FIELD_BY_VALUE(DISKINFO, DISK_GEOMETRY, DiskGeometry),  \
                                            PERSIST_FIELD_NESTED_TYPE(DISKINFO, DRIVE_LAYOUT_INFORMATION_EX, BACKUPIMAGEINFO_VERSION, DiskLayout, BYREF),   \
                                        PERSIST_END_DECLARE_STRUCT(DISKINFO, BACKUPIMAGEINFO_VERSION)

#define DRIVEINFO_PERSISTENCE           PERSIST_BEGIN_DECLARE_STRUCT(DRIVEINFO, BACKUPIMAGEINFO_VERSION)\
                                            PERSIST_FIELD_BY_VALUE(DRIVEINFO, WCHAR, Drive),    \
                                            PERSIST_FIELD_STRINGW(DRIVEINFO, FileSystemName),   \
                                            PERSIST_FIELD_BY_VALUE(DRIVEINFO, DWORD, FileSystemFlags),   \
                                            PERSIST_FIELD_STRINGW(DRIVEINFO, VolumeNTPath),     \
                                        PERSIST_END_DECLARE_STRUCT(DRIVEINFO, BACKUPIMAGEINFO_VERSION)

#define FILEINTEGRITYINFO_PERSISTENCE   PERSIST_BEGIN_DECLARE_STRUCT(FILEINTEGRITYINFO, BACKUPIMAGEINFO_VERSION)\
                                            PERSIST_FIELD_STRINGW(FILEINTEGRITYINFO, FileName), \
                                            PERSIST_FIELD_BY_VALUE(FILEINTEGRITYINFO, BOOL, IsCab),   \
                                            PERSIST_FIELD_BY_VALUE(FILEINTEGRITYINFO, ULARGE_INTEGER, FileSize),   \
                                        PERSIST_END_DECLARE_STRUCT(FILEINTEGRITYINFO, BACKUPIMAGEINFO_VERSION)

#define BACKUPIMAGEINFO_PERSISTENCE     PERSIST_BEGIN_DECLARE_STRUCT(BACKUPIMAGEINFO, BACKUPIMAGEINFO_VERSION)\
                                            PERSIST_FIELD_BY_VALUE(BACKUPIMAGEINFO, ULARGE_INTEGER, BootFilesDiskSpace),   \
                                            PERSIST_FIELD_BY_VALUE(BACKUPIMAGEINFO, ULARGE_INTEGER, BackupFilesDiskSpace), \
                                            PERSIST_FIELD_BY_VALUE(BACKUPIMAGEINFO, ULARGE_INTEGER, UndoFilesDiskSpace),   \
                                            PERSIST_FIELD_BY_VALUE(BACKUPIMAGEINFO, UINT, NumberOfDisks),   \
                                            PERSIST_FIELD_NESTED_TYPE_CYCLE(BACKUPIMAGEINFO, DISKINFO, BACKUPIMAGEINFO_VERSION, DisksInfo, BYREF, NumberOfDisks),   \
                                            PERSIST_FIELD_BY_VALUE(BACKUPIMAGEINFO, UINT, NumberOfDrives),   \
                                            PERSIST_FIELD_NESTED_TYPE_CYCLE(BACKUPIMAGEINFO, DRIVEINFO, BACKUPIMAGEINFO_VERSION, DrivesInfo, BYREF, NumberOfDrives),   \
                                            PERSIST_FIELD_BY_VALUE(BACKUPIMAGEINFO, UINT, NumberOfFiles),   \
                                            PERSIST_FIELD_NESTED_TYPE_CYCLE(BACKUPIMAGEINFO, FILEINTEGRITYINFO, BACKUPIMAGEINFO_VERSION, FilesInfo, BYREF, NumberOfFiles),   \
                                        PERSIST_END_DECLARE_STRUCT(BACKUPIMAGEINFO, BACKUPIMAGEINFO_VERSION)


BOOL 
IsFloppyDiskInDrive(
    VOID
    );

#endif
#endif