mirror of
https://github.com/morgan9e/FreeRDP
synced 2026-04-15 00:44:19 +09:00
winpr: fix WinXP backwards compatibility
This commit is contained in:
@@ -300,14 +300,14 @@ if(WIN32)
|
||||
endif()
|
||||
|
||||
if(CMAKE_WINDOWS_VERSION STREQUAL "WINXP")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -DWIN32_WINNT=0x0501")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0501 -D_WIN32_WINNT=0x0501")
|
||||
elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN7")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -DWIN32_WINNT=0x0601")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0601 -D_WIN32_WINNT=0x0601")
|
||||
elseif(CMAKE_WINDOWS_VERSION STREQUAL "WIN8")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -DWIN32_WINNT=0x0602")
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DWINVER=0x0602 -D_WIN32_WINNT=0x0602")
|
||||
endif()
|
||||
|
||||
if (FREERDP_EXTERNAL_SSL_PATH)
|
||||
|
||||
@@ -276,28 +276,51 @@ WINPR_API BOOL DeleteTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE Com
|
||||
|
||||
#endif
|
||||
|
||||
#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
|
||||
#if (defined(_WIN32) && defined(_SYNCHAPI_H_) && (_WIN32_WINNT < 0x0600))
|
||||
#define WINPR_INITIALIZE_CRITICAL_SECTION_EX 1
|
||||
#elif (defined(_WIN32) && (_WIN32_WINNT < 0x0403))
|
||||
#define WINPR_INITIALIZE_CRITICAL_SECTION_EX 1
|
||||
#elif !defined(_WIN32)
|
||||
#define WINPR_INITIALIZE_CRITICAL_SECTION_EX 1
|
||||
#endif
|
||||
|
||||
#ifdef WINPR_INITIALIZE_CRITICAL_SECTION_EX
|
||||
|
||||
WINPR_API BOOL InitializeCriticalSectionEx(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags);
|
||||
|
||||
#endif
|
||||
|
||||
#ifndef _RTL_RUN_ONCE_DEF
|
||||
#define _RTL_RUN_ONCE_DEF
|
||||
|
||||
#define RTL_RUN_ONCE_INIT { 0 }
|
||||
|
||||
#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001
|
||||
#define RTL_RUN_ONCE_ASYNC 0x00000002
|
||||
#define RTL_RUN_ONCE_INIT_FAILED 0x00000004
|
||||
|
||||
#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
|
||||
|
||||
typedef struct _RTL_RUN_ONCE
|
||||
{
|
||||
PVOID Ptr;
|
||||
} RTL_RUN_ONCE, *PRTL_RUN_ONCE;
|
||||
|
||||
typedef ULONG CALLBACK RTL_RUN_ONCE_INIT_FN (PRTL_RUN_ONCE RunOnce, PVOID Parameter, PVOID* Context);
|
||||
typedef RTL_RUN_ONCE_INIT_FN *PRTL_RUN_ONCE_INIT_FN;
|
||||
|
||||
#endif
|
||||
|
||||
#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
|
||||
|
||||
/* One-Time Initialization */
|
||||
|
||||
typedef struct _RTL_RUN_ONCE
|
||||
{
|
||||
PVOID Ptr;
|
||||
} RTL_RUN_ONCE, *PRTL_RUN_ONCE;
|
||||
|
||||
#define RTL_RUN_ONCE_INIT { 0 }
|
||||
#define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT
|
||||
|
||||
typedef RTL_RUN_ONCE INIT_ONCE;
|
||||
typedef PRTL_RUN_ONCE PINIT_ONCE;
|
||||
typedef PRTL_RUN_ONCE LPINIT_ONCE;
|
||||
typedef BOOL CALLBACK (*PINIT_ONCE_FN) (PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context);
|
||||
typedef BOOL (CALLBACK * PINIT_ONCE_FN)(PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context);
|
||||
|
||||
WINPR_API BOOL InitOnceBeginInitialize(LPINIT_ONCE lpInitOnce, DWORD dwFlags, PBOOL fPending, LPVOID* lpContext);
|
||||
WINPR_API BOOL InitOnceComplete(LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext);
|
||||
|
||||
@@ -248,7 +248,7 @@ VOID DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection)
|
||||
|
||||
#endif
|
||||
|
||||
#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
|
||||
#ifdef WINPR_INITIALIZE_CRITICAL_SECTION_EX
|
||||
|
||||
typedef BOOL (WINAPI* PINITIALIZE_CRITICAL_SECTION_EX_FN)(LPCRITICAL_SECTION lpCriticalSection, DWORD dwSpinCount, DWORD Flags);
|
||||
|
||||
|
||||
@@ -187,6 +187,44 @@ fail:
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32) && (NTDDI_VERSION <= NTDDI_WINXP)
|
||||
|
||||
typedef USHORT (WINAPI * PRTL_CAPTURE_STACK_BACK_TRACE_FN)(ULONG FramesToSkip, ULONG FramesToCapture, PVOID* BackTrace, PULONG BackTraceHash);
|
||||
|
||||
static HMODULE g_NTDLL_Library = NULL;
|
||||
static BOOL g_RtlCaptureStackBackTrace_Detected = FALSE;
|
||||
static BOOL g_RtlCaptureStackBackTrace_Available = FALSE;
|
||||
static PRTL_CAPTURE_STACK_BACK_TRACE_FN g_pRtlCaptureStackBackTrace = NULL;
|
||||
|
||||
USHORT RtlCaptureStackBackTrace(ULONG FramesToSkip, ULONG FramesToCapture, PVOID* BackTrace, PULONG BackTraceHash)
|
||||
{
|
||||
if (!g_RtlCaptureStackBackTrace_Detected)
|
||||
{
|
||||
g_NTDLL_Library = LoadLibraryA("kernel32.dll");
|
||||
|
||||
if (g_NTDLL_Library)
|
||||
{
|
||||
g_pRtlCaptureStackBackTrace = (PRTL_CAPTURE_STACK_BACK_TRACE_FN) GetProcAddress(g_NTDLL_Library, "RtlCaptureStackBackTrace");
|
||||
g_RtlCaptureStackBackTrace_Available = (g_pRtlCaptureStackBackTrace) ? TRUE : FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
g_RtlCaptureStackBackTrace_Available = FALSE;
|
||||
}
|
||||
|
||||
g_RtlCaptureStackBackTrace_Detected = TRUE;
|
||||
}
|
||||
|
||||
if (g_RtlCaptureStackBackTrace_Available)
|
||||
{
|
||||
return (*g_pRtlCaptureStackBackTrace)(FramesToSkip, FramesToCapture, BackTrace, BackTraceHash);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
void winpr_backtrace_free(void* buffer)
|
||||
{
|
||||
if (!buffer)
|
||||
@@ -272,7 +310,7 @@ void* winpr_backtrace(DWORD size)
|
||||
}
|
||||
|
||||
SymInitialize(process, NULL, TRUE);
|
||||
data->used = CaptureStackBackTrace(2, size, data->stack, NULL);
|
||||
data->used = RtlCaptureStackBackTrace(2, size, data->stack, NULL);
|
||||
|
||||
return data;
|
||||
#else
|
||||
|
||||
Reference in New Issue
Block a user