diff --git a/CMakeLists.txt b/CMakeLists.txt index 64cc2075c..85d3c4687 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -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) diff --git a/winpr/include/winpr/synch.h b/winpr/include/winpr/synch.h index d5abb80dd..76ffd777f 100644 --- a/winpr/include/winpr/synch.h +++ b/winpr/include/winpr/synch.h @@ -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); diff --git a/winpr/libwinpr/synch/critical.c b/winpr/libwinpr/synch/critical.c index 6499ea00e..bc2f3de0a 100644 --- a/winpr/libwinpr/synch/critical.c +++ b/winpr/libwinpr/synch/critical.c @@ -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); diff --git a/winpr/libwinpr/utils/debug.c b/winpr/libwinpr/utils/debug.c index d90d1e021..c9dc73bcf 100644 --- a/winpr/libwinpr/utils/debug.c +++ b/winpr/libwinpr/utils/debug.c @@ -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