ReactOS 0.4.16-dev-2274-gc61d98f
synch.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS Win32 Base API
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: dll/win32/kernel32/client/synch.c
5 * PURPOSE: Wrappers for the NT Wait Implementation
6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org)
7 */
8
9/* INCLUDES *****************************************************************/
10#include <k32.h>
11
12#define NDEBUG
13#include <debug.h>
14
15#undef InterlockedIncrement
16#undef InterlockedDecrement
17#undef InterlockedExchange
18#undef InterlockedExchangeAdd
19#undef InterlockedCompareExchange
20
21/* FUNCTIONS *****************************************************************/
22
23/*
24 * @implemented
25 */
26LONG
28InterlockedIncrement(IN OUT LONG volatile *lpAddend)
29{
30 return _InterlockedIncrement(lpAddend);
31}
32
33/*
34 * @implemented
35 */
36LONG
38InterlockedDecrement(IN OUT LONG volatile *lpAddend)
39{
40 return _InterlockedDecrement(lpAddend);
41}
42
43/*
44 * @implemented
45 */
46LONG
50{
52}
53
54/*
55 * @implemented
56 */
57LONG
61{
63}
64
65/*
66 * @implemented
67 */
68LONG
71 IN LONG Exchange,
72 IN LONG Comperand)
73{
74 return _InterlockedCompareExchange(Destination, Exchange, Comperand);
75}
76
77/*
78 * @implemented
79 */
83 IN DWORD dwMilliseconds)
84{
85 /* Call the extended API */
86 return WaitForSingleObjectEx(hHandle, dwMilliseconds, FALSE);
87}
88
89/*
90 * @implemented
91 */
95 IN DWORD dwMilliseconds,
96 IN BOOL bAlertable)
97{
98 PLARGE_INTEGER TimePtr;
101 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME ActCtx;
102
103 /* APCs must execute with the default activation context */
104 if (bAlertable)
105 {
106 /* Setup the frame */
107 RtlZeroMemory(&ActCtx, sizeof(ActCtx));
108 ActCtx.Size = sizeof(ActCtx);
110 RtlActivateActivationContextUnsafeFast(&ActCtx, NULL);
111 }
112
113 /* Get real handle */
114 hHandle = TranslateStdHandle(hHandle);
115
116 /* Check for console handle */
117 if ((IsConsoleHandle(hHandle)) && (VerifyConsoleIoHandle(hHandle)))
118 {
119 /* Get the real wait handle */
120 hHandle = GetConsoleInputWaitHandle();
121 }
122
123 /* Convert the timeout */
124 TimePtr = BaseFormatTimeOut(&Time, dwMilliseconds);
125
126 /* Start wait loop */
127 do
128 {
129 /* Do the wait */
130 Status = NtWaitForSingleObject(hHandle, (BOOLEAN)bAlertable, TimePtr);
131 if (!NT_SUCCESS(Status))
132 {
133 /* The wait failed */
136 }
137 } while ((Status == STATUS_ALERTED) && (bAlertable));
138
139 /* Cleanup the activation context */
140 if (bAlertable) RtlDeactivateActivationContextUnsafeFast(&ActCtx);
141
142 /* Return wait status */
143 return Status;
144}
145
146/*
147 * @implemented
148 */
149DWORD
150WINAPI
152 IN CONST HANDLE *lpHandles,
153 IN BOOL bWaitAll,
154 IN DWORD dwMilliseconds)
155{
156 /* Call the extended API */
157 return WaitForMultipleObjectsEx(nCount,
158 lpHandles,
159 bWaitAll,
160 dwMilliseconds,
161 FALSE);
162}
163
164/*
165 * @implemented
166 */
167DWORD
168WINAPI
170 IN CONST HANDLE *lpHandles,
171 IN BOOL bWaitAll,
172 IN DWORD dwMilliseconds,
173 IN BOOL bAlertable)
174{
175 PLARGE_INTEGER TimePtr;
177 PHANDLE HandleBuffer;
178 HANDLE Handle[8];
179 DWORD i;
181 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME ActCtx;
182
183 /* APCs must execute with the default activation context */
184 if (bAlertable)
185 {
186 /* Setup the frame */
187 RtlZeroMemory(&ActCtx, sizeof(ActCtx));
188 ActCtx.Size = sizeof(ActCtx);
190 RtlActivateActivationContextUnsafeFast(&ActCtx, NULL);
191 }
192
193 /* Check if we have more handles then we locally optimize */
194 if (nCount > 8)
195 {
196 /* Allocate a buffer for them */
197 HandleBuffer = RtlAllocateHeap(RtlGetProcessHeap(),
198 0,
199 nCount * sizeof(HANDLE));
200 if (!HandleBuffer)
201 {
202 /* No buffer, fail the wait */
204 if (bAlertable) RtlDeactivateActivationContextUnsafeFast(&ActCtx);
205 return WAIT_FAILED;
206 }
207 }
208 else
209 {
210 /* Otherwise, use our local buffer */
211 HandleBuffer = Handle;
212 }
213
214 /* Copy the handles into our buffer and loop them all */
215 RtlCopyMemory(HandleBuffer, (LPVOID)lpHandles, nCount * sizeof(HANDLE));
216 for (i = 0; i < nCount; i++)
217 {
218 /* Check what kind of handle this is */
219 HandleBuffer[i] = TranslateStdHandle(HandleBuffer[i]);
220
221 /* Check for console handle */
222 if ((IsConsoleHandle(HandleBuffer[i])) &&
223 (VerifyConsoleIoHandle(HandleBuffer[i])))
224 {
225 /* Get the real wait handle */
226 HandleBuffer[i] = GetConsoleInputWaitHandle();
227 }
228 }
229
230 /* Convert the timeout */
231 TimePtr = BaseFormatTimeOut(&Time, dwMilliseconds);
232
233 /* Start wait loop */
234 do
235 {
236 /* Do the wait */
238 HandleBuffer,
239 bWaitAll ? WaitAll : WaitAny,
240 (BOOLEAN)bAlertable,
241 TimePtr);
242 if (!NT_SUCCESS(Status))
243 {
244 /* Wait failed */
247 }
248 } while ((Status == STATUS_ALERTED) && (bAlertable));
249
250 /* Check if we didn't use our local buffer */
251 if (HandleBuffer != Handle)
252 {
253 /* Free the allocated one */
254 RtlFreeHeap(RtlGetProcessHeap(), 0, HandleBuffer);
255 }
256
257 /* Cleanup the activation context */
258 if (bAlertable) RtlDeactivateActivationContextUnsafeFast(&ActCtx);
259
260 /* Return wait status */
261 return Status;
262}
263
264/*
265 * @implemented
266 */
267DWORD
268WINAPI
270 IN HANDLE hObjectToWaitOn,
271 IN DWORD dwMilliseconds,
272 IN BOOL bAlertable)
273{
274 PLARGE_INTEGER TimePtr;
277 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME ActCtx;
278
279 /* APCs must execute with the default activation context */
280 if (bAlertable)
281 {
282 /* Setup the frame */
283 RtlZeroMemory(&ActCtx, sizeof(ActCtx));
284 ActCtx.Size = sizeof(ActCtx);
286 RtlActivateActivationContextUnsafeFast(&ActCtx, NULL);
287 }
288
289 /* Get real handle */
290 hObjectToWaitOn = TranslateStdHandle(hObjectToWaitOn);
291
292 /* Check for console handle */
293 if ((IsConsoleHandle(hObjectToWaitOn)) &&
294 (VerifyConsoleIoHandle(hObjectToWaitOn)))
295 {
296 /* Get the real wait handle */
297 hObjectToWaitOn = GetConsoleInputWaitHandle();
298 }
299
300 /* Convert the timeout */
301 TimePtr = BaseFormatTimeOut(&Time, dwMilliseconds);
302
303 /* Start wait loop */
304 do
305 {
306 /* Do the wait */
307 Status = NtSignalAndWaitForSingleObject(hObjectToSignal,
308 hObjectToWaitOn,
309 (BOOLEAN)bAlertable,
310 TimePtr);
311 if (!NT_SUCCESS(Status))
312 {
313 /* The wait failed */
316 }
317 } while ((Status == STATUS_ALERTED) && (bAlertable));
318
319 /* Cleanup the activation context */
320 if (bAlertable) RtlDeactivateActivationContextUnsafeFast(&ActCtx);
321
322 /* Return wait status */
323 return Status;
324}
325
326/*
327 * @implemented
328 */
329HANDLE
330WINAPI
332 IN BOOL bManualReset,
333 IN LPCWSTR lpTimerName OPTIONAL)
334{
336 lpTimerAttributes,
337 lpTimerName,
338 bManualReset ? NotificationTimer : SynchronizationTimer);
339}
340
341/*
342 * @implemented
343 */
344HANDLE
345WINAPI
348 IN LPCWSTR lpTimerName)
349{
350 OpenNtObjectFromWin32Api(Timer, dwDesiredAccess, bInheritHandle, lpTimerName);
351}
352
353/*
354 * @implemented
355 */
356BOOL
357WINAPI
359 IN const LARGE_INTEGER *pDueTime,
360 IN LONG lPeriod,
361 IN PTIMERAPCROUTINE pfnCompletionRoutine OPTIONAL,
362 IN OPTIONAL LPVOID lpArgToCompletionRoutine,
363 IN BOOL fResume)
364{
366
367 /* Set the timer */
368 Status = NtSetTimer(hTimer,
369 (PLARGE_INTEGER)pDueTime,
370 (PTIMER_APC_ROUTINE)pfnCompletionRoutine,
371 lpArgToCompletionRoutine,
372 (BOOLEAN)fResume,
373 lPeriod,
374 NULL);
375 if (NT_SUCCESS(Status)) return TRUE;
376
377 /* If we got here, then we failed */
379 return FALSE;
380}
381
382/*
383 * @implemented
384 */
385BOOL
386WINAPI
388{
390
391 /* Cancel the timer */
392 Status = NtCancelTimer(hTimer, NULL);
393 if (NT_SUCCESS(Status)) return TRUE;
394
395 /* If we got here, then we failed */
397 return FALSE;
398}
399
400/*
401 * @implemented
402 */
403HANDLE
404WINAPI
407 IN LONG lInitialCount,
408 IN LONG lMaximumCount,
410{
412 lpSemaphoreAttributes,
413 lpName,
414 lInitialCount,
415 lMaximumCount);
416}
417
418HANDLE
419WINAPI
422 IN LONG lInitialCount,
423 IN LONG lMaximumCount,
426 IN DWORD dwDesiredAccess OPTIONAL)
427{
428 CreateNtObjectFromWin32Api(Semaphore, Semaphore, dwDesiredAccess,
429 lpSemaphoreAttributes,
430 lpName,
431 lInitialCount,
432 lMaximumCount);
433}
434
435HANDLE
436WINAPI
439 IN LONG lInitialCount,
440 IN LONG lMaximumCount,
443 IN DWORD dwDesiredAccess OPTIONAL)
444{
446
447 if (!lpName)
448 {
449 return CreateSemaphoreExW(lpSemaphoreAttributes,
450 lInitialCount,
451 lMaximumCount,
452 NULL,
453 dwFlags,
454 dwDesiredAccess);
455 }
456
458
459 if (NT_SUCCESS(Status))
460 {
461 return CreateSemaphoreExW(lpSemaphoreAttributes,
462 lInitialCount,
463 lMaximumCount,
464 UnicodeCache->Buffer,
465 dwFlags,
466 dwDesiredAccess);
467 }
468
470}
471
472/*
473 * @implemented
474 */
475HANDLE
476WINAPI
478OpenSemaphoreW(IN DWORD dwDesiredAccess,
481{
482 OpenNtObjectFromWin32Api(Semaphore, dwDesiredAccess, bInheritHandle, lpName);
483}
484
485/*
486 * @implemented
487 */
488BOOL
489WINAPI
492 IN LONG lReleaseCount,
493 IN LPLONG lpPreviousCount)
494{
496
497 /* Release the semaphore */
498 Status = NtReleaseSemaphore(hSemaphore, lReleaseCount, lpPreviousCount);
499 if (NT_SUCCESS(Status)) return TRUE;
500
501 /* If we got here, then we failed */
503 return FALSE;
504}
505
506/*
507 * @implemented
508 */
509HANDLE
510WINAPI
513 IN BOOL bInitialOwner,
515{
516 ConvertWin32AnsiObjectApiToUnicodeApi(Mutex, lpName, lpMutexAttributes, bInitialOwner);
517}
518
519/*
520 * @implemented
521 */
522HANDLE
523WINAPI
526 IN BOOL bInitialOwner,
528{
530 lpMutexAttributes,
531 lpName,
532 bInitialOwner);
533}
534
535/*
536 * @implemented
537 */
538HANDLE
539WINAPI
541OpenMutexW(IN DWORD dwDesiredAccess,
544{
545 OpenNtObjectFromWin32Api(Mutant, dwDesiredAccess, bInheritHandle, lpName);
546}
547
548/*
549 * @implemented
550 */
551BOOL
552WINAPI
555{
557
558 /* Release the mutant */
560 if (NT_SUCCESS(Status)) return TRUE;
561
562 /* If we got here, then we failed */
564 return FALSE;
565}
566
567/*
568 * @implemented
569 */
570HANDLE
571WINAPI
574 IN BOOL bManualReset,
575 IN BOOL bInitialState,
577{
578 ConvertWin32AnsiObjectApiToUnicodeApi(Event, lpName, lpEventAttributes, bManualReset, bInitialState);
579}
580
581/*
582 * @implemented
583 */
584HANDLE
585WINAPI
588 IN BOOL bManualReset,
589 IN BOOL bInitialState,
591{
593 lpEventAttributes,
594 lpName,
596 bInitialState);
597}
598
599/*
600 * @implemented
601 */
602HANDLE
603WINAPI
605OpenEventA(IN DWORD dwDesiredAccess,
608{
610}
611
612/*
613 * @implemented
614 */
615HANDLE
616WINAPI
618OpenEventW(IN DWORD dwDesiredAccess,
621{
623}
624
625/*
626 * @implemented
627 */
628BOOL
629WINAPI
632{
634
635 /* Pulse the event */
637 if (NT_SUCCESS(Status)) return TRUE;
638
639 /* If we got here, then we failed */
641 return FALSE;
642}
643
644/*
645 * @implemented
646 */
647BOOL
648WINAPI
651{
653
654 /* Clear the event */
656 if (NT_SUCCESS(Status)) return TRUE;
657
658 /* If we got here, then we failed */
660 return FALSE;
661}
662
663/*
664 * @implemented
665 */
666BOOL
667WINAPI
670{
672
673 /* Set the event */
675 if (NT_SUCCESS(Status)) return TRUE;
676
677 /* If we got here, then we failed */
679 return FALSE;
680}
681
682/*
683 * @implemented
684 */
685VOID
686WINAPI
688{
690
691 /* Initialize the critical section and raise an exception if we failed */
692 Status = RtlInitializeCriticalSection((PVOID)lpCriticalSection);
694}
695
696/*
697 * @implemented
698 */
699BOOL
700WINAPI
702 IN DWORD dwSpinCount)
703{
705
706 /* Initialize the critical section */
708 dwSpinCount);
709 if (!NT_SUCCESS(Status))
710 {
711 /* Set failure code */
713 return FALSE;
714 }
715
716 /* Success */
717 return TRUE;
718}
719
720/*
721 * @implemented
722 */
723VOID
724WINAPI
726Sleep(IN DWORD dwMilliseconds)
727{
728 /* Call the new API */
729 SleepEx(dwMilliseconds, FALSE);
730}
731
732
733/*
734 * @implemented
735 */
736DWORD
737WINAPI
738SleepEx(IN DWORD dwMilliseconds,
739 IN BOOL bAlertable)
740{
742 PLARGE_INTEGER TimePtr;
743 NTSTATUS errCode;
744 RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME ActCtx;
745
746 /* APCs must execute with the default activation context */
747 if (bAlertable)
748 {
749 /* Setup the frame */
750 RtlZeroMemory(&ActCtx, sizeof(ActCtx));
751 ActCtx.Size = sizeof(ActCtx);
753 RtlActivateActivationContextUnsafeFast(&ActCtx, NULL);
754 }
755
756 /* Convert the timeout */
757 TimePtr = BaseFormatTimeOut(&Time, dwMilliseconds);
758 if (!TimePtr)
759 {
760 /* Turn an infinite wait into a really long wait */
761 Time.LowPart = 0;
762 Time.HighPart = 0x80000000;
763 TimePtr = &Time;
764 }
765
766 /* Loop the delay while APCs are alerting us */
767 do
768 {
769 /* Do the delay */
770 errCode = NtDelayExecution((BOOLEAN)bAlertable, TimePtr);
771 }
772 while ((bAlertable) && (errCode == STATUS_ALERTED));
773
774 /* Cleanup the activation context */
775 if (bAlertable) RtlDeactivateActivationContextUnsafeFast(&ActCtx);
776
777 /* Return the correct code */
778 return (errCode == STATUS_USER_APC) ? WAIT_IO_COMPLETION : 0;
779}
780
781/*
782 * @implemented
783 */
784BOOL
785WINAPI
787 IN HANDLE hObject,
790 IN ULONG dwMilliseconds,
792{
794
795 /* Get real handle */
796 hObject = TranslateStdHandle(hObject);
797
798 /* Check for console handle */
799 if ((IsConsoleHandle(hObject)) && (VerifyConsoleIoHandle(hObject)))
800 {
801 /* Get the real wait handle */
802 hObject = GetConsoleInputWaitHandle();
803 }
804
805 /* Register the wait now */
806 Status = RtlRegisterWait(phNewWaitObject,
807 hObject,
808 Callback,
809 Context,
810 dwMilliseconds,
811 dwFlags);
812 if (!NT_SUCCESS(Status))
813 {
814 /* Return failure */
816 return FALSE;
817 }
818
819 /* All good */
820 return TRUE;
821}
822
823/*
824 * @implemented
825 */
826HANDLE
827WINAPI
831 IN ULONG dwMilliseconds,
833{
835 HANDLE hNewWaitObject;
836
837 /* Get real handle */
838 hObject = TranslateStdHandle(hObject);
839
840 /* Check for console handle */
841 if ((IsConsoleHandle(hObject)) && (VerifyConsoleIoHandle(hObject)))
842 {
843 /* Get the real wait handle */
844 hObject = GetConsoleInputWaitHandle();
845 }
846
847 /* Register the wait */
848 Status = RtlRegisterWait(&hNewWaitObject,
849 hObject,
850 Callback,
851 Context,
852 dwMilliseconds,
853 dwFlags);
854 if (!NT_SUCCESS(Status))
855 {
856 /* Return failure */
858 return NULL;
859 }
860
861 /* Return the object */
862 return hNewWaitObject;
863}
864
865/*
866 * @implemented
867 */
868BOOL
869WINAPI
871{
873
874 /* Check for invalid handle */
875 if (!WaitHandle)
876 {
877 /* Fail */
879 return FALSE;
880 }
881
882 /* Deregister the wait and check status */
883 Status = RtlDeregisterWaitEx(WaitHandle, NULL);
884 if (!(NT_SUCCESS(Status)) || (Status == STATUS_PENDING))
885 {
886 /* Failure or non-blocking call */
888 return FALSE;
889 }
890
891 /* All good */
892 return TRUE;
893}
894
895/*
896 * @implemented
897 */
898BOOL
899WINAPI
901 IN HANDLE CompletionEvent)
902{
904
905 /* Check for invalid handle */
906 if (!WaitHandle)
907 {
908 /* Fail */
910 return FALSE;
911 }
912
913 /* Deregister the wait and check status */
914 Status = RtlDeregisterWaitEx(WaitHandle, CompletionEvent);
915 if (!(NT_SUCCESS(Status)) ||
916 ((CompletionEvent != INVALID_HANDLE_VALUE) && (Status == STATUS_PENDING)))
917 {
918 /* Failure or non-blocking call */
920 return FALSE;
921 }
922
923 /* All good */
924 return TRUE;
925}
926
927/* EOF */
#define DECLSPEC_HOTPATCH
Definition: _mingw.h:240
unsigned char BOOLEAN
Definition: actypes.h:127
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedExchange
Definition: armddk.h:54
#define InterlockedDecrement
Definition: armddk.h:52
LONG NTSTATUS
Definition: precomp.h:26
#define ConvertWin32AnsiObjectApiToUnicodeApi(obj, name,...)
Definition: base_x.h:54
#define ConvertOpenWin32AnsiObjectApiToUnicodeApi(obj, acc, inh, name)
Definition: base_x.h:86
#define ConvertAnsiToUnicodeEpilogue
Definition: base_x.h:42
#define CreateNtObjectFromWin32Api(obj, ntobj, access, sec, name,...)
Definition: base_x.h:135
#define ConvertAnsiToUnicodeBody(name)
Definition: base_x.h:38
#define ConvertAnsiToUnicodePrologue
Definition: base_x.h:33
#define OpenNtObjectFromWin32Api(ntobj, acc, inh, name)
Definition: base_x.h:143
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
Definition: heap.c:616
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
Definition: heap.c:634
Definition: Mutex.h:16
#define ERROR_NOT_ENOUGH_MEMORY
Definition: dderror.h:7
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define SetLastError(x)
Definition: compat.h:752
#define INVALID_HANDLE_VALUE
Definition: compat.h:731
#define ERROR_INVALID_HANDLE
Definition: compat.h:98
BOOL WINAPI DECLSPEC_HOTPATCH VerifyConsoleIoHandle(HANDLE hIoHandle)
Definition: console.c:1112
HANDLE TranslateStdHandle(IN HANDLE hHandle)
Definition: handle.c:19
PLARGE_INTEGER WINAPI BaseFormatTimeOut(OUT PLARGE_INTEGER Timeout, IN DWORD dwMilliseconds)
Definition: utils.c:289
IN OUT PLONG Addend
Definition: CrNtStubs.h:25
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
ULONG Handle
Definition: gdb_input.c:15
Status
Definition: gdiplustypes.h:25
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
VOID(CALLBACK * PTIMER_APC_ROUTINE)(PVOID, ULONG, LONG)
Definition: winternl.h:3621
#define InterlockedExchangeAdd
Definition: interlocked.h:196
#define InterlockedCompareExchange
Definition: interlocked.h:119
#define EVENT_ALL_ACCESS
Definition: isotest.c:82
_In_ PCWSTR _Out_ PVOID * ActCtx
Definition: ldrtypes.h:264
HANDLE hMutex
Definition: mutex.c:11
static HANDLE hEvent
Definition: comm.c:54
static WAITORTIMERCALLBACK
Definition: thread.c:84
static PLARGE_INTEGER Time
Definition: time.c:105
NTSTATUS NTAPI NtReleaseMutant(IN HANDLE MutantHandle, IN PLONG PreviousCount OPTIONAL)
Definition: mutant.c:296
#define TIMER_ALL_ACCESS
Definition: extypes.h:116
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSectionAndSpinCount(_In_ PRTL_CRITICAL_SECTION CriticalSection, _In_ ULONG SpinCount)
NTSYSAPI NTSTATUS NTAPI RtlRegisterWait(_In_ PHANDLE phNewWaitObject, _In_ HANDLE hObject, _In_ WAITORTIMERCALLBACKFUNC Callback, _In_ PVOID pvContext, _In_ ULONG ulMilliseconds, _In_ ULONG ulFlags)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
Definition: rtlfuncs.h:3051
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
DECLSPEC_NORETURN NTSYSAPI VOID NTAPI RtlRaiseStatus(_In_ NTSTATUS Status)
NTSYSAPI NTSTATUS NTAPI RtlDeregisterWaitEx(_In_ HANDLE hWaitHandle, _In_opt_ HANDLE hCompletionEvent)
#define RTL_CALLER_ALLOCATED_ACTIVATION_CONTEXT_STACK_FRAME_FORMAT_WHISTLER
Definition: rtltypes.h:101
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
HANDLE WaitableTimer
Definition: notevil.c:39
NTSTATUS NTAPI NtDelayExecution(IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval)
Definition: wait.c:876
NTSYSAPI NTSTATUS NTAPI NtWaitForSingleObject(IN HANDLE hObject, IN BOOLEAN bAlertable, IN PLARGE_INTEGER Timeout)
@ NotificationEvent
@ SynchronizationEvent
@ WaitAll
@ WaitAny
@ SynchronizationTimer
@ NotificationTimer
static BOOL bInheritHandle
Definition: pipe.c:82
NTSTATUS NTAPI NtPulseEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:252
NTSTATUS NTAPI NtSetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:463
NTSTATUS NTAPI NtResetEvent(IN HANDLE EventHandle, OUT PLONG PreviousState OPTIONAL)
Definition: event.c:394
NTSTATUS NTAPI NtSetTimer(IN HANDLE TimerHandle, IN PLARGE_INTEGER DueTime, IN PTIMER_APC_ROUTINE TimerApcRoutine OPTIONAL, IN PVOID TimerContext OPTIONAL, IN BOOLEAN WakeTimer, IN LONG Period OPTIONAL, OUT PBOOLEAN PreviousState OPTIONAL)
Definition: timer.c:583
NTSTATUS NTAPI NtCancelTimer(IN HANDLE TimerHandle, OUT PBOOLEAN CurrentState OPTIONAL)
Definition: timer.c:252
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define STATUS_ALERTED
Definition: ntstatus.h:133
#define STATUS_USER_APC
Definition: ntstatus.h:130
NTSTATUS NTAPI NtWaitForMultipleObjects(IN ULONG ObjectCount, IN PHANDLE HandleArray, IN WAIT_TYPE WaitType, IN BOOLEAN Alertable, IN PLARGE_INTEGER TimeOut OPTIONAL)
Definition: obwait.c:46
NTSTATUS NTAPI NtSignalAndWaitForSingleObject(IN HANDLE ObjectHandleToSignal, IN HANDLE WaitableObjectHandle, IN BOOLEAN Alertable, IN PLARGE_INTEGER TimeOut OPTIONAL)
Definition: obwait.c:473
#define CONST
Definition: pedump.c:81
long LONG
Definition: pedump.c:60
DWORD BaseSetLastNTError(IN NTSTATUS Status)
Definition: reactos.cpp:167
#define IsConsoleHandle(h)
Definition: console.h:14
long __cdecl _InterlockedExchangeAdd(_Interlocked_operand_ long volatile *_Addend, long _Value)
long __cdecl _InterlockedIncrement(_Interlocked_operand_ long volatile *_Addend)
long __cdecl _InterlockedExchange(_Interlocked_operand_ long volatile *_Target, long _Value)
long __cdecl _InterlockedCompareExchange(_Interlocked_operand_ long volatile *_Destination, long _Exchange, long _Comparand)
long __cdecl _InterlockedDecrement(_Interlocked_operand_ long volatile *_Addend)
NTSTATUS NTAPI NtReleaseSemaphore(IN HANDLE SemaphoreHandle, IN LONG ReleaseCount, OUT PLONG PreviousCount OPTIONAL)
Definition: sem.c:295
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68
DWORD WINAPI WaitForMultipleObjects(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds)
Definition: synch.c:151
BOOL WINAPI UnregisterWaitEx(IN HANDLE WaitHandle, IN HANDLE CompletionEvent)
Definition: synch.c:900
HANDLE WINAPI DECLSPEC_HOTPATCH CreateSemaphoreExA(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCSTR lpName OPTIONAL, IN DWORD dwFlags OPTIONAL, IN DWORD dwDesiredAccess OPTIONAL)
Definition: synch.c:438
DWORD WINAPI SleepEx(IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:738
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
Definition: synch.c:618
HANDLE WINAPI OpenWaitableTimerW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpTimerName)
Definition: synch.c:346
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
VOID WINAPI DECLSPEC_HOTPATCH Sleep(IN DWORD dwMilliseconds)
Definition: synch.c:726
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
Definition: synch.c:687
BOOL WINAPI InitializeCriticalSectionAndSpinCount(OUT LPCRITICAL_SECTION lpCriticalSection, IN DWORD dwSpinCount)
Definition: synch.c:701
BOOL WINAPI DECLSPEC_HOTPATCH PulseEvent(IN HANDLE hEvent)
Definition: synch.c:631
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexW(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:525
DWORD WINAPI WaitForSingleObjectEx(IN HANDLE hHandle, IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:94
BOOL WINAPI SetWaitableTimer(IN HANDLE hTimer, IN const LARGE_INTEGER *pDueTime, IN LONG lPeriod, IN PTIMERAPCROUTINE pfnCompletionRoutine OPTIONAL, IN OPTIONAL LPVOID lpArgToCompletionRoutine, IN BOOL fResume)
Definition: synch.c:358
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseMutex(IN HANDLE hMutex)
Definition: synch.c:554
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventA(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:573
HANDLE WINAPI CreateWaitableTimerW(IN LPSECURITY_ATTRIBUTES lpTimerAttributes OPTIONAL, IN BOOL bManualReset, IN LPCWSTR lpTimerName OPTIONAL)
Definition: synch.c:331
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
HANDLE WINAPI DECLSPEC_HOTPATCH CreateMutexA(IN LPSECURITY_ATTRIBUTES lpMutexAttributes OPTIONAL, IN BOOL bInitialOwner, IN LPCSTR lpName OPTIONAL)
Definition: synch.c:512
HANDLE WINAPI DECLSPEC_HOTPATCH OpenMutexW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
Definition: synch.c:541
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
HANDLE WINAPI DECLSPEC_HOTPATCH OpenEventA(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCSTR lpName)
Definition: synch.c:605
BOOL WINAPI CancelWaitableTimer(IN HANDLE hTimer)
Definition: synch.c:387
HANDLE WINAPI DECLSPEC_HOTPATCH OpenSemaphoreW(IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN LPCWSTR lpName)
Definition: synch.c:478
BOOL WINAPI DECLSPEC_HOTPATCH ResetEvent(IN HANDLE hEvent)
Definition: synch.c:650
HANDLE WINAPI RegisterWaitForSingleObjectEx(IN HANDLE hObject, IN WAITORTIMERCALLBACK Callback, IN PVOID Context, IN ULONG dwMilliseconds, IN ULONG dwFlags)
Definition: synch.c:828
HANDLE WINAPI DECLSPEC_HOTPATCH CreateSemaphoreW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:406
DWORD WINAPI WaitForMultipleObjectsEx(IN DWORD nCount, IN CONST HANDLE *lpHandles, IN BOOL bWaitAll, IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:169
DWORD WINAPI SignalObjectAndWait(IN HANDLE hObjectToSignal, IN HANDLE hObjectToWaitOn, IN DWORD dwMilliseconds, IN BOOL bAlertable)
Definition: synch.c:269
BOOL WINAPI DECLSPEC_HOTPATCH ReleaseSemaphore(IN HANDLE hSemaphore, IN LONG lReleaseCount, IN LPLONG lpPreviousCount)
Definition: synch.c:491
BOOL WINAPI RegisterWaitForSingleObject(OUT PHANDLE phNewWaitObject, IN HANDLE hObject, IN WAITORTIMERCALLBACK Callback, IN PVOID Context, IN ULONG dwMilliseconds, IN ULONG dwFlags)
Definition: synch.c:786
HANDLE WINAPI DECLSPEC_HOTPATCH CreateSemaphoreExW(IN LPSECURITY_ATTRIBUTES lpSemaphoreAttributes OPTIONAL, IN LONG lInitialCount, IN LONG lMaximumCount, IN LPCWSTR lpName OPTIONAL, IN DWORD dwFlags OPTIONAL, IN DWORD dwDesiredAccess OPTIONAL)
Definition: synch.c:421
BOOL WINAPI UnregisterWait(IN HANDLE WaitHandle)
Definition: synch.c:870
#define STATUS_PENDING
Definition: telnetd.h:14
int32_t * LPLONG
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define OUT
Definition: typedefs.h:40
ULONG LowPart
Definition: typedefs.h:106
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
Definition: wdfinterrupt.h:458
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
_In_ WDFIOTARGET Target
Definition: wdfrequest.h:306
#define WAIT_IO_COMPLETION
Definition: winbase.h:388
#define MUTEX_ALL_ACCESS
Definition: winbase.h:160
_In_ LPCSTR lpName
Definition: winbase.h:2543
#define SEMAPHORE_ALL_ACCESS
Definition: winbase.h:162
#define WAIT_FAILED
Definition: winbase.h:390
void(CALLBACK * PTIMERAPCROUTINE)(PVOID, DWORD, DWORD)
Definition: winbase.h:1212
#define WINAPI
Definition: msvc.h:6
WINBASEAPI HANDLE WINAPI GetConsoleInputWaitHandle(void)
Definition: console.c:683
const char * LPCSTR
Definition: xmlstorage.h:183
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185