2003-01-15 21:24:36 +00:00
|
|
|
/* $Id: timer.c,v 1.12 2003/01/15 21:24:36 chorns Exp $
|
2000-03-16 21:50:11 +00:00
|
|
|
*
|
1999-09-27 20:58:46 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
2001-02-17 00:07:49 +00:00
|
|
|
* FILE: lib/kernel32/synch/timer.c
|
1999-09-27 20:58:46 +00:00
|
|
|
* PURPOSE: Implementing timer
|
|
|
|
* PROGRAMMER:
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
2003-01-15 21:24:36 +00:00
|
|
|
#include <k32.h>
|
1999-09-27 20:58:46 +00:00
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <kernel32/kernel32.h>
|
|
|
|
|
1999-09-27 20:58:46 +00:00
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
HANDLE STDCALL
|
|
|
|
CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,
|
2002-09-08 10:23:54 +00:00
|
|
|
WINBOOL bManualReset,
|
|
|
|
LPWSTR lpTimerName)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
2001-02-17 00:07:49 +00:00
|
|
|
NTSTATUS Status;
|
1999-11-24 11:51:55 +00:00
|
|
|
HANDLE TimerHandle;
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
|
|
UNICODE_STRING UnicodeName;
|
|
|
|
ULONG TimerType;
|
|
|
|
|
|
|
|
if (bManualReset)
|
2001-02-18 19:43:15 +00:00
|
|
|
TimerType = NotificationTimer;
|
1999-11-24 11:51:55 +00:00
|
|
|
else
|
2001-02-18 19:43:15 +00:00
|
|
|
TimerType = SynchronizationTimer;
|
1999-11-24 11:51:55 +00:00
|
|
|
|
|
|
|
RtlInitUnicodeString(&UnicodeName, lpTimerName);
|
|
|
|
InitializeObjectAttributes(&ObjectAttributes,
|
1999-09-27 20:58:46 +00:00
|
|
|
&UnicodeName,
|
|
|
|
0,
|
2001-02-17 00:07:49 +00:00
|
|
|
hBaseDir,
|
1999-09-27 20:58:46 +00:00
|
|
|
NULL);
|
2001-02-17 00:07:49 +00:00
|
|
|
|
|
|
|
Status = NtCreateTimer(&TimerHandle,
|
|
|
|
TIMER_ALL_ACCESS,
|
|
|
|
&ObjectAttributes,
|
|
|
|
TimerType);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastErrorByStatus(Status);
|
|
|
|
return NULL;
|
|
|
|
}
|
1999-09-27 20:58:46 +00:00
|
|
|
|
1999-11-24 11:51:55 +00:00
|
|
|
return TimerHandle;
|
1999-09-27 20:58:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
HANDLE STDCALL
|
|
|
|
CreateWaitableTimerA(LPSECURITY_ATTRIBUTES lpTimerAttributes,
|
2002-09-08 10:23:54 +00:00
|
|
|
WINBOOL bManualReset,
|
2001-02-17 00:07:49 +00:00
|
|
|
LPCSTR lpTimerName)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
2000-03-16 21:50:11 +00:00
|
|
|
UNICODE_STRING TimerNameU;
|
|
|
|
ANSI_STRING TimerName;
|
|
|
|
HANDLE TimerHandle;
|
|
|
|
|
|
|
|
RtlInitAnsiString (&TimerName,
|
|
|
|
(LPSTR)lpTimerName);
|
|
|
|
RtlAnsiStringToUnicodeString (&TimerNameU,
|
|
|
|
&TimerName,
|
|
|
|
TRUE);
|
|
|
|
|
|
|
|
TimerHandle = CreateWaitableTimerW (lpTimerAttributes,
|
|
|
|
bManualReset,
|
|
|
|
TimerNameU.Buffer);
|
|
|
|
|
|
|
|
RtlFreeUnicodeString (&TimerNameU);
|
|
|
|
|
|
|
|
return TimerHandle;
|
1999-09-27 20:58:46 +00:00
|
|
|
}
|
|
|
|
|
2000-03-16 21:50:11 +00:00
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
HANDLE STDCALL
|
|
|
|
OpenWaitableTimerW(DWORD dwDesiredAccess,
|
|
|
|
WINBOOL bInheritHandle,
|
|
|
|
LPCWSTR lpTimerName)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
2001-02-17 00:07:49 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
HANDLE TimerHandle;
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
|
|
UNICODE_STRING UnicodeName;
|
|
|
|
ULONG Attributes = 0;
|
1999-09-27 20:58:46 +00:00
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
if (bInheritHandle)
|
|
|
|
{
|
|
|
|
Attributes = OBJ_INHERIT;
|
|
|
|
}
|
1999-09-27 20:58:46 +00:00
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
RtlInitUnicodeString(&UnicodeName,
|
|
|
|
lpTimerName);
|
|
|
|
InitializeObjectAttributes(&ObjectAttributes,
|
1999-09-27 20:58:46 +00:00
|
|
|
&UnicodeName,
|
|
|
|
Attributes,
|
2001-02-17 00:07:49 +00:00
|
|
|
hBaseDir,
|
1999-09-27 20:58:46 +00:00
|
|
|
NULL);
|
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
Status = NtOpenTimer(&TimerHandle,
|
|
|
|
dwDesiredAccess,
|
|
|
|
&ObjectAttributes);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastErrorByStatus(Status);
|
|
|
|
return NULL;
|
|
|
|
}
|
1999-09-27 20:58:46 +00:00
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
return TimerHandle;
|
1999-09-27 20:58:46 +00:00
|
|
|
}
|
|
|
|
|
2000-03-16 21:50:11 +00:00
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
HANDLE STDCALL
|
|
|
|
OpenWaitableTimerA(DWORD dwDesiredAccess,
|
|
|
|
WINBOOL bInheritHandle,
|
|
|
|
LPCSTR lpTimerName)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
2000-03-16 21:50:11 +00:00
|
|
|
UNICODE_STRING TimerNameU;
|
|
|
|
ANSI_STRING TimerName;
|
|
|
|
HANDLE TimerHandle;
|
|
|
|
|
|
|
|
RtlInitAnsiString (&TimerName,
|
|
|
|
(LPSTR)lpTimerName);
|
|
|
|
RtlAnsiStringToUnicodeString (&TimerNameU,
|
|
|
|
&TimerName,
|
|
|
|
TRUE);
|
|
|
|
|
|
|
|
TimerHandle = OpenWaitableTimerW (dwDesiredAccess,
|
|
|
|
bInheritHandle,
|
|
|
|
TimerNameU.Buffer);
|
|
|
|
|
|
|
|
RtlFreeUnicodeString (&TimerNameU);
|
|
|
|
|
|
|
|
return TimerHandle;
|
1999-09-27 20:58:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
WINBOOL STDCALL
|
|
|
|
SetWaitableTimer(HANDLE hTimer,
|
|
|
|
const LARGE_INTEGER *pDueTime,
|
|
|
|
LONG lPeriod,
|
|
|
|
PTIMERAPCROUTINE pfnCompletionRoutine,
|
|
|
|
LPVOID lpArgToCompletionRoutine,
|
|
|
|
WINBOOL fResume)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
2001-02-17 00:07:49 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
BOOLEAN pState;
|
|
|
|
|
|
|
|
Status = NtSetTimer(hTimer,
|
|
|
|
(LARGE_INTEGER *)pDueTime,
|
|
|
|
pfnCompletionRoutine,
|
|
|
|
lpArgToCompletionRoutine,
|
|
|
|
fResume,
|
|
|
|
lPeriod,
|
|
|
|
&pState);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastErrorByStatus(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
1999-09-27 20:58:46 +00:00
|
|
|
}
|
|
|
|
|
2001-02-17 00:07:49 +00:00
|
|
|
|
|
|
|
WINBOOL STDCALL
|
|
|
|
CancelWaitableTimer(HANDLE hTimer)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
2001-02-17 00:07:49 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
BOOLEAN CurrentState;
|
|
|
|
|
|
|
|
Status = NtCancelTimer(hTimer,
|
|
|
|
&CurrentState);
|
|
|
|
if (!NT_SUCCESS(Status))
|
|
|
|
{
|
|
|
|
SetLastErrorByStatus(Status);
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
1999-11-24 11:51:55 +00:00
|
|
|
}
|
2000-03-16 21:50:11 +00:00
|
|
|
|
|
|
|
/* EOF */
|