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)
49 WINPR_API HANDLE CreateMutexA(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
52 WINPR_ATTR_MALLOC(CloseHandle, 1)
54 WINPR_API HANDLE CreateMutexW(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner,
57 WINPR_ATTR_MALLOC(CloseHandle, 1)
59 WINPR_API HANDLE CreateMutexExA(LPSECURITY_ATTRIBUTES lpMutexAttributes, LPCSTR lpName,
60 DWORD dwFlags, DWORD dwDesiredAccess);
62 WINPR_ATTR_MALLOC(CloseHandle, 1)
64 WINPR_API HANDLE CreateMutexExW(LPSECURITY_ATTRIBUTES lpMutexAttributes, LPCWSTR lpName,
65 DWORD dwFlags, DWORD dwDesiredAccess);
67 WINPR_ATTR_MALLOC(CloseHandle, 1)
69 WINPR_API HANDLE OpenMutexA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
71 WINPR_ATTR_MALLOC(CloseHandle, 1)
73 WINPR_API HANDLE OpenMutexW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
75 WINPR_API BOOL ReleaseMutex(HANDLE hMutex);
78#define CreateMutex CreateMutexW
79#define CreateMutexEx CreateMutexExW
80#define OpenMutex OpenMutexW
82#define CreateMutex CreateMutexA
83#define CreateMutexEx CreateMutexExA
84#define OpenMutex OpenMutexA
89 WINPR_ATTR_MALLOC(CloseHandle, 1)
91 WINPR_API HANDLE CreateSemaphoreA(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
92 LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName);
94 WINPR_ATTR_MALLOC(CloseHandle, 1)
96 WINPR_API HANDLE CreateSemaphoreW(LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
97 LONG lInitialCount, LONG lMaximumCount, LPCWSTR lpName);
99 WINPR_ATTR_MALLOC(CloseHandle, 1)
101 WINPR_API HANDLE OpenSemaphoreA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
103 WINPR_ATTR_MALLOC(CloseHandle, 1)
105 WINPR_API HANDLE OpenSemaphoreW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
108#define CreateSemaphore CreateSemaphoreW
109#define OpenSemaphore OpenSemaphoreW
111#define CreateSemaphore CreateSemaphoreA
112#define OpenSemaphore OpenSemaphoreA
115 WINPR_API BOOL ReleaseSemaphore(HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount);
118#define CREATE_EVENT_MANUAL_RESET 0x00000001
119#define CREATE_EVENT_INITIAL_SET 0x00000002
121 WINPR_ATTR_MALLOC(CloseHandle, 1)
123 WINPR_API HANDLE CreateEventA(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset,
124 BOOL bInitialState, LPCSTR lpName);
126 WINPR_ATTR_MALLOC(CloseHandle, 1)
128 WINPR_API HANDLE CreateEventW(LPSECURITY_ATTRIBUTES lpEventAttributes, BOOL bManualReset,
129 BOOL bInitialState, LPCWSTR lpName);
131 WINPR_ATTR_MALLOC(CloseHandle, 1)
133 WINPR_API HANDLE CreateEventExA(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCSTR lpName,
134 DWORD dwFlags, DWORD dwDesiredAccess);
136 WINPR_ATTR_MALLOC(CloseHandle, 1)
138 WINPR_API HANDLE CreateEventExW(LPSECURITY_ATTRIBUTES lpEventAttributes, LPCWSTR lpName,
139 DWORD dwFlags, DWORD dwDesiredAccess);
141 WINPR_ATTR_MALLOC(CloseHandle, 1)
143 WINPR_API HANDLE OpenEventA(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCSTR lpName);
145 WINPR_ATTR_MALLOC(CloseHandle, 1)
147 WINPR_API HANDLE OpenEventW(DWORD dwDesiredAccess, BOOL bInheritHandle, LPCWSTR lpName);
149 WINPR_API BOOL SetEvent(HANDLE hEvent);
150 WINPR_API BOOL ResetEvent(HANDLE hEvent);
152#if defined(WITH_DEBUG_EVENTS)
153#define DumpEventHandles() DumpEventHandles_(__func__, __FILE__, __LINE__)
154 WINPR_API
void DumpEventHandles_(
const char* fkt,
const char* file,
size_t line);
157#define CreateEvent CreateEventW
158#define CreateEventEx CreateEventExW
159#define OpenEvent OpenEventW
161#define CreateEvent CreateEventA
162#define CreateEventEx CreateEventExA
163#define OpenEvent OpenEventA
168 typedef PVOID RTL_CONDITION_VARIABLE;
169 typedef RTL_CONDITION_VARIABLE CONDITION_VARIABLE, *PCONDITION_VARIABLE;
179 HANDLE LockSemaphore;
189 DWORD dwSpinCount, DWORD Flags);
190 WINPR_API BOOL InitializeCriticalSectionAndSpinCount(
LPCRITICAL_SECTION lpCriticalSection,
205 WINPR_API VOID Sleep(DWORD dwMilliseconds);
206 WINPR_API DWORD SleepEx(DWORD dwMilliseconds, BOOL bAlertable);
210 WINPR_API VOID WakeByAddressAll(PVOID Address);
211 WINPR_API VOID WakeByAddressSingle(PVOID Address);
213 WINPR_API BOOL WaitOnAddress(VOID
volatile* Address, PVOID CompareAddress,
size_t AddressSize,
214 DWORD dwMilliseconds);
218#define INFINITE 0xFFFFFFFFUL
220#define WAIT_OBJECT_0 0x00000000UL
221#define WAIT_ABANDONED 0x00000080UL
222#define WAIT_IO_COMPLETION 0x000000C0UL
225#define WAIT_TIMEOUT 0x00000102UL
228#define WAIT_FAILED 0xFFFFFFFFUL
230#define MAXIMUM_WAIT_OBJECTS 64
232 WINPR_API DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);
233 WINPR_API DWORD WaitForSingleObjectEx(HANDLE hHandle, DWORD dwMilliseconds, BOOL bAlertable);
234 WINPR_API DWORD WaitForMultipleObjects(DWORD nCount,
const HANDLE* lpHandles, BOOL bWaitAll,
235 DWORD dwMilliseconds);
236 WINPR_API DWORD WaitForMultipleObjectsEx(DWORD nCount,
const HANDLE* lpHandles, BOOL bWaitAll,
237 DWORD dwMilliseconds, BOOL bAlertable);
239 WINPR_API DWORD SignalObjectAndWait(HANDLE hObjectToSignal, HANDLE hObjectToWaitOn,
240 DWORD dwMilliseconds, BOOL bAlertable);
244#define CREATE_WAITABLE_TIMER_MANUAL_RESET 0x00000001
255 HMODULE LocalizedReasonModule;
256 ULONG LocalizedReasonId;
257 ULONG ReasonStringCount;
258 LPWSTR* ReasonStrings;
261 LPWSTR SimpleReasonString;
265 typedef VOID (*PTIMERAPCROUTINE)(LPVOID lpArgToCompletionRoutine, DWORD dwTimerLowValue,
266 DWORD dwTimerHighValue);
268 WINPR_ATTR_MALLOC(CloseHandle, 1)
270 WINPR_API HANDLE CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes,
271 BOOL bManualReset, LPCSTR lpTimerName);
273 WINPR_ATTR_MALLOC(CloseHandle, 1)
275 WINPR_API HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,
276 BOOL bManualReset, LPCWSTR lpTimerName);
278 WINPR_ATTR_MALLOC(CloseHandle, 1)
280 WINPR_API HANDLE CreateWaitableTimerExA(LPSECURITY_ATTRIBUTES lpTimerAttributes,
281 LPCSTR lpTimerName, DWORD dwFlags,
282 DWORD dwDesiredAccess);
284 WINPR_ATTR_MALLOC(CloseHandle, 1)
286 WINPR_API HANDLE CreateWaitableTimerExW(LPSECURITY_ATTRIBUTES lpTimerAttributes,
287 LPCWSTR lpTimerName, DWORD dwFlags,
288 DWORD dwDesiredAccess);
290 WINPR_API BOOL SetWaitableTimer(HANDLE hTimer, const
LARGE_INTEGER* lpDueTime, LONG lPeriod,
291 PTIMERAPCROUTINE pfnCompletionRoutine,
292 LPVOID lpArgToCompletionRoutine, BOOL fResume);
294 WINPR_API BOOL SetWaitableTimerEx(HANDLE hTimer, const
LARGE_INTEGER* lpDueTime, LONG lPeriod,
295 PTIMERAPCROUTINE pfnCompletionRoutine,
297 ULONG TolerableDelay);
299 WINPR_ATTR_MALLOC(CloseHandle, 1)
301 WINPR_API HANDLE OpenWaitableTimerA(DWORD dwDesiredAccess, BOOL bInheritHandle,
304 WINPR_ATTR_MALLOC(CloseHandle, 1)
306 WINPR_API HANDLE OpenWaitableTimerW(DWORD dwDesiredAccess, BOOL bInheritHandle,
307 LPCWSTR lpTimerName);
309 WINPR_API BOOL CancelWaitableTimer(HANDLE hTimer);
312#define CreateWaitableTimer CreateWaitableTimerW
313#define CreateWaitableTimerEx CreateWaitableTimerExW
314#define OpenWaitableTimer OpenWaitableTimerW
316#define CreateWaitableTimer CreateWaitableTimerA
317#define CreateWaitableTimerEx CreateWaitableTimerExA
318#define OpenWaitableTimer OpenWaitableTimerA
321 WINPR_API
int GetTimerFileDescriptor(HANDLE hTimer);
327#define WT_EXECUTEDEFAULT 0x00000000
328#define WT_EXECUTEINIOTHREAD 0x00000001
329#define WT_EXECUTEINUITHREAD 0x00000002
330#define WT_EXECUTEINWAITTHREAD 0x00000004
331#define WT_EXECUTEONLYONCE 0x00000008
332#define WT_EXECUTELONGFUNCTION 0x00000010
333#define WT_EXECUTEINTIMERTHREAD 0x00000020
334#define WT_EXECUTEINPERSISTENTIOTHREAD 0x00000040
335#define WT_EXECUTEINPERSISTENTTHREAD 0x00000080
336#define WT_TRANSFER_IMPERSONATION 0x00000100
338 typedef VOID (*WAITORTIMERCALLBACK)(PVOID lpParameter, BOOLEAN TimerOrWaitFired);
340 WINPR_ATTR_MALLOC(CloseHandle, 1)
342 WINPR_API HANDLE CreateTimerQueue(
void);
344 WINPR_API BOOL DeleteTimerQueue(HANDLE TimerQueue);
345 WINPR_API BOOL DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent);
347 WINPR_API BOOL CreateTimerQueueTimer(HANDLE* phNewTimer, HANDLE TimerQueue,
348 WAITORTIMERCALLBACK Callback,
void* Parameter,
349 DWORD DueTime, DWORD Period, ULONG Flags);
350 WINPR_API BOOL ChangeTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, ULONG DueTime,
352 WINPR_API BOOL DeleteTimerQueueTimer(HANDLE TimerQueue, HANDLE Timer, HANDLE CompletionEvent);
356#if (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
357#define InitializeCriticalSectionEx(lpCriticalSection, dwSpinCount, Flags) \
358 InitializeCriticalSectionAndSpinCount(lpCriticalSection, dwSpinCount)
361 WINPR_PRAGMA_DIAG_PUSH
362 WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
364#ifndef _RTL_RUN_ONCE_DEF
366#define _RTL_RUN_ONCE_DEF
368 WINPR_PRAGMA_DIAG_POP
370#define RTL_RUN_ONCE_INIT \
375#define RTL_RUN_ONCE_CHECK_ONLY 0x00000001
376#define RTL_RUN_ONCE_ASYNC 0x00000002
377#define RTL_RUN_ONCE_INIT_FAILED 0x00000004
379#define RTL_RUN_ONCE_CTX_RESERVED_BITS 2
386 typedef ULONG CALLBACK RTL_RUN_ONCE_INIT_FN(
PRTL_RUN_ONCE RunOnce, PVOID Parameter,
388 typedef RTL_RUN_ONCE_INIT_FN* PRTL_RUN_ONCE_INIT_FN;
392#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0600))
396#define INIT_ONCE_STATIC_INIT RTL_RUN_ONCE_INIT
401 typedef BOOL(CALLBACK* PINIT_ONCE_FN)(
PINIT_ONCE InitOnce, PVOID Parameter, PVOID* Context);
403 WINPR_API BOOL winpr_InitOnceBeginInitialize(
LPINIT_ONCE lpInitOnce, DWORD dwFlags,
404 PBOOL fPending, LPVOID* lpContext);
405 WINPR_API BOOL winpr_InitOnceComplete(
LPINIT_ONCE lpInitOnce, DWORD dwFlags, LPVOID lpContext);
406 WINPR_API BOOL winpr_InitOnceExecuteOnce(
PINIT_ONCE InitOnce, PINIT_ONCE_FN InitFn,
407 PVOID Parameter, LPVOID* Context);
408 WINPR_API VOID winpr_InitOnceInitialize(
PINIT_ONCE InitOnce);
410#define InitOnceBeginInitialize winpr_InitOnceBeginInitialize
411#define InitOnceComplete winpr_InitOnceComplete
412#define InitOnceExecuteOnce winpr_InitOnceExecuteOnce
413#define InitOnceInitialize winpr_InitOnceInitialize
418#if (!defined(_WIN32)) || (defined(_WIN32) && (_WIN32_WINNT < 0x0602) && !defined(_SYNCHAPI_H_))
419#define WINPR_SYNCHRONIZATION_BARRIER 1
422#ifdef WINPR_SYNCHRONIZATION_BARRIER
428 ULONG_PTR Reserved3[2];
437#define SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY 0x01
438#define SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY 0x02
439#define SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE 0x04
441 WINPR_API BOOL WINAPI winpr_InitializeSynchronizationBarrier(
447#define InitializeSynchronizationBarrier winpr_InitializeSynchronizationBarrier
448#define EnterSynchronizationBarrier winpr_EnterSynchronizationBarrier
449#define DeleteSynchronizationBarrier winpr_DeleteSynchronizationBarrier
455 WINPR_API VOID USleep(DWORD dwMicroseconds);
457 WINPR_ATTR_MALLOC(CloseHandle, 1)
459 WINPR_API HANDLE CreateFileDescriptorEventW(LPSECURITY_ATTRIBUTES lpEventAttributes,
460 BOOL bManualReset, BOOL bInitialState,
461 int FileDescriptor, ULONG mode);
463 WINPR_ATTR_MALLOC(CloseHandle, 1)
465 WINPR_API HANDLE CreateFileDescriptorEventA(LPSECURITY_ATTRIBUTES lpEventAttributes,
466 BOOL bManualReset, BOOL bInitialState,
467 int FileDescriptor, ULONG mode);
469 WINPR_ATTR_MALLOC(CloseHandle, 1)
471 WINPR_API HANDLE CreateWaitObjectEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
472 BOOL bManualReset, BOOL bInitialState,
void* pObject);
475#define CreateFileDescriptorEvent CreateFileDescriptorEventW
477#define CreateFileDescriptorEvent CreateFileDescriptorEventA
480 WINPR_API
int GetEventFileDescriptor(HANDLE hEvent);
481 WINPR_API
int SetEventFileDescriptor(HANDLE hEvent,
int FileDescriptor, ULONG mode);
483 WINPR_API
void* GetEventWaitObject(HANDLE hEvent);