/*++

Copyright (c) 1993 Microsoft Corporation

Module Name:

    spcopy.h

Abstract:

    Header file for file copying functions in text setup.

Author:

    Ted Miller (tedm) 29-October-1993

Revision History:

    02-Oct-1996  jimschm  Added SpMoveWin9xFiles
    24-Feb-1997  jimschm  Added SpDeleteWin9xFiles
    28-Feb-1997  marcw    Moved *Win9x* functions to i386\win9xupg.c.
                          Added declarations for SpMigDeleteFile and SpMigMoveFileOrDir

--*/


#ifndef _SPCOPY_DEFN_
#define _SPCOPY_DEFN_

//
// Define structure used to describe a file to be copied
// to the target installation.
//
typedef struct _FILE_TO_COPY {

    struct _FILE_TO_COPY *Next;

    //
    // Name of the file to be copied, as it exists on the source media
    // (file name part only -- no paths).
    //
    PWSTR SourceFilename;

    //
    // Directory to which this file is to be copied.
    //
    PWSTR TargetDirectory;

    //
    // Name of file as it should exist on the target.
    //
    PWSTR TargetFilename;

    //
    // Path to target partition.  This is useful because
    // be will have to copy files to the nt drive and system partition,
    // and we don't want to serialize these lists (ie, we don't want to
    // worry about where the target is).
    //
    PWSTR TargetDevicePath;

    //
    // Flag indicating whether TargetDirectory is absolute.  If not, then it
    // is relative to a directory determined at run time (ie, sysroot).
    // This is useful for files that get copied to the system partition.
    //
    BOOLEAN AbsoluteTargetDirectory;

    //
    // Disposition flag to indicate the conditions under which the file
    // is to be copied. Can be one of the following, which may be ORed with
    // any of the COPY_xxx flags below.
    //
    //   COPY_ALWAYS                : always copied
    //   COPY_ONLY_IF_PRESENT       : copied only if present on the target
    //   COPY_ONLY_IF_NOT_PRESENT   : not copied if present on the target
    //   COPY_NEVER                 : never copied
    //
    ULONG Flags;

} FILE_TO_COPY, *PFILE_TO_COPY;

typedef struct _DISK_FILE_LIST {

    PWSTR MediaShortname;

    PWSTR Description;

    PWSTR TagFile;

    PWSTR Directory;

    ULONG FileCount;

    PFILE_TO_COPY FileList;

} DISK_FILE_LIST, *PDISK_FILE_LIST;


typedef struct _INCOMPATIBLE_FILE_ENTRY {

    //
    // Next in line
    //
    struct _INCOMPATIBLE_FILE_ENTRY *Next;

    //
    // Future - currently always zero
    //
    ULONG Flags;

    //
    // Short name (no path) of the file that is incompatible
    //
    PWSTR IncompatibleFileName;

    //
    // Version string (future use) of this file
    //
    PWSTR VersionString;

    //
    // Where it lives on the target media
    //
    PWSTR FullPathOnTarget;

} INCOMPATIBLE_FILE_ENTRY, *PINCOMPATIBLE_FILE_ENTRY;

typedef struct _INCOMPATIBLE_FILE_LIST {

    //
    // First entry in the list
    //
    PINCOMPATIBLE_FILE_ENTRY Head;

    //
    // Count, to speed things up
    //
    ULONG EntryCount;

} INCOMPATIBLE_FILE_LIST, *PINCOMPATIBLE_FILE_LIST;


#define COPY_ALWAYS                 0x00000000
#define COPY_ONLY_IF_PRESENT        0x00000001
#define COPY_ONLY_IF_NOT_PRESENT    0x00000002
#define COPY_NEVER                  0x00000003
#define COPY_DISPOSITION_MASK       0x0000000f

#define COPY_DELETESOURCE           0x00000010
#define COPY_SMASHLOCKS             0x00000020
#define COPY_SOURCEISOEM            0x00000040
#define COPY_OVERWRITEOEMFILE       0x00000080
#define COPY_FORCENOCOMP            0x00000100
#define COPY_SKIPIFMISSING          0x00000200
#define COPY_NOVERSIONCHECK         0x00000400
#define COPY_NODECOMP               0x00000800
#define COPY_DECOMPRESS_SYSPREP     0x00001000 // decompress even if it's a sysprep image

//
// Flags in [FileFlags] section of txtsetup.sif
//
#define FILEFLG_SMASHLOCKS          0x00000001
#define FILEFLG_FORCENOCOMP         0x00000002
#define FILEFLG_UPGRADEOVERWRITEOEM 0x00000004
#define FILEFLG_NOVERSIONCHECK      0x00000008
#define FILEFLG_DONTDELETESOURCE    0x00000010

