/D /Z are implement in ros cmd copy by BrandonTurner but reactos CopyFile and CopyFileEx does not support it yet, for /D are COPY_FILE_ALLOW_DECRYPTED_DESTNATION for decypt the file when it copy to dest and /Z are COPY_FILE_RESTARTABLE for network. so it is working in windows Modified: trunk/reactos/subsys/system/cmd/copy.c _____
Modified: trunk/reactos/subsys/system/cmd/copy.c --- trunk/reactos/subsys/system/cmd/copy.c 2005-07-16 23:44:16 UTC (rev 16600) +++ trunk/reactos/subsys/system/cmd/copy.c 2005-07-17 00:44:33 UTC (rev 16601) @@ -34,20 +34,20 @@
enum { - COPY_ASCII = 0x001, /* /A */ - COPY_DECRYPT = 0x004, /* /D : Not Impleneted */ + COPY_ASCII = 0x001, /* /A */ + COPY_DECRYPT = 0x004, /* /D */ COPY_VERIFY = 0x008, /* /V : Dummy, Never will be Impleneted */ COPY_SHORTNAME = 0x010, /* /N : Not Impleneted */ COPY_NO_PROMPT = 0x020, /* /Y */ COPY_PROMPT = 0x040, /* /-Y */ - COPY_RESTART = 0x080, /* /Z : Not Impleneted */ - COPY_BINARY = 0x100, /* /B */ + COPY_RESTART = 0x080, /* /Z */ + COPY_BINARY = 0x100, /* /B */ };
#define BUFF_SIZE 16384 /* 16k = max buffer size */
-int copy (LPTSTR source, LPTSTR dest, int append, DWORD lpdwFlags) +int copy (TCHAR source[MAX_PATH], TCHAR dest[MAX_PATH], int append, DWORD lpdwFlags) { TCHAR szMsg[RC_STRING_MAX_SIZE]; FILETIME srctime; @@ -59,6 +59,9 @@ DWORD dwWritten; DWORD i; BOOL bEof = FALSE; + TCHAR TrueDest[MAX_PATH]; + TCHAR TempSrc[MAX_PATH]; + TCHAR * FileName;
#ifdef _DEBUG DebugPrintf (_T("checking mode\n")); @@ -84,9 +87,46 @@
#ifdef _DEBUG DebugPrintf (_T("copy: flags has %s\n"), - *lpdwFlags & ASCII ? "ASCII" : "BINARY"); + *lpdwFlags & COPY_ASCII ? "ASCII" : "BINARY"); #endif
+ /* Check to see if /D or /Z are true, if so we need a middle + man to copy the file too to allow us to use CopyFileEx later */ + if(lpdwFlags & COPY_DECRYPT) + { + GetEnvironmentVariable(_T("TEMP"),TempSrc,MAX_PATH); + _tcscat(TempSrc,_T("\")); + FileName = _tcsrchr(source,_T('\')); + FileName++; + _tcscat(TempSrc,FileName); + /* This is needed to be on the end to prevent an error + if the user did "copy /D /Z foo bar then it would be copied + too %TEMP%\foo here and when %TEMP%\foo when it sets it up + for COPY_RESTART, this would mean it is copying to itself + which would error when it tried to open the handles for ReadFile + and WriteFile */ + _tcscat(TempSrc,_T(".decrypt")); + if(!CopyFileEx(source, TempSrc, NULL, NULL, FALSE, COPY_FILE_ALLOW_DECRYPTED_DESTINATION)) + { + nErrorLevel = 1; + return 0; + } + _tcscpy(source, TempSrc); + } + + + if(lpdwFlags & COPY_RESTART) + { + _tcscpy(TrueDest, dest); + GetEnvironmentVariable(_T("TEMP"),dest,MAX_PATH); + _tcscat(dest,_T("\")); + FileName = _tcsrchr(TrueDest,_T('\')); + FileName++; + _tcscat(dest,FileName); + } + + + if (!IsExistingFile (dest)) { #ifdef _DEBUG @@ -216,6 +256,25 @@ #endif SetFileAttributes (dest, dwAttrib);
+ /* Now finish off the copy if needed with CopyFileEx */ + if(lpdwFlags & COPY_RESTART) + { + if(!CopyFileEx(dest, TrueDest, NULL, NULL, FALSE, COPY_FILE_RESTARTABLE)) + { + nErrorLevel = 1; + DeleteFile(dest); + return 0; + } + /* Take care of file in the temp folder */ + DeleteFile(dest); + + } + + if(lpdwFlags & COPY_DECRYPT) + DeleteFile(TempSrc); + + + return 1; }