windows-nt/Source/XPSP1/NT/base/remoteboot/imirror/copy.h
2020-09-26 16:20:57 +08:00

302 lines
6.6 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
copy.h
Abstract:
This the include file for supporting copying files, creating new files, and
copying the registries to the remote server.
Author:
Sean Selitrennikoff - 4/5/98
Revision History:
--*/
extern WCHAR pConfigPath[MAX_PATH];
//
// Define structure for an on-disk master boot record. (pulled from
// private\windows\setup\textmode\kernel\sppartit.h)
//
typedef struct _ON_DISK_PTE {
UCHAR ActiveFlag;
UCHAR StartHead;
UCHAR StartSector;
UCHAR StartCylinder;
UCHAR SystemId;
UCHAR EndHead;
UCHAR EndSector;
UCHAR EndCylinder;
UCHAR RelativeSectors[4];
UCHAR SectorCount[4];
} ON_DISK_PTE, *PON_DISK_PTE;
typedef struct _ON_DISK_MBR {
UCHAR BootCode[440];
UCHAR NTFTSignature[4];
UCHAR Filler[2];
ON_DISK_PTE PartitionTable[4];
UCHAR AA55Signature[2];
} ON_DISK_MBR, *PON_DISK_MBR;
#define ALIGN(p,val) (PVOID)((((UINT_PTR)(p) + (val) - 1)) & (~((val) - 1)))
#define U_USHORT(p) (*(USHORT UNALIGNED *)(p))
#define U_ULONG(p) (*(ULONG UNALIGNED *)(p))
typedef struct _MIRROR_VOLUME_INFO {
LIST_ENTRY ListEntry;
DWORD MirrorTableIndex;
WCHAR DriveLetter;
UCHAR PartitionType;
BOOLEAN PartitionActive;
BOOLEAN IsBootDisk;
BOOLEAN CompressedVolume;
PWCHAR MirrorUncPath;
DWORD DiskNumber;
DWORD PartitionNumber;
DWORD DiskSignature;
DWORD BlockSize;
DWORD LastUSNMirrored;
ULONG FileSystemFlags;
WCHAR FileSystemName[16];
PWCHAR VolumeLabel;
PWCHAR NtName;
PWCHAR ArcName;
LARGE_INTEGER DiskSpaceUsed;
LARGE_INTEGER StartingOffset;
LARGE_INTEGER PartitionSize;
} MIRROR_VOLUME_INFO, *PMIRROR_VOLUME_INFO;
typedef struct _MIRROR_CFG_INFO {
DWORD MirrorVersion;
DWORD FileLength;
DWORD NumberVolumes;
PWCHAR SystemPath;
BOOLEAN SysPrepImage; // if FALSE, means it's a mirror
BOOLEAN Debug;
ULONG NumberOfProcessors;
ULONG MajorVersion;
ULONG MinorVersion;
ULONG BuildNumber;
ULONG KernelFileVersionMS;
ULONG KernelFileVersionLS;
ULONG KernelFileFlags;
PWCHAR CSDVersion;
PWCHAR ProcessorArchitecture;
PWCHAR CurrentType;
PWCHAR HalName;
LIST_ENTRY MirrorVolumeList;
} MIRROR_CFG_INFO, *PMIRROR_CFG_INFO;
extern PMIRROR_CFG_INFO GlobalMirrorCfgInfo;
typedef struct _IMIRROR_IGNORE_FILE_LIST {
LIST_ENTRY ListEntry;
USHORT FileNameLength;
WCHAR FileName[1];
} IMIRROR_IGNORE_FILE_LIST, *PIMIRROR_IGNORE_FILE_LIST;
//
// Main processing functions
//
NTSTATUS
AddCopyToDoItems(
VOID
);
//
// Functions for processing each to do item
//
NTSTATUS
CopyCopyFiles(
IN PVOID pBuffer,
IN ULONG Length
);
NTSTATUS
CopyCopyPartitions(
IN PVOID pBuffer,
IN ULONG Length
);
NTSTATUS
CopyCopyRegistry(
IN PVOID pBuffer,
IN ULONG Length
);
//
// Helper functions in filecopy.c
//
#if 0
NTSTATUS
DoFileCopy(
IN PWSTR pMachineDir,
IN PWSTR pSrc,
IN BOOLEAN CheckConfig
);
NTSTATUS
CopyNode(
IN PWIN32_FIND_DATA pSrcFindData,
IN BOOLEAN fFirstTime
);
#endif
DWORD
CallBackFn(LPCWSTR lpszName,
DWORD dwStatus,
DWORD dwHintFlags,
DWORD dwPinCount,
WIN32_FIND_DATAW *lpFind32,
DWORD dwReason,
DWORD dwParam1,
DWORD dwParam2,
DWORD dwContext
);
#if 0
BOOLEAN
CopyPath(
IN OUT PWCHAR *ppDest,
IN OUT PULONG pLength,
IN PWCHAR pSrc
);
BOOLEAN
CatPath(
IN OUT PWCHAR *ppDest,
IN OUT PULONG pLength,
IN PWCHAR pSrc
);
#endif
//
// Helper functions in regcopy.c
//
DWORD
DoFullRegBackup(
PWCHAR MirrorRoot
);
DWORD
DoSpecificRegBackup(
PWSTR HivePath,
HKEY HiveRoot,
PWSTR HiveName
);
DWORD
GetRegistryFileList(
PLIST_ENTRY ListHead
);
//
// Global Defines
//
#define TMP_BUFFER_SIZE 1024
#define ARRAYSIZE( _x ) ( sizeof( _x ) / sizeof( _x[ 0 ] ) )
//
// Global variables
//
extern BYTE TmpBuffer[TMP_BUFFER_SIZE];
extern BYTE TmpBuffer2[TMP_BUFFER_SIZE];
extern BYTE TmpBuffer3[TMP_BUFFER_SIZE];
extern HANDLE ghInst;
//
// Memory functions
//
#define IMirrorAllocMem(x) LocalAlloc( LPTR, x)
#define IMirrorFreeMem(x) LocalFree(x)
#define IMirrorReallocMem(x, sz) LocalReAlloc(x, sz, LMEM_MOVEABLE)
//
// Error handling
//
#define IMirrorHandleError(_s, _f) ((Callbacks.ErrorFn != NULL) ? \
Callbacks.ErrorFn(Callbacks.Context, _s, _f) : 0)
#define IMirrorNowDoing(_f, _s) ((Callbacks.NowDoingFn != NULL) ? \
Callbacks.NowDoingFn(Callbacks.Context, _f, _s) : 0)
#define IMirrorGetMirrorDir(_s, _l) ((Callbacks.GetMirrorDirFn != NULL) ? \
Callbacks.GetMirrorDirFn(Callbacks.Context, _s, _l) : 0)
#define IMirrorGetSetupPath(_s, _p, _l) ((Callbacks.GetSetupFn != NULL) ? \
Callbacks.GetSetupFn(Callbacks.Context, _s, _p, _l) : 0)
#define IMirrorSetSystemPath(_p, _l) ((Callbacks.SetSystemDirFn != NULL) ? \
Callbacks.SetSystemDirFn(Callbacks.Context, _p, _l) : 0)
#define IMirrorFileCreate(_f, _a, _e) ((Callbacks.FileCreateFn != NULL) ? \
Callbacks.FileCreateFn(Callbacks.Context, _f, _a, _e) : 0)
#define IMirrorRegSaveError(_p, _s) ((Callbacks.RegSaveErrorFn != NULL) ? \
Callbacks.RegSaveErrorFn(Callbacks.Context, _p, _s) : 0)
#define IMirrorReinit() ((Callbacks.ReinitFn != NULL) ? \
Callbacks.ReinitFn(Callbacks.Context) : 0)
//
// To Do item functions
//
NTSTATUS
GetNextToDoItem(
OUT PIMIRROR_TODO Item,
OUT PVOID *Buffer,
OUT PULONG Length
);
NTSTATUS
AddToDoItem(
IN IMIRROR_TODO Item,
IN PVOID Buffer,
IN ULONG Length
);
NTSTATUS
ModifyToDoItem(
IN IMIRROR_TODO Item,
IN PVOID Buffer,
IN ULONG Length
);
NTSTATUS
CopyToDoItemParameters(
IN IMIRROR_TODO Item,
OUT PVOID Buffer,
IN OUT PULONG Length
);
NTSTATUS
WriteMirrorConfigFile(
PWCHAR DestFile
);
NTSTATUS
SaveBootSector(
DWORD DiskNumber,
DWORD PartitionNumber,
DWORD BlockSize,
PWCHAR DestFile
);
extern WCHAR pConfigPath[MAX_PATH];
extern WCHAR pSystemPath[MAX_PATH];
extern WCHAR pCSDVersion[128];
extern WCHAR pProcessorArchitecture[64];
extern WCHAR pCurrentType[128];
extern WCHAR pHalName[128];