winpr: fix WinXP backwards compatibility
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Wed, 25 Nov 2015 18:46:10 +0000 (13:46 -0500)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Wed, 25 Nov 2015 18:46:10 +0000 (13:46 -0500)
CMakeLists.txt
winpr/include/winpr/synch.h
winpr/libwinpr/synch/critical.c
winpr/libwinpr/utils/debug.c

index 64cc207..85d3c46 100644 (file)
@@ -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)
index d5abb80..76ffd77 100644 (file)
@@ -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
 
-#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
+#ifndef _RTL_RUN_ONCE_DEF
+#define _RTL_RUN_ONCE_DEF
 
-/* One-Time Initialization */
+#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;
 
-#define RTL_RUN_ONCE_INIT      { 0 }
+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 */
+
 #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);
index 6499ea0..bc2f3de 100644 (file)
@@ -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);
 
index d90d1e0..c9dc73b 100644 (file)
@@ -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