Moved CloseFile within MoveFileExW.
[reactos.git] / reactos / lib / kernel32 / file / move.c
index 454967f..881b9d0 100644 (file)
-/*
+/* $Id: move.c,v 1.5 2002/04/27 19:15:43 hbirr Exp $
+ *
  * COPYRIGHT:       See COPYING in the top level directory
  * PROJECT:         ReactOS system libraries
  * FILE:            lib/kernel32/file/file.c
  * PURPOSE:         Directory functions
  * PROGRAMMER:      Ariadne ( ariadne@xs4all.nl)
- *                 GetTempFileName is modified from WINE [ Alexandre Juiliard ]
  * UPDATE HISTORY:
  *                  Created 01/11/98
  */
 
-/* FIXME: the large integer manipulations in this file dont handle overflow  */
-
-/* INCLUDES ****************************************************************/
+/* INCLUDES *****************************************************************/
 
 #include <ddk/ntddk.h>
 #include <windows.h>
-#include <wchar.h>
-#include <string.h>
+#include <ntos/minmax.h>
 
-//#define NDEBUG
+#define NDEBUG
 #include <kernel32/kernel32.h>
 
+
+#define FILE_RENAME_SIZE  MAX_PATH +sizeof(FILE_RENAME_INFORMATION)
+
+
 /* FUNCTIONS ****************************************************************/
 
 WINBOOL
 STDCALL
-MoveFileA(
-    LPCSTR lpExistingFileName,
-    LPCSTR lpNewFileName
-    )
+MoveFileA (
+       LPCSTR  lpExistingFileName,
+       LPCSTR  lpNewFileName
+       )
 {
-       return MoveFileExA(lpExistingFileName,lpNewFileName,MOVEFILE_COPY_ALLOWED);
+       return MoveFileExA (lpExistingFileName,
+                           lpNewFileName,
+                           MOVEFILE_COPY_ALLOWED);
 }
 
+
 WINBOOL
 STDCALL
-MoveFileExA(
-    LPCSTR lpExistingFileName,
-    LPCSTR lpNewFileName,
-    DWORD dwFlags
-    )
+MoveFileExA (
+       LPCSTR  lpExistingFileName,
+       LPCSTR  lpNewFileName,
+       DWORD   dwFlags
+       )
 {
-       ULONG i;
-       WCHAR ExistingFileNameW[MAX_PATH];
-       WCHAR NewFileNameW[MAX_PATH];
+       UNICODE_STRING ExistingFileNameU;
+       UNICODE_STRING NewFileNameU;
+       ANSI_STRING ExistingFileName;
+       ANSI_STRING NewFileName;
+       WINBOOL Result;
+
+       RtlInitAnsiString (&ExistingFileName,
+                          (LPSTR)lpExistingFileName);
+
+       RtlInitAnsiString (&NewFileName,
+                          (LPSTR)lpNewFileName);
+
+       /* convert ansi (or oem) string to unicode */
+       if (bIsFileApiAnsi)
+       {
+               RtlAnsiStringToUnicodeString (&ExistingFileNameU,
+                                             &ExistingFileName,
+                                             TRUE);
+               RtlAnsiStringToUnicodeString (&NewFileNameU,
+                                             &NewFileName,
+                                             TRUE);
+       }
+       else
+       {
+               RtlOemStringToUnicodeString (&ExistingFileNameU,
+                                            &ExistingFileName,
+                                            TRUE);
+               RtlOemStringToUnicodeString (&NewFileNameU,
+                                            &NewFileName,
+                                            TRUE);
+       }
 
-       
+       Result = MoveFileExW (ExistingFileNameU.Buffer,
+                             NewFileNameU.Buffer,
+                             dwFlags);
 
-       i = 0;
-       while ((*lpExistingFileName)!=0 && i < MAX_PATH)
-       {
-               ExistingFileNameW[i] = *lpExistingFileName;
-               lpExistingFileName++;
-               i++;
-       }
-       ExistingFileNameW[i] = 0;
-
-       i = 0;
-       while ((*lpNewFileName)!=0 && i < MAX_PATH)
-       {
-               NewFileNameW[i] = *lpNewFileName;
-               lpNewFileName++;
-               i++;
-       }
-       NewFileNameW[i] = 0;
-
-       return MoveFileExW(ExistingFileNameW,NewFileNameW,dwFlags);
-       
-}
+       RtlFreeHeap (RtlGetProcessHeap (),
+                    0,
+                    ExistingFileNameU.Buffer);
+       RtlFreeHeap (RtlGetProcessHeap (),
+                    0,
+                    NewFileNameU.Buffer);
 
