mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
[winpr,file] Add winpr_CreateFile wrapper
Allows creation of a file HANDLE from a utf-8 name
This commit is contained in:
@@ -264,10 +264,17 @@ extern "C"
|
||||
#endif
|
||||
|
||||
WINPR_ATTR_MALLOC(CloseHandle, 1)
|
||||
WINPR_API HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
|
||||
HANDLE hTemplateFile);
|
||||
WINPR_API HANDLE winpr_CreateFile(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
|
||||
HANDLE hTemplateFile);
|
||||
|
||||
WINPR_DEPRECATED_VAR("since 3.16.0, Use winpr_CreateFile",
|
||||
WINPR_ATTR_MALLOC(CloseHandle, 1) WINPR_API HANDLE CreateFileA(
|
||||
LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
|
||||
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
|
||||
HANDLE hTemplateFile));
|
||||
|
||||
WINPR_ATTR_MALLOC(CloseHandle, 1)
|
||||
WINPR_API HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
@@ -275,7 +282,8 @@ extern "C"
|
||||
DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes,
|
||||
HANDLE hTemplateFile);
|
||||
|
||||
WINPR_API BOOL DeleteFileA(LPCSTR lpFileName);
|
||||
WINPR_DEPRECATED_VAR("since 3.16.0, Use winpr_DeleteFile",
|
||||
WINPR_API BOOL DeleteFileA(LPCSTR lpFileName));
|
||||
|
||||
WINPR_API BOOL DeleteFileW(LPCWSTR lpFileName);
|
||||
|
||||
@@ -386,7 +394,9 @@ extern "C"
|
||||
WINPR_API BOOL CreateDirectoryA(LPCSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
|
||||
WINPR_API BOOL CreateDirectoryW(LPCWSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes);
|
||||
|
||||
WINPR_API BOOL RemoveDirectoryA(LPCSTR lpPathName);
|
||||
WINPR_DEPRECATED_VAR("since 3.16.0, Use winpr_RemoveDirectory",
|
||||
WINPR_API BOOL RemoveDirectoryA(LPCSTR lpPathName));
|
||||
|
||||
WINPR_API BOOL RemoveDirectoryW(LPCWSTR lpPathName);
|
||||
|
||||
WINPR_API HANDLE GetStdHandle(DWORD nStdHandle);
|
||||
@@ -401,11 +411,14 @@ extern "C"
|
||||
LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters,
|
||||
LPDWORD lpTotalNumberOfClusters);
|
||||
|
||||
WINPR_API BOOL MoveFileExA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags);
|
||||
WINPR_DEPRECATED_VAR("since 3.16.0, Use winpr_MoveFileEx",
|
||||
WINPR_API BOOL MoveFileExA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName,
|
||||
DWORD dwFlags));
|
||||
|
||||
WINPR_API BOOL MoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags);
|
||||
|
||||
WINPR_API BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName);
|
||||
WINPR_DEPRECATED_VAR("since 3.16.0, Use winpr_MoveFile",
|
||||
WINPR_API BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName));
|
||||
|
||||
WINPR_API BOOL MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName);
|
||||
|
||||
|
||||
@@ -230,6 +230,14 @@ int InstallAioSignalHandler()
|
||||
HANDLE CreateFileA(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
|
||||
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
|
||||
{
|
||||
return winpr_CreateFile(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
|
||||
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||
}
|
||||
|
||||
HANDLE winpr_CreateFile(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
|
||||
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
|
||||
{
|
||||
if (!lpFileName)
|
||||
return INVALID_HANDLE_VALUE;
|
||||
@@ -281,8 +289,8 @@ HANDLE CreateFileW(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hdl = CreateFileA(lpFileNameA, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
|
||||
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||
hdl = winpr_CreateFile(lpFileNameA, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
|
||||
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||
fail:
|
||||
free(lpFileNameA);
|
||||
return hdl;
|
||||
@@ -290,9 +298,7 @@ fail:
|
||||
|
||||
BOOL DeleteFileA(LPCSTR lpFileName)
|
||||
{
|
||||
int status = 0;
|
||||
status = unlink(lpFileName);
|
||||
return (status != -1) ? TRUE : FALSE;
|
||||
return winpr_DeleteFile(lpFileName);
|
||||
}
|
||||
|
||||
BOOL DeleteFileW(LPCWSTR lpFileName)
|
||||
@@ -300,13 +306,7 @@ BOOL DeleteFileW(LPCWSTR lpFileName)
|
||||
if (!lpFileName)
|
||||
return FALSE;
|
||||
LPSTR lpFileNameA = ConvertWCharToUtf8Alloc(lpFileName, NULL);
|
||||
BOOL rc = FALSE;
|
||||
|
||||
if (!lpFileNameA)
|
||||
goto fail;
|
||||
|
||||
rc = DeleteFileA(lpFileNameA);
|
||||
fail:
|
||||
BOOL rc = winpr_DeleteFile(lpFileNameA);
|
||||
free(lpFileNameA);
|
||||
return rc;
|
||||
}
|
||||
@@ -1254,14 +1254,7 @@ fail:
|
||||
|
||||
BOOL RemoveDirectoryA(LPCSTR lpPathName)
|
||||
{
|
||||
int ret = rmdir(lpPathName);
|
||||
|
||||
if (ret != 0)
|
||||
SetLastError(map_posix_err(errno));
|
||||
else
|
||||
SetLastError(STATUS_SUCCESS);
|
||||
|
||||
return ret == 0;
|
||||
return winpr_RemoveDirectory(lpPathName);
|
||||
}
|
||||
|
||||
BOOL RemoveDirectoryW(LPCWSTR lpPathName)
|
||||
@@ -1277,7 +1270,7 @@ BOOL RemoveDirectoryW(LPCWSTR lpPathName)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = RemoveDirectoryA(utfPathName);
|
||||
ret = winpr_RemoveDirectory(utfPathName);
|
||||
fail:
|
||||
free(utfPathName);
|
||||
return ret;
|
||||
@@ -1285,33 +1278,7 @@ fail:
|
||||
|
||||
BOOL MoveFileExA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags)
|
||||
{
|
||||
struct stat st;
|
||||
int ret = 0;
|
||||
ret = stat(lpNewFileName, &st);
|
||||
|
||||
if ((dwFlags & MOVEFILE_REPLACE_EXISTING) == 0)
|
||||
{
|
||||
if (ret == 0)
|
||||
{
|
||||
SetLastError(ERROR_ALREADY_EXISTS);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ret == 0 && (st.st_mode & S_IWUSR) == 0)
|
||||
{
|
||||
SetLastError(ERROR_ACCESS_DENIED);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
ret = rename(lpExistingFileName, lpNewFileName);
|
||||
|
||||
if (ret != 0)
|
||||
SetLastError(map_posix_err(errno));
|
||||
|
||||
return ret == 0;
|
||||
return winpr_MoveFileEx(lpExistingFileName, lpNewFileName, dwFlags);
|
||||
}
|
||||
|
||||
BOOL MoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlags)
|
||||
@@ -1329,7 +1296,7 @@ BOOL MoveFileExW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName, DWORD dwFlag
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ret = MoveFileExA(lpCExistingFileName, lpCNewFileName, dwFlags);
|
||||
ret = winpr_MoveFileEx(lpCExistingFileName, lpCNewFileName, dwFlags);
|
||||
fail:
|
||||
free(lpCNewFileName);
|
||||
free(lpCExistingFileName);
|
||||
@@ -1338,7 +1305,7 @@ fail:
|
||||
|
||||
BOOL MoveFileA(LPCSTR lpExistingFileName, LPCSTR lpNewFileName)
|
||||
{
|
||||
return MoveFileExA(lpExistingFileName, lpNewFileName, 0);
|
||||
return winpr_MoveFileEx(lpExistingFileName, lpNewFileName, 0);
|
||||
}
|
||||
|
||||
BOOL MoveFileW(LPCWSTR lpExistingFileName, LPCWSTR lpNewFileName)
|
||||
@@ -1385,3 +1352,19 @@ int UnixChangeFileMode(const char* filename, int flags)
|
||||
return rc;
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(_WIN32) || defined(_UWP)
|
||||
HANDLE winpr_CreateFile(LPCSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode,
|
||||
LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition,
|
||||
DWORD dwFlagsAndAttributes, HANDLE hTemplateFile)
|
||||
{
|
||||
char* filename = ConvertUtf8ToWCharAlloc(lpFileName, NULL);
|
||||
if (!filename)
|
||||
return NULL;
|
||||
|
||||
HANDLE hdl = CreateFileW(filename, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
|
||||
dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile);
|
||||
free(filename);
|
||||
return hdl;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <winpr/crt.h>
|
||||
#include <winpr/file.h>
|
||||
#include <winpr/path.h>
|
||||
#include <winpr/windows.h>
|
||||
|
||||
#if !defined(_WIN32)
|
||||
@@ -36,7 +37,7 @@ int TestFileDeleteFile(int argc, char* argv[])
|
||||
WINPR_UNUSED(argc);
|
||||
WINPR_UNUSED(argv);
|
||||
|
||||
rc = DeleteFileA(invalidA);
|
||||
rc = winpr_DeleteFile(invalidA);
|
||||
if (rc)
|
||||
return -1;
|
||||
|
||||
@@ -48,7 +49,7 @@ int TestFileDeleteFile(int argc, char* argv[])
|
||||
if (fd < 0)
|
||||
return -1;
|
||||
|
||||
rc = DeleteFileA(validA);
|
||||
rc = winpr_DeleteFile(validA);
|
||||
if (!rc)
|
||||
return -1;
|
||||
|
||||
|
||||
@@ -248,7 +248,7 @@ static int TestFileFindFirstFileA(const char* str)
|
||||
|
||||
rc = 0;
|
||||
fail:
|
||||
DeleteFileA(FilePath);
|
||||
winpr_DeleteFile(FilePath);
|
||||
cleanup_layout(BasePath);
|
||||
ArrayList_Free(files);
|
||||
return rc;
|
||||
|
||||
@@ -78,7 +78,7 @@ static BOOL test_SetFileAttributesA(void)
|
||||
rc = TRUE;
|
||||
|
||||
fail:
|
||||
DeleteFileA(name);
|
||||
winpr_DeleteFile(name);
|
||||
free(name);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -35,6 +35,8 @@
|
||||
#include <winpr/path.h>
|
||||
#include <winpr/wlog.h>
|
||||
|
||||
#include "../file/file.h"
|
||||
|
||||
#include "../log.h"
|
||||
#define TAG WINPR_TAG("path.shell")
|
||||
|
||||
@@ -697,36 +699,39 @@ fail:
|
||||
|
||||
BOOL winpr_MoveFile(LPCSTR lpExistingFileName, LPCSTR lpNewFileName)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
return MoveFileA(lpExistingFileName, lpNewFileName);
|
||||
#else
|
||||
BOOL result = FALSE;
|
||||
LPWSTR lpExistingFileNameW = NULL;
|
||||
LPWSTR lpNewFileNameW = NULL;
|
||||
|
||||
if (!lpExistingFileName || !lpNewFileName)
|
||||
return FALSE;
|
||||
|
||||
lpExistingFileNameW = ConvertUtf8ToWCharAlloc(lpExistingFileName, NULL);
|
||||
if (!lpExistingFileNameW)
|
||||
goto cleanup;
|
||||
lpNewFileNameW = ConvertUtf8ToWCharAlloc(lpNewFileName, NULL);
|
||||
if (!lpNewFileNameW)
|
||||
goto cleanup;
|
||||
|
||||
result = MoveFileW(lpExistingFileNameW, lpNewFileNameW);
|
||||
|
||||
cleanup:
|
||||
free(lpExistingFileNameW);
|
||||
free(lpNewFileNameW);
|
||||
return result;
|
||||
#endif
|
||||
return winpr_MoveFileEx(lpExistingFileName, lpNewFileName, 0);
|
||||
}
|
||||
|
||||
BOOL winpr_MoveFileEx(LPCSTR lpExistingFileName, LPCSTR lpNewFileName, DWORD dwFlags)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
return MoveFileExA(lpExistingFileName, lpNewFileName, dwFlags);
|
||||
struct stat st;
|
||||
int ret = 0;
|
||||
ret = stat(lpNewFileName, &st);
|
||||
|
||||
if ((dwFlags & MOVEFILE_REPLACE_EXISTING) == 0)
|
||||
{
|
||||
if (ret == 0)
|
||||
{
|
||||
SetLastError(ERROR_ALREADY_EXISTS);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (ret == 0 && (st.st_mode & S_IWUSR) == 0)
|
||||
{
|
||||
SetLastError(ERROR_ACCESS_DENIED);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
ret = rename(lpExistingFileName, lpNewFileName);
|
||||
|
||||
if (ret != 0)
|
||||
SetLastError(map_posix_err(errno));
|
||||
|
||||
return ret == 0;
|
||||
#else
|
||||
BOOL result = FALSE;
|
||||
LPWSTR lpExistingFileNameW = NULL;
|
||||
@@ -754,7 +759,11 @@ cleanup:
|
||||
BOOL winpr_DeleteFile(const char* lpFileName)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
return DeleteFileA(lpFileName);
|
||||
if (!lpFileName)
|
||||
return FALSE;
|
||||
|
||||
const int status = unlink(lpFileName);
|
||||
return (status != -1) ? TRUE : FALSE;
|
||||
#else
|
||||
LPWSTR lpFileNameW = NULL;
|
||||
BOOL result = FALSE;
|
||||
@@ -776,7 +785,14 @@ cleanup:
|
||||
BOOL winpr_RemoveDirectory(LPCSTR lpPathName)
|
||||
{
|
||||
#ifndef _WIN32
|
||||
return RemoveDirectoryA(lpPathName);
|
||||
int ret = rmdir(lpPathName);
|
||||
|
||||
if (ret != 0)
|
||||
SetLastError(map_posix_err(errno));
|
||||
else
|
||||
SetLastError(STATUS_SUCCESS);
|
||||
|
||||
return ret == 0;
|
||||
#else
|
||||
LPWSTR lpPathNameW = NULL;
|
||||
BOOL result = FALSE;
|
||||
|
||||
Reference in New Issue
Block a user