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.
165 lines
3.6 KiB
165 lines
3.6 KiB
/*
|
|
Module Name:
|
|
|
|
mirror.h
|
|
|
|
Abstract:
|
|
|
|
This module is the header file for the code that copies from one
|
|
tree to another.
|
|
|
|
Author:
|
|
|
|
Andy Herron May 27 1998
|
|
|
|
Revision History:
|
|
|
|
*/
|
|
|
|
//
|
|
// This structure contains all the global data passed around for the
|
|
// different instances of copying subtrees active.
|
|
//
|
|
|
|
typedef struct _COPY_TREE_CONTEXT {
|
|
|
|
LIST_ENTRY PendingDirectoryList;
|
|
|
|
LARGE_INTEGER BytesCopied;
|
|
ULONG FilesCopied;
|
|
ULONG AttributesModified;
|
|
ULONG SourceFilesScanned;
|
|
ULONG DestFilesScanned;
|
|
ULONG DirectoriesCreated;
|
|
ULONG ErrorsEncountered;
|
|
ULONG FilesDeleted;
|
|
ULONG DirectoriesDeleted;
|
|
ULONG SecurityDescriptorsWritten;
|
|
ULONG SourceSecurityDescriptorsRead;
|
|
ULONG SFNWritten;
|
|
BOOLEAN Cancelled;
|
|
BOOLEAN DeleteOtherFiles;
|
|
|
|
CRITICAL_SECTION Lock;
|
|
|
|
} COPY_TREE_CONTEXT, *PCOPY_TREE_CONTEXT;
|
|
|
|
|
|
//
|
|
// this is the structure we use to track per thread instance data, per thread
|
|
// buffers, etc.
|
|
//
|
|
|
|
#define IMIRROR_INITIAL_SD_LENGTH 2048
|
|
#define IMIRROR_INITIAL_SFN_LENGTH 32
|
|
|
|
typedef struct _IMIRROR_THREAD_CONTEXT {
|
|
PCOPY_TREE_CONTEXT CopyContext;
|
|
|
|
LPBYTE SDBuffer;
|
|
DWORD SDBufferLength;
|
|
|
|
LPBYTE SFNBuffer;
|
|
DWORD SFNBufferLength;
|
|
|
|
LPBYTE DirectoryBuffer;
|
|
DWORD DirectoryBufferLength;
|
|
BOOLEAN IsNTFS;
|
|
HANDLE SourceDirHandle;
|
|
HANDLE DestDirHandle;
|
|
|
|
PVOID FindBufferBase;
|
|
PVOID FindBufferNext;
|
|
ULONG FindBufferLength;
|
|
|
|
LIST_ENTRY FilesToIgnore;
|
|
|
|
} IMIRROR_THREAD_CONTEXT, *PIMIRROR_THREAD_CONTEXT;
|
|
|
|
//
|
|
// This structure is used to report back errors that occurred during copying.
|
|
//
|
|
|
|
typedef struct _COPY_ERROR {
|
|
LIST_ENTRY ListEntry;
|
|
DWORD Error;
|
|
DWORD ActionCode;
|
|
PWCHAR FileName;
|
|
WCHAR FileNameBuffer[1];
|
|
} COPY_ERROR, *PCOPY_ERROR;
|
|
|
|
#define IMIRROR_ATTRIBUTES_TO_REPLICATE ( FILE_ATTRIBUTE_HIDDEN | \
|
|
FILE_ATTRIBUTE_READONLY | \
|
|
FILE_ATTRIBUTE_SYSTEM | \
|
|
FILE_ATTRIBUTE_TEMPORARY | \
|
|
FILE_ATTRIBUTE_NORMAL | \
|
|
FILE_ATTRIBUTE_DIRECTORY | \
|
|
FILE_ATTRIBUTE_ARCHIVE )
|
|
|
|
#define IMIRROR_ATTRIBUTES_TO_STORE (~(IMIRROR_ATTRIBUTES_TO_REPLICATE))
|
|
|
|
#define IMIRROR_ATTRIBUTES_TO_IGNORE ( FILE_ATTRIBUTE_OFFLINE | \
|
|
FILE_ATTRIBUTE_SPARSE_FILE | \
|
|
FILE_ATTRIBUTE_NOT_CONTENT_INDEXED )
|
|
|
|
//
|
|
// These are the functions in mirror.c
|
|
//
|
|
|
|
DWORD
|
|
AllocateCopyTreeContext (
|
|
PCOPY_TREE_CONTEXT *CopyContext,
|
|
BOOLEAN DeleteOtherFiles
|
|
);
|
|
|
|
VOID
|
|
FreeCopyTreeContext (
|
|
PCOPY_TREE_CONTEXT CopyContext
|
|
);
|
|
|
|
DWORD
|
|
CopyTree (
|
|
PCOPY_TREE_CONTEXT CopyContext,
|
|
BOOLEAN IsNtfs,
|
|
PWCHAR SourceRoot,
|
|
PWCHAR DestRoot
|
|
);
|
|
|
|
ULONG
|
|
ReportCopyError (
|
|
PCOPY_TREE_CONTEXT CopyContext OPTIONAL,
|
|
PWCHAR File,
|
|
DWORD ActionCode,
|
|
DWORD err
|
|
);
|
|
|
|
ULONG
|
|
IMConvertNT2Win32Error(
|
|
IN NTSTATUS Status
|
|
);
|
|
|
|
DWORD
|
|
IMFindNextFile(
|
|
PIMIRROR_THREAD_CONTEXT ThreadContext,
|
|
HANDLE DirHandle,
|
|
PFILE_FULL_DIR_INFORMATION *lpFindFileData
|
|
);
|
|
|
|
DWORD
|
|
IMFindFirstFile(
|
|
PIMIRROR_THREAD_CONTEXT ThreadContext,
|
|
HANDLE DirHandle,
|
|
PFILE_FULL_DIR_INFORMATION *lpFindFileData
|
|
);
|
|
|
|
NTSTATUS
|
|
GetTokenHandle(
|
|
IN OUT PHANDLE TokenHandle
|
|
);
|
|
|
|
NTSTATUS
|
|
SetPrivs(
|
|
IN HANDLE TokenHandle,
|
|
IN LPTSTR lpszPriv
|
|
);
|
|
|