29#include <winpr/platform.h>
30#include <winpr/winpr.h>
31#include <winpr/wtypes.h>
32#include <winpr/error.h>
33#include <winpr/handle.h>
45#define CREATE_MUTEX_INITIAL_OWNER 0x00000001
47 WINPR_ATTR_MALLOC(CloseHandle, 1)
48 WINPR_API HANDLE CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
51 WINPR_ATTR_MALLOC(CloseHandle, 1)
52 WINPR_API HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
55 WINPR_ATTR_MALLOC(CloseHandle, 1)
56 WINPR_API HANDLE CreateMutexExA(LPSECURITY_ATTRIBUTES lpMutexAttributes, LPCSTR lpName,
57 DWORD dwFlags, DWORD dwDesiredAccess);
59 WINPR_ATTR_MALLOC(CloseHandle, 1)
60 WINPR_API HANDLE CreateMutexExW(LPSECURITY_ATTRIBUTES lpMutexAttributes, LPCWSTR lpName,
61 DWORD dwFlags, DWORD dwDesiredAccess);
63 WINPR_ATTR_MALLOC(CloseHandle, 1)
64 WINPR_API HANDLE OpenMutexA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
66 WINPR_ATTR_MALLOC(CloseHandle, 1)
67 WINPR_API HANDLE OpenMutexW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
69 WINPR_API BOOL ReleaseMutex(HANDLE hMutex);
72#define CreateMutex CreateMutexW
73#define CreateMutexEx CreateMutexExW
74#define OpenMutex OpenMutexW
76#define CreateMutex CreateMutexA
77#define CreateMutexEx CreateMutexExA
78#define OpenMutex OpenMutexA
83 WINPR_ATTR_MALLOC(CloseHandle, 1)
84 WINPR_API HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
85 LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName);
87 WINPR_ATTR_MALLOC(CloseHandle, 1)
88 WINPR_API HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
89 LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName);
91 WINPR_ATTR_MALLOC(CloseHandle, 1)
92 WINPR_API HANDLE OpenSemaphoreA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
94 WINPR_ATTR_MALLOC(CloseHandle, 1)
95 WINPR_API HANDLE OpenSemaphoreW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
98#define CreateSemaphore CreateSemaphoreW
99#define OpenSemaphore OpenSemaphoreW
101#define CreateSemaphore CreateSemaphoreA
102#define OpenSemaphore OpenSemaphoreA
106 WINPR_API BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount);
109#define CREATE_EVENT_MANUAL_RESET 0x00000001
110#define CREATE_EVENT_INITIAL_SET 0x00000002
112 WINPR_ATTR_MALLOC(CloseHandle, 1)
113 WINPR_API HANDLE CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset,
114 BOOL bInitialState, LPCSTR lpName);
116 WINPR_ATTR_MALLOC(CloseHandle, 1)
117 WINPR_API HANDLE CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset,
118 BOOL bInitialState, LPCWSTR lpName);
120 WINPR_ATTR_MALLOC(CloseHandle, 1)
121 WINPR_API HANDLE CreateEventExA(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCSTR lpName,
122 DWORD dwFlags, DWORD dwDesiredAccess);
124 WINPR_ATTR_MALLOC(CloseHandle, 1)
125 WINPR_API HANDLE CreateEventExW(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName,
126 DWORD dwFlags, DWORD dwDesiredAccess);
128 WINPR_ATTR_MALLOC(CloseHandle, 1)
129 WINPR_API HANDLE OpenEventA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
131 WINPR_ATTR_MALLOC(CloseHandle, 1)
132 WINPR_API HANDLE OpenEventW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
134 WINPR_API BOOL SetEvent(HANDLE hEvent);
136 WINPR_API BOOL ResetEvent(HANDLE hEvent);
138#if defined(WITH_DEBUG_EVENTS)
139#define DumpEventHandles() DumpEventHandles_(__func__, __FILE__, __LINE__)
140 WINPR_API
void DumpEventHandles_(
const char* fkt,
const char* file,
size_t line);
143#define CreateEvent CreateEventW
144#define CreateEventEx CreateEventExW
145#define OpenEvent OpenEventW
147#define CreateEvent CreateEventA
148#define CreateEventEx CreateEventExA
149#define OpenEvent OpenEventA
154 typedef PVOID RTL_CONDITION_VARIABLE;
155 typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE, *PCONDITION_VARIABLE;
165 HANDLE LockSemaphore;
177 DWORD dwSpinCount, DWORD Flags);
180 WINPR_API BOOL InitializeCriticalSectionAndSpinCount(
LPCRITICAL_SECTION lpCriticalSection,
197 WINPR_API VOID Sleep(DWORD dwMilliseconds);
199 WINPR_API DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable);
203 WINPR_API VOID WakeByAddressAll(PVOID Address);
204 WINPR_API VOID WakeByAddressSingle(PVOID Address);
207 WINPR_API BOOL WaitOnAddress(VOID
volatile* Address, PVOID CompareAddress,
size_t AddressSize,
208 DWORD dwMilliseconds);
212#define INFINITE 0xFFFFFFFFUL
214#define WAIT_OBJECT_0 0x00000000UL
215#define WAIT_ABANDONED 0x00000080UL
216#define WAIT_IO_COMPLETION 0x000000C0UL
219#define WAIT_TIMEOUT 0x00000102UL
222#define WAIT_FAILED 0xFFFFFFFFUL
224#define MAXIMUM_WAIT_OBJECTS 64
226 WINPR_API DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
229 WINPR_API DWORD WaitForSingleObjectEx(HANDLE hHandle, DWORD dwMilliseconds, BOOL bAlertable);
232 WINPR_API DWORD WaitForMultipleObjects(DWORD nCount,
const HANDLE* lpHandles, BOOL bWaitAll,
233 DWORD dwMilliseconds);
236 WINPR_API DWORD WaitForMultipleObjectsEx(DWORD nCount,
const HANDLE* lpHandles, BOOL bWaitAll,
237 DWORD dwMilliseconds, BOOL bAlertable);
240 WINPR_API DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn,
241 DWORD dwMilliseconds, BOOL bAlertable);
245#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001
256 HMODULE LocalizedReasonModule;
257 ULONG LocalizedReasonId;
258 ULONG ReasonStringCount;
259 LPWSTR* ReasonStrings;
262 LPWSTR SimpleReasonString;
266 typedef VOID (*PTIMERAPCROUTINE)(LPVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue,
267 DWORD dwTimerHighValue);
269 WINPR_ATTR_MALLOC(CloseHandle, 1)
270 WINPR_API HANDLE CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes,
271 BOOL bManualReset, LPCSTR lpTimerName);
273 WINPR_ATTR_MALLOC(CloseHandle, 1)
274 WINPR_API HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,
275 BOOL bManualReset, LPCWSTR lpTimerName);
277 WINPR_ATTR_MALLOC(CloseHandle, 1)
278 WINPR_API HANDLE CreateWaitableTimerExA(LPSECURITY_ATTRIBUTES lpTimerAttributes,
279 LPCSTR lpTimerName, DWORD dwFlags,
280 DWORD dwDesiredAccess);
282 WINPR_ATTR_MALLOC(CloseHandle, 1)
283 WINPR_API HANDLE CreateWaitableTimerExW(LPSECURITY_ATTRIBUTES lpTimerAttributes,
284 LPCWSTR lpTimerName, DWORD dwFlags,
285 DWORD dwDesiredAccess);
288 WINPR_API BOOL SetWaitableTimer(HANDLE hTimer, const
LARGE_INTEGER* lpDueTime, LONG lPeriod,
289 PTIMERAPCROUTINE pfnCompletionRoutine,
290 LPVOID lpArgToCompletionRoutine, BOOL fResume);
293 WINPR_API BOOL SetWaitableTimerEx(HANDLE hTimer, const
LARGE_INTEGER* lpDueTime, LONG lPeriod,
294 PTIMERAPCROUTINE pfnCompletionRoutine,
296 ULONG TolerableDelay);
298 WINPR_ATTR_MALLOC(CloseHandle, 1)
299 WINPR_API HANDLE OpenWaitableTimerA(DWORD dwDesiredAccess, BOOL bInheritHandle,
302 WINPR_ATTR_MALLOC(CloseHandle, 1)
303 WINPR_API HANDLE OpenWaitableTimerW(DWORD dwDesiredAccess, BOOL bInheritHandle,
304 LPCWSTR lpTimerName);
307 WINPR_API BOOL CancelWaitableTimer(HANDLE hTimer);
310#define CreateWaitableTimer CreateWaitableTimerW
311#define CreateWaitableTimerEx CreateWaitableTimerExW
312#define OpenWaitableTimer OpenWaitableTimerW
314#define CreateWaitableTimer CreateWaitableTimerA
315#define CreateWaitableTimerEx CreateWaitableTimerExA
316#define OpenWaitableTimer OpenWaitableTimerA
320 WINPR_API
int GetTimerFileDescriptor(HANDLE hTimer);
326#define WT_EXECUTEDEFAULT 0x00000000
327#define WT_EXECUTEINIOTHREAD 0x00000001
328#define WT_EXECUTEINUITHREAD 0x00000002
329#define WT_EXECUTEINWAITTHREAD 0x00000004
330#define WT_EXECUTEONLYONCE 0x00000008
331#define WT_EXECUTELONGFUNCTION 0x00000010
332#define WT_EXECUTEINTIMERTHREAD 0x00000020
333#define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040
334#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080
335#define WT_TRANSFER_IMPERSONATION 0x00000100
337 typedef VOID (*WAITORTIMERCALLBACK)(PVOID lpParameter, BOOLEAN TimerOrWaitFired);
339 WINPR_ATTR_MALLOC(CloseHandle, 1)
340 WINPR_API HANDLE CreateTimerQueue(
void);
343 WINPR_API BOOL DeleteTimerQueue(HANDLE TimerQueue);
346 WINPR_API BOOL DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent);
349 WINPR_API BOOL CreateTimerQueueTimer(HANDLE* phNewTimer, HANDLE TimerQueue,
350 WAITORTIMERCALLBACK Callback,
void* Parameter,
351 DWORD DueTime, DWORD Period, ULONG Flags);
354 WINPR_API BOOL ChangeTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, ULONG DueTime,
358 WINPR_API BOOL DeleteTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent);
362#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
363#define InitializeCriticalSectionEx(lpCriticalSection, dwSpinCount, Flags) \
364 InitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount)
367 WINPR_PRAGMA_DIAG_PUSH
368 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
370#ifndef _RTL_RUN_ONCE_DEF
372#define _RTL_RUN_ONCE_DEF
374 WINPR_PRAGMA_DIAG_POP
376#define RTL_RUN_ONCE_INIT \
381#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001
382#define RTL_RUN_ONCE_ASYNC 0x00000002
383#define RTL_RUN_ONCE_INIT_FAILED 0x00000004
385#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
392 typedef ULONG CALLBACK RTL_RUN_ONCE_INIT_FN(
PRTL_RUN_ONCE RunOnce, PVOID Parameter,
394 typedef RTL_RUN_ONCE_INIT_FN* PRTL_RUN_ONCE_INIT_FN;
398#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
402#define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT
407 typedef BOOL(CALLBACK* PINIT_ONCE_FN)(
PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context);
410 WINPR_API BOOL winpr_InitOnceBeginInitialize(
LPINIT_ONCE lpInitOnce, DWORD dwFlags,
411 PBOOL fPending, LPVOID* lpContext);
414 WINPR_API BOOL winpr_InitOnceComplete(
LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext);
417 WINPR_API BOOL winpr_InitOnceExecuteOnce(
PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn,
418 PVOID Parameter, LPVOID* Context);
420 WINPR_API VOID winpr_InitOnceInitialize(
PINIT_ONCE InitOnce);
422#define InitOnceBeginInitialize winpr_InitOnceBeginInitialize
423#define InitOnceComplete winpr_InitOnceComplete
424#define InitOnceExecuteOnce winpr_InitOnceExecuteOnce
425#define InitOnceInitialize winpr_InitOnceInitialize
430#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0602) && !defined(_SYNCHAPI_H_))
431#define WINPR_SYNCHRONIZATION_BARRIER 1
434#ifdef WINPR_SYNCHRONIZATION_BARRIER
440 ULONG_PTR Reserved3[2];
449#define SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY 0x01
450#define SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY 0x02
451#define SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE 0x04
454 WINPR_API BOOL WINAPI winpr_InitializeSynchronizationBarrier(
464#define InitializeSynchronizationBarrier winpr_InitializeSynchronizationBarrier
465#define EnterSynchronizationBarrier winpr_EnterSynchronizationBarrier
466#define DeleteSynchronizationBarrier winpr_DeleteSynchronizationBarrier
472 WINPR_API VOID USleep(DWORD dwMicroseconds);
474 WINPR_ATTR_MALLOC(CloseHandle, 1)
475 WINPR_API HANDLE CreateFileDescriptorEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,
476 BOOL bManualReset, BOOL bInitialState,
477 int FileDescriptor, ULONG mode);
479 WINPR_ATTR_MALLOC(CloseHandle, 1)
480 WINPR_API HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,
481 BOOL bManualReset, BOOL bInitialState,
482 int FileDescriptor, ULONG mode);
484 WINPR_ATTR_MALLOC(CloseHandle, 1)
485 WINPR_API HANDLE CreateWaitObjectEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
486 BOOL bManualReset, BOOL bInitialState,
void* pObject);
489#define CreateFileDescriptorEvent CreateFileDescriptorEventW
491#define CreateFileDescriptorEvent CreateFileDescriptorEventA
495 WINPR_API
int GetEventFileDescriptor(HANDLE hEvent);
498 WINPR_API
int SetEventFileDescriptor(HANDLE hEvent,
int FileDescriptor, ULONG mode);
501 WINPR_API
void* GetEventWaitObject(HANDLE hEvent);