#define SP_DELETE_FILESTODELETE 0
#define SP_COUNT_FILESTODELETE 1

//
//  Structure used to build a list of OEM inf files copied during the installation of OEM drivers
//
typedef struct _OEM_INF_FILE {

    struct _OEM_INF_FILE *Next;

    PWSTR InfName;

} OEM_INF_FILE, *POEM_INF_FILE;

//
// Type of routine to be called from SpCopyFileWithRetry
// when the screen needs repainting.
//
typedef
VOID
(*PCOPY_DRAW_ROUTINE) (
    IN PWSTR   FullSourcePath,     OPTIONAL
    IN PWSTR   FullTargetPath,     OPTIONAL
    IN BOOLEAN RepaintEntireScreen
    );

//
// Type of routine to be called from SpExpandFile
// for each file found in cabinet.
//

typedef enum {
    EXPAND_COPY_FILE,
    EXPAND_COPIED_FILE,
    EXPAND_QUERY_OVERWRITE,
    EXPAND_NOTIFY_CANNOT_EXPAND,
    EXPAND_NOTIFY_MULTIPLE,
    EXPAND_NOTIFY_CREATE_FAILED
} EXPAND_CALLBACK_MESSAGE;

typedef enum {
    EXPAND_NO_ERROR = 0,
    EXPAND_SKIP_THIS_FILE,
    EXPAND_COPY_THIS_FILE,
    EXPAND_CONTINUE,
    EXPAND_ABORT
} EXPAND_CALLBACK_RESULT;

typedef
EXPAND_CALLBACK_RESULT
(*PEXPAND_CALLBACK) (
    IN EXPAND_CALLBACK_MESSAGE  Message,
    IN PWSTR                    FileName,
    IN PLARGE_INTEGER           FileSize,
    IN PLARGE_INTEGER           FileTime,
    IN ULONG                    FileAttributes,
    IN PVOID                    CallbackContext
    );

VOID
SpCopyThirdPartyDrivers(
    IN PWSTR           SourceDevicePath,
    IN PWSTR           SysrootDevice,
    IN PWSTR           Sysroot,
    IN PWSTR           SyspartDevice,
    IN PWSTR           SyspartDirectory,
    IN PDISK_FILE_LIST DiskFileLists,
    IN ULONG           DiskCount
    );

NTSTATUS
SpCopyFileUsingNames(
    IN PWSTR   SourceFilename,
    IN PWSTR   TargetFilename,
    IN ULONG   TargetAttributes,
    IN ULONG   Flags
    );

VOID
SpValidateAndChecksumFile(
    IN  HANDLE   FileHandle, OPTIONAL
    IN  PWSTR    Filename,   OPTIONAL
    OUT PBOOLEAN IsNtImage,
    OUT PULONG   Checksum,
    OUT PBOOLEAN Valid
    );

VOID
SpCopyFileWithRetry(
    IN PFILE_TO_COPY      FileToCopy,
    IN PWSTR              SourceDevicePath,
    IN PWSTR              DirectoryOnSourceDevice,
    IN PWSTR              SourceDirectory,          OPTIONAL
    IN PWSTR              TargetRoot,               OPTIONAL
    IN ULONG              TargetFileAttributes,
    IN PCOPY_DRAW_ROUTINE DrawScreen,
    IN PULONG             CheckSum,
    IN PBOOLEAN           FileSkipped,
    IN ULONG              Flags
    );

VOID
SpCopyFiles(
    IN PVOID        SifHandle,
    IN PDISK_REGION SystemPartitionRegion,
    IN PDISK_REGION NtPartitionRegion,
    IN PWSTR        Sysroot,
    IN PWSTR        SystemPartitionDirectory,
    IN PWSTR        SourceDevicePath,
    IN PWSTR        DirectoryOnSourceDevice,
    IN PWSTR        ThirdPartySourceDevicePath
    );

VOID
SpDeleteAndBackupFiles(
    IN PVOID        SifHandle,
    IN PDISK_REGION TargetRegion,
    IN PWSTR        TargetPath
    );

//
// The user may skip this operation, in which case SpCreateDirectory
// returns FALSE.
//
#define CREATE_DIRECTORY_FLAG_SKIPPABLE     (0x00000001)

BOOLEAN
SpCreateDirectory(
    IN PCWSTR DevicePath,
    IN PCWSTR RootDirectory, OPTIONAL
    IN PCWSTR Directory,
    IN ULONG DirAttrs,
    IN ULONG CreateFlags
    );

