Skip to content

Commit 4a22a2a

Browse files
kartvaalasky17
authored andcommitted
kernelbase: Implement CopyFile2().
(cherry picked from commit 1e34842)
1 parent 4b1ca0a commit 4a22a2a

3 files changed

Lines changed: 46 additions & 7 deletions

File tree

dlls/kernel32/kernel32.spec

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@
257257
@ stdcall -import ConvertThreadToFiberEx(ptr long)
258258
@ stdcall ConvertToGlobalHandle(long)
259259
@ stdcall -import CopyContext(ptr long ptr)
260+
@ stdcall -import CopyFile2(wstr wstr ptr)
260261
@ stdcall CopyFileA(str str long)
261262
@ stdcall CopyFileExA (str str ptr ptr ptr long)
262263
@ stdcall -import CopyFileExW(wstr wstr ptr ptr ptr long)

dlls/kernelbase/file.c

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -487,13 +487,15 @@ BOOL WINAPI DECLSPEC_HOTPATCH AreFileApisANSI(void)
487487
return !oem_file_apis;
488488
}
489489

490-
491-
/***********************************************************************
492-
* CopyFileExW (kernelbase.@)
490+
/******************************************************************************
491+
* copy_file
493492
*/
494-
BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUTINE progress,
495-
void *param, BOOL *cancel_ptr, DWORD flags )
493+
static BOOL copy_file( const WCHAR *source, const WCHAR *dest, COPYFILE2_EXTENDED_PARAMETERS *params )
496494
{
495+
DWORD flags = params ? params->dwCopyFlags : 0;
496+
BOOL *cancel_ptr = params ? params->pfCancel : NULL;
497+
PCOPYFILE2_PROGRESS_ROUTINE progress = params ? params->pProgressRoutine : NULL;
498+
497499
static const int buffer_size = 65536;
498500
HANDLE h1, h2;
499501
FILE_BASIC_INFORMATION info;
@@ -502,6 +504,11 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT
502504
BOOL ret = FALSE;
503505
char *buffer;
504506

507+
if (cancel_ptr)
508+
FIXME("pfCancel is not supported\n");
509+
if (progress)
510+
FIXME("PCOPYFILE2_PROGRESS_ROUTINE is not supported\n");
511+
505512
if (!source || !dest)
506513
{
507514
SetLastError( ERROR_INVALID_PARAMETER );
@@ -577,7 +584,7 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT
577584
count -= res;
578585
}
579586
}
580-
ret = TRUE;
587+
ret = TRUE;
581588
done:
582589
/* Maintain the timestamp of source file to destination file */
583590
info.FileAttributes = 0;
@@ -589,6 +596,37 @@ BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUT
589596
return ret;
590597
}
591598

599+
/***********************************************************************
600+
* CopyFile2 (kernelbase.@)
601+
*/
602+
HRESULT WINAPI CopyFile2( const WCHAR *source, const WCHAR *dest, COPYFILE2_EXTENDED_PARAMETERS *params )
603+
{
604+
return copy_file(source, dest, params) ? S_OK : HRESULT_FROM_WIN32(GetLastError());
605+
}
606+
607+
608+
/***********************************************************************
609+
* CopyFileExW (kernelbase.@)
610+
*/
611+
BOOL WINAPI CopyFileExW( const WCHAR *source, const WCHAR *dest, LPPROGRESS_ROUTINE progress,
612+
void *param, BOOL *cancel_ptr, DWORD flags )
613+
{
614+
COPYFILE2_EXTENDED_PARAMETERS params;
615+
616+
if (progress)
617+
FIXME("LPPROGRESS_ROUTINE is not supported\n");
618+
if (cancel_ptr)
619+
FIXME("cancel_ptr is not supported\n");
620+
621+
params.dwSize = sizeof(params);
622+
params.dwCopyFlags = flags;
623+
params.pProgressRoutine = NULL;
624+
params.pvCallbackContext = NULL;
625+
params.pfCancel = NULL;
626+
627+
return copy_file( source, dest, &params );
628+
}
629+
592630

593631
/**************************************************************************
594632
* CopyFileW (kernelbase.@)

dlls/kernelbase/kernelbase.spec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,7 @@
168168
@ stdcall ConvertThreadToFiberEx(ptr long)
169169
@ stdcall ConvertToAutoInheritPrivateObjectSecurity(ptr ptr ptr ptr long ptr)
170170
@ stdcall CopyContext(ptr long ptr)
171-
# @ stub CopyFile2
171+
@ stdcall CopyFile2(wstr wstr ptr)
172172
@ stdcall CopyFileExW(wstr wstr ptr ptr ptr long)
173173
@ stdcall CopyFileW(wstr wstr long)
174174
@ stdcall -arch=x86_64 CopyMemoryNonTemporal(ptr ptr long) ntdll.RtlCopyMemoryNonTemporal

0 commit comments

Comments
 (0)