196 lines
6.6 KiB
C
196 lines
6.6 KiB
C
|
|
||
|
#include <windows.h>
|
||
|
#include <stdio.h>
|
||
|
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
|
||
|
#include <direct.h>
|
||
|
#include <io.h>
|
||
|
#include <conio.h>
|
||
|
|
||
|
#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);
|