Implement support for move folder, even from different vol. But for now it does not think of EA or set file attrib right. it is a present to brandon so he stop nag about ros can not move a folder. It maybe got some other bugs. it need more testing see if it handling all case right.
Modified: trunk/reactos/lib/kernel32/file/move.c
Modified: trunk/reactos/lib/kernel32/include/kernel32.h

Modified: trunk/reactos/lib/kernel32/file/move.c
--- trunk/reactos/lib/kernel32/file/move.c	2005-09-25 21:02:43 UTC (rev 18072)
+++ trunk/reactos/lib/kernel32/file/move.c	2005-09-25 21:05:18 UTC (rev 18073)
@@ -405,14 +405,291 @@
                   }
 		 else
 		 {
-		  /* move folder not complete code */
-		  Result = CreateDirectoryW (lpNewFileName, NULL);
-		  if (Result == FALSE) return FALSE;
+		   /* move folder code start */
+		   WIN32_FIND_DATAW findBuffer;
+		   LPCWSTR lpExistingFileName2 = NULL;
+		   LPCWSTR lpNewFileName2 = NULL; 
+		   LPCWSTR lpDeleteFile = NULL;
+		   INT size;
+		   INT size2;
+		   BOOL loop = TRUE;
+		   BOOL Result = FALSE;
+
+		   /* Build the string */
+		   size = wcslen(lpExistingFileName); 
+
+		   lpDeleteFile = (LPCWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PATH * sizeof(WCHAR));
+		   if (lpDeleteFile == NULL)
+			   goto FreeMemAndExit;
+
+		   lpNewFileName2 = (LPCWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PATH * sizeof(WCHAR));
+		   if (lpNewFileName2 == NULL)
+			   goto FreeMemAndExit;
+
+		   lpExistingFileName2 = (LPCWSTR) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAX_PATH * sizeof(WCHAR));
+		   if (lpExistingFileName2 == NULL)
+			   goto FreeMemAndExit;
+	
+		   if ((size+6)*sizeof(WCHAR)>MAX_PATH)
+		   {
+		     HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,(VOID *) lpExistingFileName2,(size+6)*sizeof(WCHAR));
+			 if (lpExistingFileName2 == NULL)
+			     goto FreeMemAndExit;
+		   }
+	
+		   wcscpy( (WCHAR *)lpExistingFileName2,lpExistingFileName);
+		   wcscpy( (WCHAR *)&lpExistingFileName2[size],L"\\*.*\0");
+	  
+		   /* Get the file name */
+		   memset(&findBuffer,0,sizeof(WIN32_FIND_DATAW));
+		   hFile = FindFirstFileW(lpExistingFileName2,  &findBuffer);
+		   if (hFile == NULL) 
+		       loop=FALSE;
+
+		   if (findBuffer.cFileName[0] == L'\0')
+		       loop=FALSE;
+	
+		   DPRINT("MoveFileWithProgressW : lpExistingFileName1 = %S\n",lpExistingFileName);
+		   DPRINT("MoveFileWithProgressW : lpExistingFileName2 = %S\n",lpExistingFileName2);
+		   DPRINT("MoveFileWithProgressW : lpNewFileName = %S\n",lpNewFileName);
+
+		   DPRINT("MoveFileWithProgressW : loop = %d %d %d\n",TRUE, FALSE, loop);
+
+		   
+		   CreateDirectoryW(lpNewFileName,NULL);
+
+
+		   /* search the file */
+		   while (loop==TRUE)
+		   {	
+		     Result = TRUE;
+
+		     if ((!wcscmp(findBuffer.cFileName,L"..")) || (!wcscmp(findBuffer.cFileName,L".")))
+		     {		  
+		       loop = FindNextFileW(hFile, &findBuffer);		  
+		  		  
+		       if (!loop)
+		       {					 
+		         size = wcslen(lpExistingFileName2)-4;
+		         FindClose(hFile);
+		         wcscpy( (WCHAR *)&lpExistingFileName2[size],L"\0");
+
+		         if (wcsncmp(lpExistingFileName,lpExistingFileName2,size))
+		         {  
+		           FindClose(hFile);			     
+
+				   /* delete folder */	
+
+				   size = GetFullPathNameW(lpExistingFileName2, MAX_PATH,(LPWSTR) lpDeleteFile, NULL);
+				   if (size>MAX_PATH)
+				   {                  
+				     lpDeleteFile = (LPCWSTR) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, 
+				                    (VOID *) lpDeleteFile,size);
+
+					 if (lpDeleteFile == NULL)
+					 {
+						 Result = FALSE;
+			             goto FreeMemAndExit;
+					 }
+
+				     GetFullPathNameW(lpExistingFileName2, size,(LPWSTR) lpDeleteFile, NULL);
+				   }
+				 
+				   DPRINT("MoveFileWithProgressW : folder : %s\n",lpDeleteFile);
+
+				   Result = RemoveDirectoryW(lpDeleteFile);
+				   if (Result == FALSE)
+				       break;
+				 				 
+				   loop=TRUE;				 				 
+				   size = wcslen(lpExistingFileName); 
+				
+				   if ((size+6)*sizeof(WCHAR)>MAX_PATH)
+				   {
+				     lpExistingFileName2 = (LPCWSTR) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, 
+				                           (VOID *)lpExistingFileName2,(size+6)*sizeof(WCHAR));
+
+					 if (lpExistingFileName2 == NULL)
+					 {
+						 Result = FALSE;
+			             goto FreeMemAndExit;
+					 }
+				   }
+
+				   wcscpy( (WCHAR *)lpExistingFileName2,lpExistingFileName);
+				   wcscpy( (WCHAR *)&lpExistingFileName2[size],L"\\*.*\0");
+
+				   /* Get the file name */
+				   memset(&findBuffer,0,sizeof(WIN32_FIND_DATAW));
+				   hFile = FindFirstFileW(lpExistingFileName2, &findBuffer);	                 
+		         }
+               } 		  
+               continue;		  		  
+             }
+	  	  	  
+		     if (findBuffer.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+		     {	
+               DPRINT("MoveFileWithProgressW : 1: %S %S\n",lpExistingFileName2,findBuffer.cFileName);
+
+               /* Build the new string */		  		  		  
+               size = wcslen(findBuffer.cFileName); 
+               size2= wcslen(lpExistingFileName2);
+
+               if ((size2+size+6)*sizeof(WCHAR)>MAX_PATH)
+               {
+	             lpExistingFileName2 = (LPCWSTR) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, 
+				                       (VOID *)lpExistingFileName2, (size2+size+6)*sizeof(WCHAR));
+
+				 if (lpExistingFileName2 == NULL)
+				 {
+				   Result = FALSE;
+			       goto FreeMemAndExit;
+				 }
+	           }
+
+	           wcscpy( (WCHAR *)&lpExistingFileName2[size2-3],findBuffer.cFileName);
+	           wcscpy( (WCHAR *)&lpExistingFileName2[size2+size-3],L"\\*.*\0");
+          
 		  
-		  /* add scan code for move the folder */
+	           /* Build the new dst string */
+	           size = wcslen(lpExistingFileName2) + wcslen(lpNewFileName);
+	           size2 = wcslen(lpExistingFileName);
 		  
-		  AdjustFileAttributes(lpExistingFileName, lpNewFileName);
-		  Result = RemoveDirectoryW(lpExistingFileName);
+	           if (size>MAX_PATH)
+	           {
+	             lpNewFileName2 = (LPCWSTR) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, 
+                                  (VOID *) lpNewFileName2, size*sizeof(WCHAR));
+
+				 if (lpNewFileName2 == NULL)
+				 {
+				   Result = FALSE;
+			       goto FreeMemAndExit;
+				 }
+	           }
+
+	           wcscpy((WCHAR *) lpNewFileName2,lpNewFileName);		 		  
+	           size = wcslen(lpNewFileName);		 
+	           wcscpy((WCHAR *)&lpNewFileName2[size], (WCHAR *)&lpExistingFileName2[size2]);
+	           size = wcslen(lpNewFileName2);
+	           wcscpy( (WCHAR *)&lpNewFileName2[size-4],L"\0");
+
+	           /* build dest path */
+	           /* remove this code when it will be out into kernel32.dll ? */				 
+
+	           size = GetFullPathNameW(lpNewFileName2, MAX_PATH,(LPWSTR) lpDeleteFile, NULL);
+	           if (MAX_PATH>size2)
+	           {
+	            lpDeleteFile = (LPCWSTR) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, 
+	                           (VOID *) lpDeleteFile,size) ;
+
+				if (lpDeleteFile == NULL)
+				{
+				  Result = FALSE;
+			      goto FreeMemAndExit;
+				}
+
+	            GetFullPathNameW(lpNewFileName2, size,(LPWSTR) lpDeleteFile, NULL);
+	           }
+
+	           /* Create Folder */
+	          
+	           DPRINT("MoveFileWithProgressW : CreateDirectoryW lpNewFileName2 : %S\n",lpNewFileName2);
+	           DPRINT("MoveFileWithProgressW : CreateDirectoryW : %S\n",lpDeleteFile);
+
+	           CreateDirectoryW(lpDeleteFile,NULL);
+
+	           DPRINT("MoveFileWithProgressW : 1x: %S : %S \n",lpExistingFileName2, lpNewFileName2);
+
+	           FindClose(hFile);
+	           memset(&findBuffer,0,sizeof(WIN32_FIND_DATAW));
+	           hFile = FindFirstFileW(lpExistingFileName2, &findBuffer);
+	         }
+		     else
+		     {
+		  
+	           /* Build the new string */		  		  		  		  
+	           size = wcslen(findBuffer.cFileName); 
+	           size2= wcslen(lpExistingFileName2);
+	           wcscpy( (WCHAR *)lpDeleteFile,lpExistingFileName2);	   
+	           wcscpy( (WCHAR *)&lpDeleteFile[size2-3],findBuffer.cFileName);	   
+		  
+	           /* Build dest string */
+	           size = wcslen(lpDeleteFile) + wcslen(lpNewFileName);
+	           size2 = wcslen(lpExistingFileName);
+
+	           if (size*sizeof(WCHAR)>MAX_PATH)
+	           {
+                 lpNewFileName2 = (LPCWSTR) HeapReAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY, 
+                                  (VOID *) lpNewFileName2, size*sizeof(WCHAR)); 
+
+				 if (lpNewFileName2 == NULL)
+				 {
+				   Result = FALSE;
+			       goto FreeMemAndExit;
+				 }
+               }
+		  
+               wcscpy((WCHAR *) lpNewFileName2,lpNewFileName);		 		  
+               size = wcslen(lpNewFileName);		 
+               wcscpy((WCHAR *)&lpNewFileName2[size], (WCHAR *)&lpDeleteFile[size2]);
+		 
+               /* copy file */		  
+               Result = CopyFileW(lpDeleteFile,lpNewFileName2, FALSE);               			   			              
+
+               /* delete file */
+               DPRINT("MoveFileWithProgressW : Delete file : %S : %S\n",lpDeleteFile, lpNewFileName2);
+		  
+           
+               Result = DeleteFileW(lpDeleteFile);
+               if (Result == FALSE)
+               {  
+                 DPRINT("MoveFileWithProgressW : Fails\n");
+                 break;
+               }
+             }	  	 
+             DPRINT("MoveFileWithProgressW : 2 : %S  : %S \n",lpExistingFileName2,findBuffer.cFileName);
+             loop = FindNextFileW(hFile, &findBuffer);	  	  
+           }
+
+           FindClose(hFile);    
+           memset(&findBuffer,0,sizeof(WIN32_FIND_DATAW));
+           hFile = FindFirstFileW(lpExistingFileName2, &findBuffer);
+           if (hFile == NULL) 
+               loop=TRUE;
+
+           if (findBuffer.cFileName[0] == L'\0')
+               loop=TRUE;
+
+           if (loop == FALSE)
+		   {
+		     FindClose(hFile);				 
+		     Result = RemoveDirectoryW(lpExistingFileName);
+		     DPRINT("MoveFileWithProgressW RemoveDirectoryW :%S",lpExistingFileName);
+		   }
+
+FreeMemAndExit:
+		   DPRINT("MoveFileWithProgressW : result : r=%d, T=%d, F=%d",Result,TRUE,FALSE);
+
+		   if (lpNewFileName2 != NULL)
+		   {		
+		     HeapFree(GetProcessHeap(),0,(VOID *)  lpNewFileName2);
+		     lpNewFileName2 = NULL;
+		   }
+
+		   if (lpExistingFileName2 != NULL)
+		   {	  
+		     HeapFree(GetProcessHeap(),0,(VOID *) lpExistingFileName2);		
+		     lpExistingFileName2 = NULL;
+		   }
+
+		   if (lpDeleteFile != NULL)
+		   {		
+		     HeapFree(GetProcessHeap(),0,(VOID *) lpDeleteFile);		
+		     lpDeleteFile = NULL;
+		   }
+
+		   return Result;
+		   // end move folder code		 
 		  }
 	}
 	

Modified: trunk/reactos/lib/kernel32/include/kernel32.h
--- trunk/reactos/lib/kernel32/include/kernel32.h	2005-09-25 21:02:43 UTC (rev 18072)
+++ trunk/reactos/lib/kernel32/include/kernel32.h	2005-09-25 21:05:18 UTC (rev 18073)
@@ -74,6 +74,7 @@
 DWORD FilenameU2A_FitOrFail(LPSTR  DestA, INT destLen, PUNICODE_STRING SourceU);
 
 #define HeapAlloc RtlAllocateHeap
+#define HeapReAlloc RtlReAllocateHeap
 #define HeapFree RtlFreeHeap
 
 POBJECT_ATTRIBUTES