#include #include #include #include #include #include #include #define GetFileAttributeError 0xFFFFFFFF #define printval( var, type) printf( #var " = %" #type "\n", var) // macro for debugging #define READ_BUFFER_SIZE ( 8*1024*sizeof(DWORD)) // 32k blocks #define ATTRIBUTE_TYPE DWORD #define GET_ATTRIBUTES( FileName, Attributes) Attributes = GetFileAttributes( FileName) #define SET_ATTRIBUTES( FileName, Attributes) !SetFileAttributes( FileName, Attributes) HINSTANCE NtDll; // used to load Dll's rather than link with them #define WORK_INITIALIZE_ITEM 0 #define WORK_ITEM 1 #define WORK_TERMINATE_ITEM 2 typedef VOID (*PWORKER_ROUTINE)(); typedef struct _WORK_QUEUE { CRITICAL_SECTION CriticalSection; HANDLE Semaphore; LIST_ENTRY Queue; BOOL Terminating; PWORKER_ROUTINE WorkerRoutine; DWORD NumberOfWorkerThreads; HANDLE WorkerThreads[ 1 ]; // Variable length array } WORK_QUEUE, *PWORK_QUEUE; typedef struct _WORK_QUEUE_ITEM { LIST_ENTRY List; DWORD Reason; PWORK_QUEUE WorkQueue; } WORK_QUEUE_ITEM, *PWORK_QUEUE_ITEM; typedef struct _VIRTUAL_BUFFER { LPVOID Base; SIZE_T PageSize; LPVOID CommitLimit; LPVOID ReserveLimit; } VIRTUAL_BUFFER, *PVIRTUAL_BUFFER; typedef struct _COPY_REQUEST_STATE { VIRTUAL_BUFFER Buffer; LPSTR CurrentOutput; } COPY_REQUEST_STATE, *PCOPY_REQUEST_STATE; CRITICAL_SECTION CreatePathCriticalSection; typedef struct _COPY_REQUEST { WORK_QUEUE_ITEM WorkItem; LPSTR Destination; LPSTR FullPathSrc; ATTRIBUTE_TYPE Attributes; DWORD SizeLow; } COPY_REQUEST, *PCOPY_REQUEST; INT NumberOfWorkerThreads; DWORD TlsIndex; PWORK_QUEUE CDWorkQueue; #define NONREADONLYSYSTEMHIDDEN ( ~( FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_HIDDEN)) #define NORMAL_ATTRIBUTES (FILE_ATTRIBUTE_DIRECTORY | \ FILE_ATTRIBUTE_READONLY | \ FILE_ATTRIBUTE_SYSTEM | \ FILE_ATTRIBUTE_HIDDEN | \ FILE_ATTRIBUTE_ARCHIVE) #define _strrev FILE *CheckFile; char CheckFileName[_MAX_PATH]; typedef struct NodeStruct { char *Name; FILETIME Time; ATTRIBUTE_TYPE Attributes; int Height; struct NodeStruct *First; struct NodeStruct *Last; struct NodeStruct *Left; struct NodeStruct *Next; struct NodeStruct *Right; DWORD SizeHigh; DWORD SizeLow; char Flag[5]; struct NodeStruct *DiffNode; BOOL Process; } *LinkedFileList; /* linked file list */ typedef struct CFLStruct { LinkedFileList *List; char *Path; } *PCFLStruct; DWORD ReadBuffer[READ_BUFFER_SIZE/sizeof(DWORD)]; BOOL ProcessModeDefault; // // Flags passed to COMPDIR // BOOL fBreakLinks; BOOL fCheckAttribs; BOOL fCheckBits; BOOL fChecking; BOOL fCheckSize; BOOL fCheckTime; BOOL fCreateNew; BOOL fCreateLink; BOOL fDoNotDelete; BOOL fDoNotRecurse; BOOL fDontCopyAttribs; BOOL fDontLowerCase; BOOL fExclude; BOOL fExecute; BOOL fIgnoreRs; // Ignore Resource, TimeStamps, CheckSums and Rebase Information BOOL fIgnoreSlmFiles; BOOL fMatching; BOOL fMultiThread; BOOL fOpposite; BOOL fScript; BOOL fSpecAttribs; BOOL fVerbose; BOOL ExitValue; BOOL SparseTree; BOOL NoMapBinaryCompare( char *file1, char *file2); BOOL BinaryCompare( char *file1, char *file2); LPSTR CombineThreeStrings( char *FirstString, char *SecondString, char *ThirdString); void CompDir( char *Path1, char *Path2); BOOL FilesDiffer( LinkedFileList File1, LinkedFileList File2, char *Path1, char *Path2); void CompLists( LinkedFileList *AddList, LinkedFileList *DelList, LinkedFileList *DifList, char *Path1, char *Path2); void CopyNode( char *Destination, LinkedFileList Source, char *FullPathSrc); DWORD CreateFileList( LPVOID ThreadParameter); BOOL DelNode( char *name); BOOL IsFlag( char *argv); BOOL MyCreatePath( char *Path, BOOL IsDirectory); BOOL MyCopyFile( LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists); void ParseEnvArgs( void); void ParseArgs( int argc, char *argv[]); void PrintFile( LinkedFileList File, char *Path, char *DiffPath); void PrintList( LinkedFileList list); void ProcessAdd( LinkedFileList List, char *String1, char *String2); void ProcessDel( LinkedFileList List, char *String); void ProcessDiff( LinkedFileList List, char *String1, char *String2); void ProcessLists( LinkedFileList AddList, LinkedFileList DelList, LinkedFileList DifList, char *Path1, char *Path2 ); void Usage( void); BOOL AddToList( LinkedFileList Node, LinkedFileList *list); void CreateNode( LinkedFileList *Node, WIN32_FIND_DATA *Buff); BOOL InitializeNtDllFunctions(); BOOL MakeLink( char *src, char *dst, BOOL Output); int NumberOfLinks( char *FileName); BOOL SisCopyFile( LPCSTR lpExistingFileName, LPCSTR lpNewFileName, BOOL bFailIfExists, LPBOOL fTrySis); PWORK_QUEUE CreateWorkQueue( IN DWORD NumberOfWorkerThreads, IN PWORKER_ROUTINE WorkerRoutine); VOID ProcessRequest( IN PWORK_QUEUE_ITEM WorkItem); VOID DestroyWorkQueue( IN OUT PWORK_QUEUE WorkQueue); DWORD WorkerThread( LPVOID lpThreadParameter); VOID DestroyWorkQueue( IN OUT PWORK_QUEUE WorkQueue); BOOL QueueWorkItem( IN OUT PWORK_QUEUE WorkQueue, IN PWORK_QUEUE_ITEM WorkItem); VOID ProcessCopyFile( IN PCOPY_REQUEST WorkerRequest, IN PCOPY_REQUEST_STATE State); BOOL CreateVirtualBuffer( OUT PVIRTUAL_BUFFER Buffer, IN SIZE_T CommitSize, IN SIZE_T ReserveSize OPTIONAL); BOOL ExtendVirtualBuffer( IN PVIRTUAL_BUFFER Buffer, IN LPVOID Address); BOOL TrimVirtualBuffer( IN PVIRTUAL_BUFFER Buffer); BOOL FreeVirtualBuffer( IN PVIRTUAL_BUFFER Buffer); int VirtualBufferExceptionFilter( IN DWORD ExceptionCode, IN PEXCEPTION_POINTERS ExceptionInfo, IN OUT PVIRTUAL_BUFFER Buffer); void CreateNameNode( LinkedFileList *Node, char *Name); void DuplicateNode( LinkedFileList FirstNode, LinkedFileList *Node); BOOL Excluded( char *Buff, char *Path); BOOL Matched( char *Buff, char *Path); void FreeList( LinkedFileList *list); LPSTR MyStrCat( char* firststring, char *secondstring); BOOL Match( char *pat, char* text); void OutOfMem( void); void PrintTree( LinkedFileList List, int Level); BOOL FindInMatchListTop( char *Name, LinkedFileList *List); BOOL FindInMatchListFront( char *Name, LinkedFileList *List); LinkedFileList *FindInList( char *Name, LinkedFileList *List); LinkedFileList *Next( LinkedFileList List);