9a61cfc78c739e12680ddb07ed04d5058b3f1199
[reactos.git] / reactos / lib / kernel32 / synch / timer.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * FILE: lib/kernel32/mem/timer.c
5 * PURPOSE: Implementing timer
6 * PROGRAMMER:
7 */
8
9 /* INCLUDES ******************************************************************/
10
11 #include <windows.h>
12 #include <ddk/ntddk.h>
13
14 /* FUNCTIONS *****************************************************************/
15
16
17
18 HANDLE CreateWaitableTimerW(
19 LPSECURITY_ATTRIBUTES lpTimerAttributes,
20 WINBOOL bManualReset,
21 LPWSTR lpTimerName
22 )
23 {
24
25 NTSTATUS errCode;
26 HANDLE TimerHandle;
27 OBJECT_ATTRIBUTES ObjectAttributes;
28 UNICODE_STRING UnicodeName;
29
30 ULONG TimerType;
31
32 if ( bManualReset )
33 TimerType = 1;
34 else
35 TimerType = 2;
36
37 RtlInitUnicodeString(&UnicodeName, lpTimerName);
38 InitializeObjectAttributes(&ObjectAttributes,
39 &UnicodeName,
40 0,
41 NULL,
42 NULL);
43 //TIMER_ALL_ACCESS
44 errCode = NtCreateTimer(
45 &TimerHandle,
46 0,
47 &ObjectAttributes,
48 TimerType
49 );
50
51 return TimerHandle;
52 }
53
54
55 HANDLE CreateWaitableTimerA(
56 LPSECURITY_ATTRIBUTES lpTimerAttributes,
57 WINBOOL bManualReset,
58 LPCSTR lpTimerName
59 )
60 {
61 WCHAR NameW[MAX_PATH];
62 ULONG i = 0;
63
64 while ((*lpTimerName)!=0 && i < MAX_PATH)
65 {
66 NameW[i] = *lpTimerName;
67 lpTimerName++;
68 i++;
69 }
70 NameW[i] = 0;
71 return CreateWaitableTimerW(lpTimerAttributes,
72 bManualReset,
73 NameW);
74 }
75
76 HANDLE OpenWaitableTimerW(
77 DWORD dwDesiredAccess,
78 WINBOOL bInheritHandle,
79 LPCWSTR lpTimerName
80 )
81 {
82 NTSTATUS errCode;
83
84 HANDLE TimerHandle;
85 OBJECT_ATTRIBUTES ObjectAttributes;
86 UNICODE_STRING UnicodeName;
87 ULONG Attributes = 0;
88
89 if ( bInheritHandle )
90 Attributes = OBJ_INHERIT;
91
92
93 RtlInitUnicodeString(&UnicodeName, lpTimerName);
94 InitializeObjectAttributes(&ObjectAttributes,
95 &UnicodeName,
96 Attributes,
97 NULL,
98 NULL);
99
100 errCode = NtOpenTimer(
101 &TimerHandle,
102 dwDesiredAccess,
103 &ObjectAttributes
104 );
105
106 return TimerHandle;
107 }
108
109 HANDLE OpenWaitableTimerA(
110 DWORD dwDesiredAccess,
111 WINBOOL bInheritHandle,
112 LPCSTR lpTimerName
113 )
114 {
115 WCHAR NameW[MAX_PATH];
116 ULONG i = 0;
117
118 while ((*lpTimerName)!=0 && i < MAX_PATH)
119 {
120 NameW[i] = *lpTimerName;
121 lpTimerName++;
122 i++;
123 }
124 NameW[i] = 0;
125 return OpenWaitableTimerW(dwDesiredAccess, bInheritHandle,(LPCWSTR) NameW);
126 }
127
128
129 WINBOOL SetWaitableTimer(
130 HANDLE hTimer,
131 LARGE_INTEGER *pDueTime,
132 LONG lPeriod,
133 PTIMERAPCROUTINE pfnCompletionRoutine,
134 LPVOID lpArgToCompletionRoutine,
135 WINBOOL fResume
136 )
137 {
138 NTSTATUS errCode;
139 BOOLEAN pState;
140
141 errCode = NtSetTimer(hTimer, pDueTime,
142 pfnCompletionRoutine,
143 lpArgToCompletionRoutine, fResume, lPeriod, &pState);
144
145 if ( !NT_SUCCESS(errCode) ) {
146 SetLastError(RtlNtStatusToDosError(errCode));
147 return FALSE;
148 }
149 return TRUE;
150 }
151
152 WINBOOL CancelWaitableTimer(HANDLE hTimer)
153 {
154 NTSTATUS errCode;
155 BOOLEAN CurrentState;
156
157 errCode = NtCancelTimer(
158 hTimer,
159 &CurrentState
160 );
161 if ( !NT_SUCCESS(errCode) ) {
162 SetLastError(RtlNtStatusToDosError(errCode));
163 return FALSE;
164 }
165 return TRUE;
166
167 }