📄 apis.c
字号:
GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
0,
OPEN_ALWAYS,
dwFileAttributes,
0);
if (INVALID_HANDLE_VALUE == hNewFile) {
VERIFY(CloseHandle(hExistingFile));
return FALSE;
}
// Destination file exists, so only delete destination file if copy
// cancelled through CopyProgressRoutine, as per CopyFileEx specification
dwFlags &= ~(COPYFILEEX_DELETE_DST);
}
// If destination file exists and is hidden or read-only, fail
dwFileAttributes = GetFileAttributes(lpszCNew);
if ((dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN|FILE_ATTRIBUTE_READONLY)) &&
fNewFileExists
) {
SetLastError(ERROR_ACCESS_DENIED);
goto cleanUp;
}
// Allocate copy chunk
lpbCopyChunk = VirtualAlloc(0, FS_COPYBLOCK_SIZE, MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE);
if (!lpbCopyChunk) {
SetLastError(ERROR_OUTOFMEMORY);
goto cleanUp;
}
// Get size of source file
liExistingFileSize.LowPart = GetFileSize(hExistingFile, (PDWORD)&liExistingFileSize.HighPart);
if (0xFFFFFFFF == liExistingFileSize.LowPart) {
goto cleanUp;
}
// Expand destination file
if (0xFFFFFFFF == SetFilePointer(
hNewFile,
(LONG) liExistingFileSize.LowPart,
&liExistingFileSize.HighPart,
FILE_BEGIN
)) {
// 0xFFFFFFFF is also a valid file pointer, confirm with GetLastError
if (NO_ERROR != GetLastError()) goto cleanUp;
}
// NT pre-allocates the destination file. If this fails, then behavior
// deviates from NT, but correctness is preserved.
SetEndOfFile(hNewFile);
// Reset destination file pointer
if (0xFFFFFFFF == SetFilePointer(hNewFile, 0, NULL, FILE_BEGIN)) {
goto cleanUp;
}
// NT will call CopyProgressRoutine for initial stream switch regardless
// of the value of *pbCancel
if (lpProgressRoutine) {
liTotalBytesTransferred.QuadPart = 0;
// File streams not supported; Always report stream 1
dwCopyProgressResult = (*lpProgressRoutine)(
liExistingFileSize,
liTotalBytesTransferred,
liExistingFileSize,
liTotalBytesTransferred,
1,
CALLBACK_STREAM_SWITCH,
hExistingFile,
hNewFile,
lpData);
switch (dwCopyProgressResult) {
case PROGRESS_CONTINUE:
break;
case PROGRESS_CANCEL:
dwFlags |= COPYFILEEX_DELETE_DST;
SetLastError(ERROR_REQUEST_ABORTED);
goto cleanUp;
case PROGRESS_STOP:
SetLastError(ERROR_REQUEST_ABORTED);
goto cleanUp;
case PROGRESS_QUIET:
dwFlags |= COPYFILEEX_QUIET;
break;
default:
ERRORMSG(1,(_T(
"CopyFileEx: Error: Unknown CopyProgressRoutine result\r\n"
)));
goto cleanUp;
}
}
// Perform copy
while (1) {
// Has the copy been cancelled?
if (pbCancel && *pbCancel) {
// Although the CopyFileEx specification is unclear as to whether
// the destination file is deleted when *pbCancel is TRUE, NT
// deletes the destination file when *pbCancel is TRUE, regardless
// of whether the file existed before CopyFileEx was invoked
dwFlags |= COPYFILEEX_DELETE_DST;
goto cleanUp;
}
if (!ReadFile(hExistingFile, lpbCopyChunk, FS_COPYBLOCK_SIZE, &dwBytesRead, 0)) {
goto cleanUp;
}
else if (
dwBytesRead &&
(!WriteFile(hNewFile, lpbCopyChunk, dwBytesRead, &dwBytesWritten, 0) ||
(dwBytesWritten != dwBytesRead)
)) {
goto cleanUp;
}
// Is copy complete?
if (dwBytesRead == 0) break;
// Update copy progress
liTotalBytesTransferred.QuadPart += (LONGLONG) dwBytesWritten;
// Call CopyProgressRoutine
if (!(dwFlags & COPYFILEEX_QUIET) && lpProgressRoutine) {
// File streams not supported; Always report stream 1
dwCopyProgressResult = (*lpProgressRoutine)(
liExistingFileSize,
liTotalBytesTransferred,
liExistingFileSize,
liTotalBytesTransferred,
1,
CALLBACK_CHUNK_FINISHED,
hExistingFile,
hNewFile,
lpData);
switch (dwCopyProgressResult) {
case PROGRESS_CONTINUE:
break;
case PROGRESS_CANCEL:
dwFlags |= COPYFILEEX_DELETE_DST;
SetLastError(ERROR_REQUEST_ABORTED);
goto cleanUp;
case PROGRESS_STOP:
SetLastError(ERROR_REQUEST_ABORTED);
goto cleanUp;
case PROGRESS_QUIET:
dwFlags |= COPYFILEEX_QUIET;
break;
default:
ERRORMSG(1,(_T(
"CopyFileEx: Error: Unknown CopyProgressRoutine result\r\n"
)));
goto cleanUp;
}
}
}
// The file was copied successfully
dwFlags |= COPYFILEEX_RET; // Mark success
dwFlags &= ~COPYFILEEX_DELETE_DST; // Unmark deletion of destination file
cleanUp:;
VirtualFree(lpbCopyChunk, 0, MEM_RELEASE);
if (dwFlags & COPYFILEEX_RET) {
// Set destination file time
GetFileTime(hExistingFile, &ftCreation, &ftLastAccess, &ftLastWrite);
SetFileTime(hNewFile, &ftCreation, &ftLastAccess, &ftLastWrite);
}
VERIFY(CloseHandle(hExistingFile));
VERIFY(CloseHandle(hNewFile));
if ((dwFlags & COPYFILEEX_RET) &&
(dwFlags & COPYFILEEX_SRC_READ_ONLY)) {
// If source file read-only, make destination file read-only
SetFileAttributes(lpszCNew, dwFileAttributes|FILE_ATTRIBUTE_READONLY);
}
// DeleteFile deletes a file if no open handles exist
if (dwFlags & COPYFILEEX_DELETE_DST) {
// Preserve LastError
dwError = GetLastError();
DeleteFile(lpszCNew);
SetLastError(dwError);
}
return (dwFlags & COPYFILEEX_RET);
}
BOOL GetFileAttributesExW(LPCWSTR lpFileName, GET_FILEEX_INFO_LEVELS fInfoLevelId, LPVOID lpFileInformation) {
LPCWSTR pTrav;
HANDLE hFind;
WIN32_FIND_DATA w32fd;
for (pTrav = lpFileName; *pTrav; pTrav++) {
if (*pTrav == '*' || *pTrav == '?') {
SetLastError(ERROR_INVALID_NAME);
return FALSE;
}
}
if (fInfoLevelId != GetFileExInfoStandard) {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
if ((hFind = FindFirstFile(lpFileName,&w32fd)) == INVALID_HANDLE_VALUE) {
SetLastError(ERROR_FILE_NOT_FOUND);
return FALSE;
}
xxx_CloseHandle(hFind);
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->dwFileAttributes = w32fd.dwFileAttributes;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->ftCreationTime = w32fd.ftCreationTime;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->ftLastAccessTime = w32fd.ftLastAccessTime;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->ftLastWriteTime = w32fd.ftLastWriteTime;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->nFileSizeHigh = w32fd.nFileSizeHigh;
((WIN32_FILE_ATTRIBUTE_DATA *)lpFileInformation)->nFileSizeLow = w32fd.nFileSizeLow;
return TRUE;
}
LPVOID WINAPI CeZeroPointer (LPVOID ptr)
{
return (LPVOID) ZeroPtr (ptr);
}
// Determine whether <pchTarget> matches <pchWildcardMask>; '?' and '*' are
// valid wildcards.
// The '*' quantifier is a 0 to <infinity> character wildcard.
// The '?' quantifier is a 0 or 1 character wildcard.
BOOL
MatchesWildcardMask(
DWORD lenWildcardMask,
PCWSTR pchWildcardMask,
DWORD lenTarget,
PCWSTR pchTarget
)
{
while (lenWildcardMask && lenTarget) {
if (*pchWildcardMask == L'?') {
// skip current target character
lenTarget--;
pchTarget++;
lenWildcardMask--;
pchWildcardMask++;
continue;
}
if (*pchWildcardMask == L'*') {
pchWildcardMask++;
if (--lenWildcardMask) {
while (lenTarget) {
if (MatchesWildcardMask(lenWildcardMask, pchWildcardMask, lenTarget--, pchTarget++)) {
return TRUE;
}
}
return FALSE;
}
return TRUE;
}
// test for case-insensitive equality
else if (_wcsnicmp(pchWildcardMask, pchTarget, 1)) {
return FALSE;
}
lenWildcardMask--;
pchWildcardMask++;
lenTarget--;
pchTarget++;
}
// target matches wildcard mask, succeed
if (!lenWildcardMask && !lenTarget) {
return TRUE;
}
// wildcard mask has been spent and target has characters remaining, fail
if (!lenWildcardMask) {
return FALSE;
}
// target has been spent; succeed only if wildcard characters remain
while (lenWildcardMask--) {
if (*pchWildcardMask != L'*' && *pchWildcardMask != L'?') {
return FALSE;
}
pchWildcardMask++;
}
return TRUE;
}
static BOOL s_ForcePixelDoubling;
static BOOL s_ForcePixelDoublingIsSet;
static BOOL s_ForcePixelDoublingIsChecked;
DWORD
WINAPI
ForcePixelDoubling(
BOOL torf
)
{
if ( s_ForcePixelDoublingIsSet ||
s_ForcePixelDoublingIsChecked )
{
// OK if setting the same value.
if ( s_ForcePixelDoubling == torf )
{
return ERROR_SUCCESS;
}
// Too late
if ( s_ForcePixelDoublingIsChecked )
{
return ERROR_ALREADY_REGISTERED;
}
// Different value
return ERROR_ALREADY_INITIALIZED;
}
s_ForcePixelDoubling = torf;
s_ForcePixelDoublingIsSet = TRUE;
return ERROR_SUCCESS;
}
int
WINAPI
IsForcePixelDoubling(
void
)
{
if ( GetCurrentProcessId() != (DWORD)GetOwnerProcess() )
{
int IsDouble = -1;
CALLBACKINFO cbi;
cbi.hProc = GetOwnerProcess();
cbi.pfn = (FARPROC)&IsForcePixelDoubling;
__try
{
IsDouble = PerformCallBack(&cbi);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
}
return IsDouble;
}
s_ForcePixelDoublingIsChecked = TRUE;
if ( !s_ForcePixelDoublingIsSet )
{
return -1;
}
return s_ForcePixelDoubling;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -