Merge pull request #12070 from akallabeth/mingw-fixes

Mingw fixes
This commit is contained in:
akallabeth
2025-12-13 17:32:21 +01:00
committed by GitHub
15 changed files with 78 additions and 44 deletions

View File

@@ -21,4 +21,5 @@ set(${MODULE_PREFIX}_SRCS rdpdr_main.c rdpdr_main.h)
set(${MODULE_PREFIX}_LIBS freerdp)
option(WITH_WCHAR_FILE_DIRECTORY_INFORMATION "Build with WCHAR FILE_DIRECTORY_INFORMATION::FileName" OFF)
add_channel_server_library(${MODULE_PREFIX} ${MODULE_NAME} ${CHANNEL_NAME} FALSE "VirtualChannelEntry")

View File

@@ -2341,9 +2341,17 @@ static UINT rdpdr_server_read_file_directory_information(wLog* log, wStream* s,
if (!Stream_CheckAndLogRequiredLengthWLog(log, s, fileNameLength))
return ERROR_INVALID_DATA;
if (fileNameLength / sizeof(WCHAR) > ARRAYSIZE(fdi->FileName))
return ERROR_INVALID_DATA;
#if defined(__MINGW32__) || defined(WITH_WCHAR_FILE_DIRECTORY_INFORMATION)
if (Stream_Read_UTF16_String(s, fdi->FileName, fileNameLength / sizeof(WCHAR)))
return ERROR_INVALID_DATA;
#else
if (Stream_Read_UTF16_String_As_UTF8_Buffer(s, fileNameLength / sizeof(WCHAR), fdi->FileName,
ARRAYSIZE(fdi->FileName)) < 0)
return ERROR_INVALID_DATA;
#endif
return CHANNEL_RC_OK;
}

View File

@@ -281,7 +281,7 @@ static BOOL wf_pre_connect(freerdp* instance)
return FALSE;
}
uint32_t keyboardLayoutId = freerdp_settings_get_uint32(settings, FreeRDP_KeyboardLayout);
DWORD keyboardLayoutId = freerdp_settings_get_uint32(settings, FreeRDP_KeyboardLayout);
{
CHAR name[KL_NAMELENGTH + 1] = { 0 };

View File

@@ -2469,8 +2469,8 @@ static int parse_codec_cache_options(rdpSettings* settings, const COMMAND_LINE_A
static BOOL check_kbd_remap_valid(const char* token)
{
DWORD key = 0;
DWORD value = 0;
UINT32 key = 0;
UINT32 value = 0;
WINPR_ASSERT(token);
/* The remapping is only allowed for scancodes, so maximum is 999=999 */

View File

@@ -239,4 +239,10 @@
#cmakedefine WITHOUT_FREERDP_3x_DEPRECATED
#endif
/** Build FILE_DIRECTORY_INFORMATION::FileName with type WCHAR instead of char
*
* @since version 3.20.0
*/
#cmakedefine WITH_WCHAR_FILE_DIRECTORY_INFORMATION
#endif /* FREERDP_CONFIG_H */

View File

@@ -24,6 +24,7 @@
#define FREERDP_CHANNEL_RDPDR_SERVER_RDPDR_H
#include <freerdp/api.h>
#include <freerdp/config.h>
#include <freerdp/types.h>
#include <freerdp/channels/wtsvc.h>
#include <freerdp/channels/rdpdr.h>
@@ -59,7 +60,11 @@ typedef struct
LARGE_INTEGER EndOfFile;
LARGE_INTEGER AllocationSize;
UINT32 FileAttributes;
#if defined(WITH_WCHAR_FILE_DIRECTORY_INFORMATION)
WCHAR FileName[512];
#else
char FileName[512];
#endif
} FILE_DIRECTORY_INFORMATION;
#endif

View File

@@ -330,7 +330,7 @@ static char* guid2str(const GUID* guid, char* buffer, size_t len)
{
if (!guid)
return NULL;
char* strguid = NULL;
RPC_CSTR strguid = NULL;
RPC_STATUS rpcStatus = UuidToStringA(guid, &strguid);

View File

@@ -539,7 +539,7 @@ static int rpc_channel_rpch_init(RpcClient* client, RpcChannel* channel, const c
if (guid)
{
char* strguid = NULL;
RPC_CSTR strguid = NULL;
RPC_STATUS rpcStatus = UuidToStringA(guid, &strguid);
if (rpcStatus != RPC_S_OK)

View File

@@ -1515,7 +1515,8 @@ BOOL freerdp_tcp_set_nodelay(wLog* log, DWORD level, int sockfd)
int type = -1;
socklen_t typelen = sizeof(type);
const int rc = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, &type, &typelen);
char* ptype = (char*)&type;
const int rc = getsockopt(sockfd, SOL_SOCKET, SO_TYPE, ptype, &typelen);
if (rc < 0)
{
char buffer[128] = { 0 };

View File

@@ -46,7 +46,7 @@
static BOOL cert_info_allocate(rdpCertInfo* info, size_t size);
BOOL read_bignum(BYTE** dst, UINT32* length, const BIGNUM* num, BOOL alloc)
BOOL read_bignum(BYTE** dst, DWORD* length, const BIGNUM* num, BOOL alloc)
{
WINPR_ASSERT(dst);
WINPR_ASSERT(length);
@@ -97,7 +97,7 @@ BOOL cert_info_create(rdpCertInfo* dst, const BIGNUM* rsa, const BIGNUM* rsa_e)
if (!read_bignum(&dst->Modulus, &dst->ModulusLength, rsa, TRUE))
goto fail;
UINT32 len = sizeof(dst->exponent);
DWORD len = sizeof(dst->exponent);
BYTE* ptr = &dst->exponent[0];
if (!read_bignum(&ptr, &len, rsa_e, FALSE))
goto fail;

View File

@@ -28,6 +28,8 @@
#include <freerdp/log.h>
#include <freerdp/api.h>
#include "opensslcompat.h"
#ifdef __cplusplus
extern "C"
{
@@ -40,7 +42,7 @@ extern "C"
FREERDP_LOCAL BOOL cert_info_read_modulus(rdpCertInfo* info, size_t size, wStream* s);
FREERDP_LOCAL BOOL cert_info_read_exponent(rdpCertInfo* info, size_t size, wStream* s);
FREERDP_LOCAL BOOL read_bignum(BYTE** dst, UINT32* length, const BIGNUM* num, BOOL alloc);
FREERDP_LOCAL BOOL read_bignum(BYTE** dst, DWORD* length, const BIGNUM* num, BOOL alloc);
#if !defined(OPENSSL_VERSION_MAJOR) || (OPENSSL_VERSION_MAJOR < 3)
FREERDP_LOCAL X509* x509_from_rsa(const RSA* rsa);

View File

@@ -382,8 +382,8 @@ FREERDP_REMAP_TABLE* freerdp_keyboard_remap_string_to_list(const char* list)
char* token = strtok_s(copy, ",", &context);
while (token)
{
DWORD key = 0;
DWORD value = 0;
UINT32 key = 0;
UINT32 value = 0;
if (!freerdp_extract_key_value(token, &key, &value))
goto fail;
if (key >= remap_table_size)

View File

@@ -141,19 +141,19 @@ if [ $CLONE -ne 0 ]; then
do_clone v1.3.1 https://github.com/madler/zlib.git zlib
do_clone uriparser-0.9.8 https://github.com/uriparser/uriparser.git uriparser
do_clone json-c-0.18-20240915 https://github.com/json-c/json-c.git json-c
do_clone release-3.2.10 https://github.com/libsdl-org/SDL.git SDL
do_clone release-3.2.28 https://github.com/libsdl-org/SDL.git SDL
if [ $FFMPEG -ne 0 ]; then
do_clone n7.1.1 https://github.com/FFmpeg/FFmpeg.git FFmpeg
do_clone n8.0.1 https://github.com/FFmpeg/FFmpeg.git FFmpeg
fi
if [ $OPENH264 -ne 0 ]; then
do_clone v2.6.0 https://github.com/cisco/openh264.git openh264
fi
do_clone v1.0.28-0 https://github.com/libusb/libusb-cmake.git libusb-cmake
do_clone v1.0.29-0 https://github.com/libusb/libusb-cmake.git libusb-cmake
do_clone release-3.2.4 https://github.com/libsdl-org/SDL_image.git SDL_image
do_clone release-3.2.2 https://github.com/libsdl-org/SDL_ttf.git SDL_ttf
do_clone v2.0.3 https://github.com/mstorsjo/fdk-aac.git fdk-aac
do_clone v1.5.2 https://gitlab.xiph.org/xiph/opus.git opus
do_download https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/ libressl-4.0.0.tar.gz 4d841955f0acc3dfc71d0e3dd35f283af461222350e26843fea9731c0246a1e4 libressl
do_download https://ftp.openbsd.org/pub/OpenBSD/LibreSSL/ libressl-4.2.1.tar.gz 6d5c2f58583588ea791f4c8645004071d00dfa554a5bf788a006ca1eb5abd70b libressl
fi
if [ $BUILD -eq 0 ]; then
@@ -267,6 +267,7 @@ fi
do_cmake_build \
"$BUILD_BASE/freerdp" \
-S "$SCRIPT_PATH/.." \
-DWITHOUT_FREERDP_3x_DEPRECATED=ON \
-DWITH_SERVER=ON \
-DWITH_SHADOW=OFF \
-DWITH_PLATFORM_SERVER=OFF \

View File

@@ -33,3 +33,9 @@ set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "toolchain default")
set(CMAKE_SKIP_INSTALL_ALL_DEPENDENCY ON CACHE BOOL "toolchain default")
set(CMAKE_VERBOSE_MAKEFILE ON CACHE BOOL "toolchain default")
set(THREADS_PREFER_PTHREAD_FLAG ON CACHE BOOL "toolchain default")
# mingw does not support C11
#
# https://stackoverflow.com/questions/52239644/mingw-w64-c11-threads-h-not-found
add_compile_definitions(__STDC_NO_THREADS__)
add_compile_definitions(__STDC_NO_ATOMICS__)

View File

@@ -72,7 +72,7 @@ typedef HANDLE(WINAPI* fnWinStationVirtualOpenEx)(HANDLE hServer, DWORD SessionI
static fnWinStationVirtualOpen pfnWinStationVirtualOpen = NULL;
static fnWinStationVirtualOpenEx pfnWinStationVirtualOpenEx = NULL;
BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel);
static BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel);
/**
* NOTE !!
@@ -116,7 +116,7 @@ static void _wts_free(void* ptr)
#endif
}
BOOL Win32_WTSVirtualChannelReadAsync(WTSAPI_CHANNEL* pChannel)
static BOOL Win32_WTSVirtualChannelReadAsync(WTSAPI_CHANNEL* pChannel)
{
BOOL status = TRUE;
DWORD numBytes = 0;
@@ -170,8 +170,8 @@ BOOL Win32_WTSVirtualChannelReadAsync(WTSAPI_CHANNEL* pChannel)
return TRUE;
}
HANDLE WINAPI Win32_WTSVirtualChannelOpen_Internal(HANDLE hServer, DWORD SessionId,
LPSTR pVirtualName, DWORD flags)
static HANDLE WINAPI Win32_WTSVirtualChannelOpen_Internal(HANDLE hServer, DWORD SessionId,
LPSTR pVirtualName, DWORD flags)
{
HANDLE hFile;
HANDLE hChannel;
@@ -245,17 +245,18 @@ HANDLE WINAPI Win32_WTSVirtualChannelOpen_Internal(HANDLE hServer, DWORD Session
return hChannel;
}
HANDLE WINAPI Win32_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPSTR pVirtualName)
static HANDLE WINAPI Win32_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId,
LPSTR pVirtualName)
{
return Win32_WTSVirtualChannelOpen_Internal(hServer, SessionId, pVirtualName, 0);
}
HANDLE WINAPI Win32_WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags)
static HANDLE WINAPI Win32_WTSVirtualChannelOpenEx(DWORD SessionId, LPSTR pVirtualName, DWORD flags)
{
return Win32_WTSVirtualChannelOpen_Internal(0, SessionId, pVirtualName, flags);
}
BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel)
static BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel)
{
BOOL status = TRUE;
WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannel;
@@ -302,9 +303,10 @@ BOOL WINAPI Win32_WTSVirtualChannelClose(HANDLE hChannel)
return status;
}
BOOL WINAPI Win32_WTSVirtualChannelRead_Static(WTSAPI_CHANNEL* pChannel, DWORD dwMilliseconds,
LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesTransferred)
static BOOL WINAPI Win32_WTSVirtualChannelRead_Static(WTSAPI_CHANNEL* pChannel,
DWORD dwMilliseconds, LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesTransferred)
{
if (pChannel->readDone)
{
@@ -449,9 +451,10 @@ BOOL WINAPI Win32_WTSVirtualChannelRead_Static(WTSAPI_CHANNEL* pChannel, DWORD d
return FALSE;
}
BOOL WINAPI Win32_WTSVirtualChannelRead_Dynamic(WTSAPI_CHANNEL* pChannel, DWORD dwMilliseconds,
LPVOID lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesTransferred)
static BOOL WINAPI Win32_WTSVirtualChannelRead_Dynamic(WTSAPI_CHANNEL* pChannel,
DWORD dwMilliseconds, LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesTransferred)
{
if (pChannel->readSync)
{
@@ -567,9 +570,9 @@ BOOL WINAPI Win32_WTSVirtualChannelRead_Dynamic(WTSAPI_CHANNEL* pChannel, DWORD
return FALSE;
}
BOOL WINAPI Win32_WTSVirtualChannelRead(HANDLE hChannel, DWORD dwMilliseconds, LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesTransferred)
static BOOL WINAPI Win32_WTSVirtualChannelRead(HANDLE hChannel, DWORD dwMilliseconds,
PCHAR lpBuffer, DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesTransferred)
{
WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannel;
@@ -625,9 +628,9 @@ BOOL WINAPI Win32_WTSVirtualChannelRead(HANDLE hChannel, DWORD dwMilliseconds, L
return FALSE;
}
BOOL WINAPI Win32_WTSVirtualChannelWrite(HANDLE hChannel, LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesTransferred)
static BOOL WINAPI Win32_WTSVirtualChannelWrite(HANDLE hChannel, PCHAR lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesTransferred)
{
OVERLAPPED overlapped = { 0 };
WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannel;
@@ -652,7 +655,7 @@ BOOL WINAPI Win32_WTSVirtualChannelWrite(HANDLE hChannel, LPCVOID lpBuffer,
#define FILE_DEVICE_TERMSRV 0x00000038
#endif
BOOL Win32_WTSVirtualChannelPurge_Internal(HANDLE hChannelHandle, ULONG IoControlCode)
static BOOL Win32_WTSVirtualChannelPurge_Internal(HANDLE hChannelHandle, ULONG IoControlCode)
{
IO_STATUS_BLOCK ioStatusBlock = { 0 };
WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannelHandle;
@@ -698,20 +701,21 @@ BOOL Win32_WTSVirtualChannelPurge_Internal(HANDLE hChannelHandle, ULONG IoContro
return TRUE;
}
BOOL WINAPI Win32_WTSVirtualChannelPurgeInput(HANDLE hChannelHandle)
static BOOL WINAPI Win32_WTSVirtualChannelPurgeInput(HANDLE hChannelHandle)
{
return Win32_WTSVirtualChannelPurge_Internal(hChannelHandle,
(FILE_DEVICE_TERMSRV << 16) | 0x0107);
}
BOOL WINAPI Win32_WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle)
static BOOL WINAPI Win32_WTSVirtualChannelPurgeOutput(HANDLE hChannelHandle)
{
return Win32_WTSVirtualChannelPurge_Internal(hChannelHandle,
(FILE_DEVICE_TERMSRV << 16) | 0x010B);
}
BOOL WINAPI Win32_WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLASS WtsVirtualClass,
PVOID* ppBuffer, DWORD* pBytesReturned)
static BOOL WINAPI Win32_WTSVirtualChannelQuery(HANDLE hChannelHandle,
WTS_VIRTUAL_CLASS WtsVirtualClass, PVOID* ppBuffer,
DWORD* pBytesReturned)
{
WTSAPI_CHANNEL* pChannel = (WTSAPI_CHANNEL*)hChannelHandle;
@@ -764,19 +768,19 @@ BOOL WINAPI Win32_WTSVirtualChannelQuery(HANDLE hChannelHandle, WTS_VIRTUAL_CLAS
return TRUE;
}
VOID WINAPI Win32_WTSFreeMemory(PVOID pMemory)
static VOID WINAPI Win32_WTSFreeMemory(PVOID pMemory)
{
_wts_free(pMemory);
}
BOOL WINAPI Win32_WTSFreeMemoryExW(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory,
ULONG NumberOfEntries)
static BOOL WINAPI Win32_WTSFreeMemoryExW(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory,
ULONG NumberOfEntries)
{
return FALSE;
}
BOOL WINAPI Win32_WTSFreeMemoryExA(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory,
ULONG NumberOfEntries)
static BOOL WINAPI Win32_WTSFreeMemoryExA(WTS_TYPE_CLASS WTSTypeClass, PVOID pMemory,
ULONG NumberOfEntries)
{
return WTSFreeMemoryExW(WTSTypeClass, pMemory, NumberOfEntries);
}