302 lines
6.6 KiB
C
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];
|
||
|
|