/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;
 }