+       return Result;
+}
 
 
 WINBOOL
 STDCALL
-MoveFileW(
-    LPCWSTR lpExistingFileName,
-    LPCWSTR lpNewFileName
-    )
+MoveFileW (
+       LPCWSTR lpExistingFileName,
+       LPCWSTR lpNewFileName
+       )
 {
-       return MoveFileExW(lpExistingFileName,lpNewFileName,MOVEFILE_COPY_ALLOWED);
+       return MoveFileExW (lpExistingFileName,
+                           lpNewFileName,
+                           MOVEFILE_COPY_ALLOWED);
 }
 
-#define FILE_RENAME_SIZE  MAX_PATH +sizeof(FILE_RENAME_INFORMATION)
 
 WINBOOL
 STDCALL
-MoveFileExW(
-    LPCWSTR lpExistingFileName,
-    LPCWSTR lpNewFileName,
-    DWORD dwFlags
-    )
+MoveFileExW (
+       LPCWSTR lpExistingFileName,
+       LPCWSTR lpNewFileName,
+       DWORD   dwFlags
+       )
 {
        HANDLE hFile = NULL;
        IO_STATUS_BLOCK IoStatusBlock;
@@ -97,33 +119,39 @@ MoveFileExW(
        USHORT Buffer[FILE_RENAME_SIZE];
        NTSTATUS errCode;       
 
-       hFile = CreateFileW(
-               lpExistingFileName,     
-               GENERIC_ALL,    
-               FILE_SHARE_WRITE|FILE_SHARE_READ,       
-               NULL,   
-               OPEN_EXISTING,  
-               FILE_ATTRIBUTE_NORMAL,  
-               NULL 
-       );
-
-
+       hFile = CreateFileW (lpExistingFileName,
+                            GENERIC_ALL,
+                            FILE_SHARE_WRITE|FILE_SHARE_READ,
+                            NULL,
+                            OPEN_EXISTING,
+                            FILE_ATTRIBUTE_NORMAL,
+                            NULL);
 
        FileRename = (FILE_RENAME_INFORMATION *)Buffer;
-       if ( ( dwFlags & MOVEFILE_REPLACE_EXISTING ) == MOVEFILE_REPLACE_EXISTING )
+       if ((dwFlags & MOVEFILE_REPLACE_EXISTING) == MOVEFILE_REPLACE_EXISTING)
                FileRename->Replace = TRUE;
        else
                FileRename->Replace = FALSE;
 
-       FileRename->FileNameLength = lstrlenW(lpNewFileName);
-       memcpy(FileRename->FileName,lpNewFileName,min(FileRename->FileNameLength,MAX_PATH));
+       FileRename->FileNameLength = wcslen (lpNewFileName);
+       memcpy (FileRename->FileName,
+               lpNewFileName,
+               min(FileRename->FileNameLength, MAX_PATH));
        
-       errCode = NtSetInformationFile(hFile,&IoStatusBlock,FileRename, FILE_RENAME_SIZE, FileRenameInformation);
-       if ( !NT_SUCCESS(errCode) ) {
-               if ( CopyFileW(lpExistingFileName,lpNewFileName,FileRename->Replace) )
-                       DeleteFileW(lpExistingFileName);
-       }
-
+       errCode = NtSetInformationFile (hFile,
+                                       &IoStatusBlock,
+                                       FileRename,
+                                       FILE_RENAME_SIZE,
+                                       FileRenameInformation);
        CloseHandle(hFile);
+       if (!NT_SUCCESS(errCode))
+       {
+               if (CopyFileW (lpExistingFileName,
+                              lpNewFileName,
+                              FileRename->Replace))
+                       DeleteFileW (lpExistingFileName);
+       }
        return TRUE;
 }
+
+/* EOF */