You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
490 lines
12 KiB
490 lines
12 KiB
/*++
|
|
|
|
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 attributes to be set on the file. If specified sets these attributes.
|
|
// If FILE_ATTRIBUTES_NONE then takes the default logic of attribute setting.
|
|
//
|
|
ULONG FileAttributes;
|
|
|
|
} 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)
|
|
//
|
|
// The headless spinner and error ui are not affected by this flag.
|
|
//
|
|
#define CREATE_DIRECTORY_FLAG_NO_STATUS_TEXT_UI (0x00000002)
|
|
|
|
BOOLEAN
|
|
SpCreateDirectory_Ustr(
|
|
IN PCUNICODE_STRING DevicePath,
|
|
IN PCUNICODE_STRING RootDirectory, OPTIONAL
|
|
IN PCUNICODE_STRING Directory,
|
|
IN ULONG DirAttrs,
|
|
IN ULONG CreateFlags
|
|
);
|
|
|
|
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,
|
|
IN BOOLEAN FileAttributesAvailable
|
|
);
|
|
|
|
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_
|