kernelbase: Implement CopyFile2().
This commit is contained in:
parent
1b0d8428df
commit
1e34842799
3 changed files with 46 additions and 7 deletions
|
@ -257,6 +257,7 @@
|
|||
@ stdcall -import ConvertThreadToFiberEx(ptr long)
|
||||
@ stdcall ConvertToGlobalHandle(long)
|
||||
@ stdcall -import CopyContext(ptr long ptr)
|
||||
@ stdcall -import CopyFile2(wstr wstr ptr)
|
||||
@ stdcall CopyFileA(str str long)
|
||||
@ stdcall CopyFileExA (str str ptr ptr ptr long)
|
||||
@ stdcall -import CopyFileExW(wstr wstr ptr ptr ptr long)
|
||||
|
|
|
@ -487,13 +487,15 @@ BOOL WINAPI DECLSPEC_HOTPATCH AreFileApisANSI(void)
|
|||
return !oem_file_apis;
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* CopyFileExW (kernelbase.@)
|
||||
/******************************************************************************
|
||||
* copy_file
|
||||
*/
|
||||
BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUTINE progress,
|
||||
void *param, BOOL *cancel_ptr, DWORD flags )
|
||||
static BOOL copy_file( const WCHAR *source, const WCHAR *dest, COPYFILE2_EXTENDED_PARAMETERS *params )
|
||||
{
|
||||
DWORD flags = params ? params->dwCopyFlags : 0;
|
||||
BOOL *cancel_ptr = params ? params->pfCancel : NULL;
|
||||
PCOPYFILE2_PROGRESS_ROUTINE progress = params ? params->pProgressRoutine : NULL;
|
||||
|
||||
static const int buffer_size = 65536;
|
||||
HANDLE h1, h2;
|
||||
FILE_BASIC_INFORMATION info;
|
||||
|
@ -502,6 +504,11 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT
|
|||
BOOL ret = FALSE;
|
||||
char *buffer;
|
||||
|
||||
if (cancel_ptr)
|
||||
FIXME("pfCancel is not supported\n");
|
||||
if (progress)
|
||||
FIXME("PCOPYFILE2_PROGRESS_ROUTINE is not supported\n");
|
||||
|
||||
if (!source || !dest)
|
||||
{
|
||||
SetLastError( ERROR_INVALID_PARAMETER );
|
||||
|
@ -577,7 +584,7 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT
|
|||
count -= res;
|
||||
}
|
||||
}
|
||||
ret = TRUE;
|
||||
ret = TRUE;
|
||||
done:
|
||||
/* Maintain the timestamp of source file to destination file and read-only attribute */
|
||||
info.FileAttributes &= FILE_ATTRIBUTE_READONLY;
|
||||
|
@ -589,6 +596,37 @@ done:
|
|||
return ret;
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* CopyFile2 (kernelbase.@)
|
||||
*/
|
||||
HRESULT WINAPI CopyFile2( const WCHAR *source, const WCHAR *dest, COPYFILE2_EXTENDED_PARAMETERS *params )
|
||||
{
|
||||
return copy_file(source, dest, params) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
|
||||
}
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
* CopyFileExW (kernelbase.@)
|
||||
*/
|
||||
BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUTINE progress,
|
||||
void *param, BOOL *cancel_ptr, DWORD flags )
|
||||
{
|
||||
COPYFILE2_EXTENDED_PARAMETERS params;
|
||||
|
||||
if (progress)
|
||||
FIXME("LPPROGRESS_ROUTINE is not supported\n");
|
||||
if (cancel_ptr)
|
||||
FIXME("cancel_ptr is not supported\n");
|
||||
|
||||
params.dwSize = sizeof(params);
|
||||
params.dwCopyFlags = flags;
|
||||
params.pProgressRoutine = NULL;
|
||||
params.pvCallbackContext = NULL;
|
||||
params.pfCancel = NULL;
|
||||
|
||||
return copy_file( source, dest, ¶ms );
|
||||
}
|
||||
|
||||
|
||||
/**************************************************************************
|
||||
* CopyFileW (kernelbase.@)
|
||||
|
|
|
@ -168,7 +168,7 @@
|
|||
@ stdcall ConvertThreadToFiberEx(ptr long)
|
||||
@ stdcall ConvertToAutoInheritPrivateObjectSecurity(ptr ptr ptr ptr long ptr)
|
||||
@ stdcall CopyContext(ptr long ptr)
|
||||
# @ stub CopyFile2
|
||||
@ stdcall CopyFile2(wstr wstr ptr)
|
||||
@ stdcall CopyFileExW(wstr wstr ptr ptr ptr long)
|
||||
@ stdcall CopyFileW(wstr wstr long)
|
||||
@ stdcall -arch=x86_64 CopyMemoryNonTemporal(ptr ptr long) ntdll.RtlCopyMemoryNonTemporal
|
||||
|
|
Loading…
Add table
Reference in a new issue