mirror of
https://github.com/reactos/reactos.git
synced 2024-10-05 08:54:40 +00:00
[KERNEL32]
- Formatting, no code change svn path=/trunk/; revision=57831
This commit is contained in:
parent
2f7f2bfb3c
commit
fe2af27884
|
@ -25,171 +25,171 @@ DEBUG_CHANNEL(kernel32file);
|
|||
|
||||
static NTSTATUS
|
||||
CopyLoop (
|
||||
HANDLE FileHandleSource,
|
||||
HANDLE FileHandleDest,
|
||||
LARGE_INTEGER SourceFileSize,
|
||||
LPPROGRESS_ROUTINE lpProgressRoutine,
|
||||
LPVOID lpData,
|
||||
BOOL *pbCancel,
|
||||
BOOL *KeepDest
|
||||
)
|
||||
HANDLE FileHandleSource,
|
||||
HANDLE FileHandleDest,
|
||||
LARGE_INTEGER SourceFileSize,
|
||||
LPPROGRESS_ROUTINE lpProgressRoutine,
|
||||
LPVOID lpData,
|
||||
BOOL *pbCancel,
|
||||
BOOL *KeepDest
|
||||
)
|
||||
{
|
||||
NTSTATUS errCode;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
UCHAR *lpBuffer = NULL;
|
||||
SIZE_T RegionSize = 0x10000;
|
||||
LARGE_INTEGER BytesCopied;
|
||||
DWORD CallbackReason;
|
||||
DWORD ProgressResult;
|
||||
BOOL EndOfFileFound;
|
||||
NTSTATUS errCode;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
UCHAR *lpBuffer = NULL;
|
||||
SIZE_T RegionSize = 0x10000;
|
||||
LARGE_INTEGER BytesCopied;
|
||||
DWORD CallbackReason;
|
||||
DWORD ProgressResult;
|
||||
BOOL EndOfFileFound;
|
||||
|
||||
*KeepDest = FALSE;
|
||||
errCode = NtAllocateVirtualMemory(NtCurrentProcess(),
|
||||
(PVOID *)&lpBuffer,
|
||||
0,
|
||||
&RegionSize,
|
||||
MEM_RESERVE | MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
*KeepDest = FALSE;
|
||||
errCode = NtAllocateVirtualMemory(NtCurrentProcess(),
|
||||
(PVOID *)&lpBuffer,
|
||||
0,
|
||||
&RegionSize,
|
||||
MEM_RESERVE | MEM_COMMIT,
|
||||
PAGE_READWRITE);
|
||||
|
||||
if (NT_SUCCESS(errCode))
|
||||
{
|
||||
BytesCopied.QuadPart = 0;
|
||||
EndOfFileFound = FALSE;
|
||||
CallbackReason = CALLBACK_STREAM_SWITCH;
|
||||
while (! EndOfFileFound &&
|
||||
NT_SUCCESS(errCode) &&
|
||||
(NULL == pbCancel || ! *pbCancel))
|
||||
{
|
||||
if (NULL != lpProgressRoutine)
|
||||
{
|
||||
ProgressResult = (*lpProgressRoutine)(SourceFileSize,
|
||||
BytesCopied,
|
||||
SourceFileSize,
|
||||
BytesCopied,
|
||||
0,
|
||||
CallbackReason,
|
||||
FileHandleSource,
|
||||
FileHandleDest,
|
||||
lpData);
|
||||
switch (ProgressResult)
|
||||
{
|
||||
case PROGRESS_CANCEL:
|
||||
TRACE("Progress callback requested cancel\n");
|
||||
errCode = STATUS_REQUEST_ABORTED;
|
||||
break;
|
||||
case PROGRESS_STOP:
|
||||
TRACE("Progress callback requested stop\n");
|
||||
errCode = STATUS_REQUEST_ABORTED;
|
||||
*KeepDest = TRUE;
|
||||
break;
|
||||
case PROGRESS_QUIET:
|
||||
lpProgressRoutine = NULL;
|
||||
break;
|
||||
case PROGRESS_CONTINUE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
CallbackReason = CALLBACK_CHUNK_FINISHED;
|
||||
}
|
||||
if (NT_SUCCESS(errCode))
|
||||
{
|
||||
errCode = NtReadFile(FileHandleSource,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PIO_STATUS_BLOCK)&IoStatusBlock,
|
||||
lpBuffer,
|
||||
RegionSize,
|
||||
NULL,
|
||||
NULL);
|
||||
if (NT_SUCCESS(errCode) && (NULL == pbCancel || ! *pbCancel))
|
||||
{
|
||||
errCode = NtWriteFile(FileHandleDest,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PIO_STATUS_BLOCK)&IoStatusBlock,
|
||||
lpBuffer,
|
||||
IoStatusBlock.Information,
|
||||
NULL,
|
||||
NULL);
|
||||
if (NT_SUCCESS(errCode))
|
||||
{
|
||||
BytesCopied.QuadPart += IoStatusBlock.Information;
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error 0x%08x reading writing to dest\n", errCode);
|
||||
}
|
||||
}
|
||||
else if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
if (STATUS_END_OF_FILE == errCode)
|
||||
{
|
||||
EndOfFileFound = TRUE;
|
||||
errCode = STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error 0x%08x reading from source\n", errCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (NT_SUCCESS(errCode))
|
||||
{
|
||||
BytesCopied.QuadPart = 0;
|
||||
EndOfFileFound = FALSE;
|
||||
CallbackReason = CALLBACK_STREAM_SWITCH;
|
||||
while (! EndOfFileFound &&
|
||||
NT_SUCCESS(errCode) &&
|
||||
(NULL == pbCancel || ! *pbCancel))
|
||||
{
|
||||
if (NULL != lpProgressRoutine)
|
||||
{
|
||||
ProgressResult = (*lpProgressRoutine)(SourceFileSize,
|
||||
BytesCopied,
|
||||
SourceFileSize,
|
||||
BytesCopied,
|
||||
0,
|
||||
CallbackReason,
|
||||
FileHandleSource,
|
||||
FileHandleDest,
|
||||
lpData);
|
||||
switch (ProgressResult)
|
||||
{
|
||||
case PROGRESS_CANCEL:
|
||||
TRACE("Progress callback requested cancel\n");
|
||||
errCode = STATUS_REQUEST_ABORTED;
|
||||
break;
|
||||
case PROGRESS_STOP:
|
||||
TRACE("Progress callback requested stop\n");
|
||||
errCode = STATUS_REQUEST_ABORTED;
|
||||
*KeepDest = TRUE;
|
||||
break;
|
||||
case PROGRESS_QUIET:
|
||||
lpProgressRoutine = NULL;
|
||||
break;
|
||||
case PROGRESS_CONTINUE:
|
||||
default:
|
||||
break;
|
||||
}
|
||||
CallbackReason = CALLBACK_CHUNK_FINISHED;
|
||||
}
|
||||
if (NT_SUCCESS(errCode))
|
||||
{
|
||||
errCode = NtReadFile(FileHandleSource,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PIO_STATUS_BLOCK)&IoStatusBlock,
|
||||
lpBuffer,
|
||||
RegionSize,
|
||||
NULL,
|
||||
NULL);
|
||||
if (NT_SUCCESS(errCode) && (NULL == pbCancel || ! *pbCancel))
|
||||
{
|
||||
errCode = NtWriteFile(FileHandleDest,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
(PIO_STATUS_BLOCK)&IoStatusBlock,
|
||||
lpBuffer,
|
||||
IoStatusBlock.Information,
|
||||
NULL,
|
||||
NULL);
|
||||
if (NT_SUCCESS(errCode))
|
||||
{
|
||||
BytesCopied.QuadPart += IoStatusBlock.Information;
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error 0x%08x reading writing to dest\n", errCode);
|
||||
}
|
||||
}
|
||||
else if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
if (STATUS_END_OF_FILE == errCode)
|
||||
{
|
||||
EndOfFileFound = TRUE;
|
||||
errCode = STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error 0x%08x reading from source\n", errCode);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (! EndOfFileFound && (NULL != pbCancel && *pbCancel))
|
||||
{
|
||||
TRACE("User requested cancel\n");
|
||||
errCode = STATUS_REQUEST_ABORTED;
|
||||
}
|
||||
if (! EndOfFileFound && (NULL != pbCancel && *pbCancel))
|
||||
{
|
||||
TRACE("User requested cancel\n");
|
||||
errCode = STATUS_REQUEST_ABORTED;
|
||||
}
|
||||
|
||||
NtFreeVirtualMemory(NtCurrentProcess(),
|
||||
(PVOID *)&lpBuffer,
|
||||
&RegionSize,
|
||||
MEM_RELEASE);
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE("Error 0x%08x allocating buffer of %d bytes\n", errCode, RegionSize);
|
||||
}
|
||||
NtFreeVirtualMemory(NtCurrentProcess(),
|
||||
(PVOID *)&lpBuffer,
|
||||
&RegionSize,
|
||||
MEM_RELEASE);
|
||||
}
|
||||
else
|
||||
{
|
||||
TRACE("Error 0x%08x allocating buffer of %d bytes\n", errCode, RegionSize);
|
||||
}
|
||||
|
||||
return errCode;
|
||||
return errCode;
|
||||
}
|
||||
|
||||
static NTSTATUS
|
||||
SetLastWriteTime(
|
||||
HANDLE FileHandle,
|
||||
LARGE_INTEGER LastWriteTime
|
||||
)
|
||||
HANDLE FileHandle,
|
||||
LARGE_INTEGER LastWriteTime
|
||||
)
|
||||
{
|
||||
NTSTATUS errCode = STATUS_SUCCESS;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
FILE_BASIC_INFORMATION FileBasic;
|
||||
NTSTATUS errCode = STATUS_SUCCESS;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
FILE_BASIC_INFORMATION FileBasic;
|
||||
|
||||
errCode = NtQueryInformationFile (FileHandle,
|
||||
&IoStatusBlock,
|
||||
&FileBasic,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
WARN("Error 0x%08x obtaining FileBasicInformation\n", errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
FileBasic.LastWriteTime.QuadPart = LastWriteTime.QuadPart;
|
||||
errCode = NtSetInformationFile (FileHandle,
|
||||
&IoStatusBlock,
|
||||
&FileBasic,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
WARN("Error 0x%0x setting LastWriteTime\n", errCode);
|
||||
}
|
||||
}
|
||||
errCode = NtQueryInformationFile (FileHandle,
|
||||
&IoStatusBlock,
|
||||
&FileBasic,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
WARN("Error 0x%08x obtaining FileBasicInformation\n", errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
FileBasic.LastWriteTime.QuadPart = LastWriteTime.QuadPart;
|
||||
errCode = NtSetInformationFile (FileHandle,
|
||||
&IoStatusBlock,
|
||||
&FileBasic,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
WARN("Error 0x%0x setting LastWriteTime\n", errCode);
|
||||
}
|
||||
}
|
||||
|
||||
return errCode;
|
||||
return errCode;
|
||||
}
|
||||
|
||||
|
||||
|
@ -199,113 +199,113 @@ SetLastWriteTime(
|
|||
BOOL
|
||||
WINAPI
|
||||
CopyFileExW (
|
||||
LPCWSTR lpExistingFileName,
|
||||
LPCWSTR lpNewFileName,
|
||||
LPPROGRESS_ROUTINE lpProgressRoutine,
|
||||
LPVOID lpData,
|
||||
BOOL *pbCancel,
|
||||
DWORD dwCopyFlags
|
||||
)
|
||||
LPCWSTR lpExistingFileName,
|
||||
LPCWSTR lpNewFileName,
|
||||
LPPROGRESS_ROUTINE lpProgressRoutine,
|
||||
LPVOID lpData,
|
||||
BOOL *pbCancel,
|
||||
DWORD dwCopyFlags
|
||||
)
|
||||
{
|
||||
NTSTATUS errCode;
|
||||
HANDLE FileHandleSource, FileHandleDest;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
FILE_STANDARD_INFORMATION FileStandard;
|
||||
FILE_BASIC_INFORMATION FileBasic;
|
||||
BOOL RC = FALSE;
|
||||
BOOL KeepDestOnError = FALSE;
|
||||
DWORD SystemError;
|
||||
NTSTATUS errCode;
|
||||
HANDLE FileHandleSource, FileHandleDest;
|
||||
IO_STATUS_BLOCK IoStatusBlock;
|
||||
FILE_STANDARD_INFORMATION FileStandard;
|
||||
FILE_BASIC_INFORMATION FileBasic;
|
||||
BOOL RC = FALSE;
|
||||
BOOL KeepDestOnError = FALSE;
|
||||
DWORD SystemError;
|
||||
|
||||
FileHandleSource = CreateFileW(lpExistingFileName,
|
||||
GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING,
|
||||
NULL);
|
||||
if (INVALID_HANDLE_VALUE != FileHandleSource)
|
||||
{
|
||||
errCode = NtQueryInformationFile(FileHandleSource,
|
||||
&IoStatusBlock,
|
||||
&FileStandard,
|
||||
sizeof(FILE_STANDARD_INFORMATION),
|
||||
FileStandardInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
TRACE("Status 0x%08x obtaining FileStandardInformation for source\n", errCode);
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
errCode = NtQueryInformationFile(FileHandleSource,
|
||||
&IoStatusBlock,&FileBasic,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
TRACE("Status 0x%08x obtaining FileBasicInformation for source\n", errCode);
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
FileHandleDest = CreateFileW(lpNewFileName,
|
||||
GENERIC_WRITE,
|
||||
FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
dwCopyFlags ? CREATE_NEW : CREATE_ALWAYS,
|
||||
FileBasic.FileAttributes,
|
||||
NULL);
|
||||
if (INVALID_HANDLE_VALUE != FileHandleDest)
|
||||
{
|
||||
errCode = CopyLoop(FileHandleSource,
|
||||
FileHandleDest,
|
||||
FileStandard.EndOfFile,
|
||||
lpProgressRoutine,
|
||||
lpData,
|
||||
pbCancel,
|
||||
&KeepDestOnError);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
LARGE_INTEGER t;
|
||||
FileHandleSource = CreateFileW(lpExistingFileName,
|
||||
GENERIC_READ,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_NO_BUFFERING,
|
||||
NULL);
|
||||
if (INVALID_HANDLE_VALUE != FileHandleSource)
|
||||
{
|
||||
errCode = NtQueryInformationFile(FileHandleSource,
|
||||
&IoStatusBlock,
|
||||
&FileStandard,
|
||||
sizeof(FILE_STANDARD_INFORMATION),
|
||||
FileStandardInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
TRACE("Status 0x%08x obtaining FileStandardInformation for source\n", errCode);
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
errCode = NtQueryInformationFile(FileHandleSource,
|
||||
&IoStatusBlock,&FileBasic,
|
||||
sizeof(FILE_BASIC_INFORMATION),
|
||||
FileBasicInformation);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
TRACE("Status 0x%08x obtaining FileBasicInformation for source\n", errCode);
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
FileHandleDest = CreateFileW(lpNewFileName,
|
||||
GENERIC_WRITE,
|
||||
FILE_SHARE_WRITE,
|
||||
NULL,
|
||||
dwCopyFlags ? CREATE_NEW : CREATE_ALWAYS,
|
||||
FileBasic.FileAttributes,
|
||||
NULL);
|
||||
if (INVALID_HANDLE_VALUE != FileHandleDest)
|
||||
{
|
||||
errCode = CopyLoop(FileHandleSource,
|
||||
FileHandleDest,
|
||||
FileStandard.EndOfFile,
|
||||
lpProgressRoutine,
|
||||
lpData,
|
||||
pbCancel,
|
||||
&KeepDestOnError);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
LARGE_INTEGER t;
|
||||
|
||||
t.QuadPart = FileBasic.LastWriteTime.QuadPart;
|
||||
errCode = SetLastWriteTime(FileHandleDest, t);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
RC = TRUE;
|
||||
}
|
||||
}
|
||||
NtClose(FileHandleDest);
|
||||
if (! RC && ! KeepDestOnError)
|
||||
{
|
||||
SystemError = GetLastError();
|
||||
SetFileAttributesW(lpNewFileName, FILE_ATTRIBUTE_NORMAL);
|
||||
DeleteFileW(lpNewFileName);
|
||||
SetLastError(SystemError);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error %d during opening of dest file\n", GetLastError());
|
||||
}
|
||||
}
|
||||
}
|
||||
NtClose(FileHandleSource);
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error %d during opening of source file\n", GetLastError());
|
||||
}
|
||||
t.QuadPart = FileBasic.LastWriteTime.QuadPart;
|
||||
errCode = SetLastWriteTime(FileHandleDest, t);
|
||||
if (!NT_SUCCESS(errCode))
|
||||
{
|
||||
BaseSetLastNTError(errCode);
|
||||
}
|
||||
else
|
||||
{
|
||||
RC = TRUE;
|
||||
}
|
||||
}
|
||||
NtClose(FileHandleDest);
|
||||
if (! RC && ! KeepDestOnError)
|
||||
{
|
||||
SystemError = GetLastError();
|
||||
SetFileAttributesW(lpNewFileName, FILE_ATTRIBUTE_NORMAL);
|
||||
DeleteFileW(lpNewFileName);
|
||||
SetLastError(SystemError);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error %d during opening of dest file\n", GetLastError());
|
||||
}
|
||||
}
|
||||
}
|
||||
NtClose(FileHandleSource);
|
||||
}
|
||||
else
|
||||
{
|
||||
WARN("Error %d during opening of source file\n", GetLastError());
|
||||
}
|
||||
|
||||
return RC;
|
||||
return RC;
|
||||
}
|
||||
|
||||
|
||||
|
@ -353,17 +353,17 @@ CopyFileExA(IN LPCSTR lpExistingFileName,
|
|||
BOOL
|
||||
WINAPI
|
||||
CopyFileA (
|
||||
LPCSTR lpExistingFileName,
|
||||
LPCSTR lpNewFileName,
|
||||
BOOL bFailIfExists
|
||||
)
|
||||
LPCSTR lpExistingFileName,
|
||||
LPCSTR lpNewFileName,
|
||||
BOOL bFailIfExists
|
||||
)
|
||||
{
|
||||
return CopyFileExA (lpExistingFileName,
|
||||
lpNewFileName,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
bFailIfExists);
|
||||
return CopyFileExA (lpExistingFileName,
|
||||
lpNewFileName,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
bFailIfExists);
|
||||
}
|
||||
|
||||
|
||||
|
@ -373,17 +373,17 @@ CopyFileA (
|
|||
BOOL
|
||||
WINAPI
|
||||
CopyFileW (
|
||||
LPCWSTR lpExistingFileName,
|
||||
LPCWSTR lpNewFileName,
|
||||
BOOL bFailIfExists
|
||||
)
|
||||
LPCWSTR lpExistingFileName,
|
||||
LPCWSTR lpNewFileName,
|
||||
BOOL bFailIfExists
|
||||
)
|
||||
{
|
||||
return CopyFileExW (lpExistingFileName,
|
||||
lpNewFileName,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
bFailIfExists);
|
||||
return CopyFileExW (lpExistingFileName,
|
||||
lpNewFileName,
|
||||
NULL,
|
||||
NULL,
|
||||
NULL,
|
||||
bFailIfExists);
|
||||
}
|
||||
|
||||
|
||||
|
@ -393,13 +393,13 @@ CopyFileW (
|
|||
BOOL
|
||||
WINAPI
|
||||
PrivCopyFileExW (
|
||||
LPCWSTR lpExistingFileName,
|
||||
LPCWSTR lpNewFileName,
|
||||
LPPROGRESS_ROUTINE lpProgressRoutine,
|
||||
LPVOID lpData,
|
||||
BOOL *pbCancel,
|
||||
DWORD dwCopyFlags
|
||||
)
|
||||
LPCWSTR lpExistingFileName,
|
||||
LPCWSTR lpNewFileName,
|
||||
LPPROGRESS_ROUTINE lpProgressRoutine,
|
||||
LPVOID lpData,
|
||||
BOOL *pbCancel,
|
||||
DWORD dwCopyFlags
|
||||
)
|
||||
{
|
||||
UNIMPLEMENTED;
|
||||
return FALSE;
|
||||
|
|
Loading…
Reference in a new issue