[winpr,file] Add winpr_CreateFile wrapper

Allows creation of a file HANDLE from a utf-8 name
This commit is contained in:
Armin Novak
2025-06-04 15:56:01 +02:00
committed by akallabeth
parent 84691cf881
commit 07e39ede20
9 changed files with 110 additions and 96 deletions

View File

@@ -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);

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -78,7 +78,7 @@ static BOOL test_SetFileAttributesA(void)
rc = TRUE;
fail:
DeleteFileA(name);
winpr_DeleteFile(name);
free(name);
return rc;
}

View File

@@ -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;