VOID
SpCreateDirectoryStructureFromSif(
    IN PVOID SifHandle,
    IN PWSTR SifSection,
    IN PWSTR DevicePath,
    IN PWSTR RootDirectory
    );


NTSTATUS
SpMoveFileOrDirectory(
    IN PWSTR   SrcPath,
    IN PWSTR   DestPath
    );

VOID
SpCopyDirRecursive(
    IN PWSTR   SrcPath,
    IN PWSTR   DestDevPath,
    IN PWSTR   DestDirPath,
    IN ULONG   CopyFlags
    );

//
// Diamond/decompression routines.
//
VOID
SpdInitialize(
    VOID
    );

VOID
SpdTerminate(
    VOID
    );

BOOLEAN
SpdIsCabinet(
    IN PVOID SourceBaseAddress,
    IN ULONG SourceFileSize,
    OUT PBOOLEAN ContainsMultipleFiles
    );

BOOLEAN
SpdIsCompressed(
    IN PVOID SourceBaseAddress,
    IN ULONG SourceFileSize
    );

NTSTATUS
SpdDecompressFile(
    IN PVOID  SourceBaseAddress,
    IN ULONG  SourceFileSize,
    IN HANDLE DestinationHandle
    );

NTSTATUS
SpdDecompressCabinet(
    IN PVOID            SourceBaseAddress,
    IN ULONG            SourceFileSize,
    IN PWSTR            DestinationPath,
    IN PEXPAND_CALLBACK Callback,
    IN PVOID            CallbackContext
    );

NTSTATUS
SpdDecompressFileFromDriverCab(
    IN  PWSTR SourceFileName,
    IN  PVOID  SourceBaseAddress,
    IN  ULONG  SourceFileSize,
    IN  HANDLE DestinationHandle,
    OUT PUSHORT pDate,
    OUT PUSHORT pTime
    );

BOOLEAN
SpTimeFromDosTime(
    IN USHORT Date,
    IN USHORT Time,
    OUT PLARGE_INTEGER UtcTime
    );

VOID
SpMigDeleteFile (
    PWSTR DosFileToDelete
    );

VOID
SpMigMoveFileOrDir (
    IN PWSTR         SourceFileOrDir,
    IN PWSTR         DestFileOrDir
    );

VOID
SpInitializeFileLists(
    IN  PVOID            SifHandle,
    OUT PDISK_FILE_LIST *DiskFileLists,
    OUT PULONG           DiskCount
    );

VOID
SpAddSectionFilesToCopyList(
    IN PVOID           SifHandle,
    IN PDISK_FILE_LIST DiskFileLists,
    IN ULONG           DiskCount,
    IN PWSTR           SectionName,
    IN PWSTR           TargetDevicePath,
    IN PWSTR           TargetDirectory,
    IN ULONG           CopyOptions,
    IN BOOLEAN         CheckForNoComp
    );

VOID
SpCopyFilesInCopyList(
    IN PVOID                    SifHandle,
    IN PDISK_FILE_LIST          DiskFileLists,
    IN ULONG                    DiskCount,
    IN PWSTR                    SourceDevicePath,
    IN PWSTR                    DirectoryOnSourceDevice,
    IN PWSTR                    TargetRoot,
    IN PINCOMPATIBLE_FILE_LIST  CompatibilityExceptionList OPTIONAL
    );

VOID
SpFreeCopyLists(
    IN OUT PDISK_FILE_LIST *DiskFileLists,
    IN     ULONG            DiskCount
    );

NTSTATUS
SpExpandFile(
    IN PWSTR            SourceFilename,
    IN PWSTR            TargetPathname,
    IN PEXPAND_CALLBACK Callback,
    IN PVOID            CallbackContext
    );

NTSTATUS
SpCreateIncompatibleFileEntry(
    OUT PINCOMPATIBLE_FILE_ENTRY *TargetEntry,
    IN PWSTR FileName,
    IN PWSTR VersionString          OPTIONAL,
    IN PWSTR TargetAbsolutePath     OPTIONAL,
    IN ULONG Flags                  OPTIONAL
    );


NTSTATUS
SpFreeIncompatibleFileList(
    IN PINCOMPATIBLE_FILE_LIST FileListHead
    );

BOOLEAN
SpIsFileIncompatible(
    IN  PINCOMPATIBLE_FILE_LIST FileList,
    IN  PFILE_TO_COPY           pFile,
    IN  PWSTR                   TargetRoot OPTIONAL
    );


NTSTATUS
SpInitializeCompatibilityOverwriteLists(
    IN  PVOID                   SifHandle,
    OUT PINCOMPATIBLE_FILE_LIST IncompatibleFileList
    );

#endif // ndef _SPCOPY_DEFN_