2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS system libraries
4 * FILE: lib/kernel32/file/copy.c
5 * PURPOSE: Copying files
6 * PROGRAMMER: Ariadne ( ariadne@xs4all.nl)
9 * 07/02/99 Moved to seperate file
12 /* INCLUDES ****************************************************************/
14 #include <ddk/ntddk.h>
20 #include <kernel32/kernel32.h>
22 #define LPPROGRESS_ROUTINE void*
24 /* FUNCTIONS ****************************************************************/
26 WINBOOL STDCALL
CopyFileExW(LPCWSTR lpExistingFileName
,
27 LPCWSTR lpNewFileName
,
28 LPPROGRESS_ROUTINE lpProgressRoutine
,
34 HANDLE FileHandleSource
, FileHandleDest
;
35 IO_STATUS_BLOCK IoStatusBlock
;
36 FILE_STANDARD_INFORMATION FileStandard
;
37 FILE_BASIC_INFORMATION FileBasic
;
38 FILE_POSITION_INFORMATION FilePosition
;
39 UCHAR
*lpBuffer
= NULL
;
40 ULONG RegionSize
= 0x1000000;
43 FileHandleSource
= CreateFileW(lpExistingFileName
,
48 FILE_ATTRIBUTE_NORMAL
|FILE_FLAG_NO_BUFFERING
,
50 if (FileHandleSource
== NULL
)
55 errCode
= NtQueryInformationFile(FileHandleSource
,
58 sizeof(FILE_STANDARD_INFORMATION
),
59 FileStandardInformation
);
60 if (!NT_SUCCESS(errCode
))
62 NtClose(FileHandleSource
);
63 SetLastError(RtlNtStatusToDosError(errCode
));
67 errCode
= NtQueryInformationFile(FileHandleSource
,
68 &IoStatusBlock
,&FileBasic
,
69 sizeof(FILE_BASIC_INFORMATION
),
70 FileBasicInformation
);
71 if (!NT_SUCCESS(errCode
))
73 NtClose(FileHandleSource
);
74 SetLastError(RtlNtStatusToDosError(errCode
));
78 FileHandleDest
= CreateFileW(lpNewFileName
,
82 dwCopyFlags
? CREATE_NEW
: CREATE_ALWAYS
,
83 FileBasic
.FileAttributes
|FILE_FLAG_NO_BUFFERING
,
85 if (FileHandleDest
== NULL
)
90 FilePosition
.CurrentByteOffset
.QuadPart
= 0;
92 errCode
= NtSetInformationFile(FileHandleSource
,
95 sizeof(FILE_POSITION_INFORMATION
),
96 FilePositionInformation
);
97 if (!NT_SUCCESS(errCode
))
99 NtClose(FileHandleSource
);
100 NtClose(FileHandleDest
);
101 SetLastError(RtlNtStatusToDosError(errCode
));
105 errCode
= NtSetInformationFile(FileHandleDest
,
108 sizeof(FILE_POSITION_INFORMATION
),
109 FilePositionInformation
);
110 if (!NT_SUCCESS(errCode
))
112 NtClose(FileHandleSource
);
113 NtClose(FileHandleDest
);
114 SetLastError(RtlNtStatusToDosError(errCode
));
118 errCode
= NtAllocateVirtualMemory(NtCurrentProcess(),
125 if (!NT_SUCCESS(errCode
))
127 NtClose(FileHandleSource
);
128 NtClose(FileHandleDest
);
129 SetLastError(RtlNtStatusToDosError(errCode
));
134 errCode
= NtReadFile(FileHandleSource
,
138 (PIO_STATUS_BLOCK
)&IoStatusBlock
,
143 if (pbCancel
!= NULL
)
146 if (!NT_SUCCESS(errCode
) || bCancel
)
148 NtFreeVirtualMemory(NtCurrentProcess(),
149 (PVOID
*)&lpBuffer
, &RegionSize
,MEM_RELEASE
);
150 NtClose(FileHandleSource
);
151 NtClose(FileHandleDest
);
152 if ( errCode
== STATUS_END_OF_FILE
)
158 errCode
= NtWriteFile(FileHandleDest
,
162 (PIO_STATUS_BLOCK
)&IoStatusBlock
,
168 if (!NT_SUCCESS(errCode
))
170 NtFreeVirtualMemory(NtCurrentProcess(),
174 NtClose(FileHandleSource
);
175 NtClose(FileHandleDest
);
183 WINBOOL STDCALL
CopyFileExA(LPCSTR lpExistingFileName
,
184 LPCSTR lpNewFileName
,
185 LPPROGRESS_ROUTINE lpProgressRoutine
,
190 WCHAR ExistingFileNameW
[MAX_PATH
];
191 WCHAR NewFileNameW
[MAX_PATH
];
193 if (!KERNEL32_AnsiToUnicode(ExistingFileNameW
,
199 if (!KERNEL32_AnsiToUnicode(NewFileNameW
,
205 return(CopyFileExW(ExistingFileNameW
,
214 WINBOOL STDCALL
CopyFileA(LPCSTR lpExistingFileName
,
215 LPCSTR lpNewFileName
,
216 WINBOOL bFailIfExists
)
218 return CopyFileExA(lpExistingFileName
,
225 WINBOOL STDCALL
CopyFileW(LPCWSTR lpExistingFileName
,
226 LPCWSTR lpNewFileName
,
227 WINBOOL bFailIfExists
)
229 return CopyFileExW(lpExistingFileName
,