1999-09-27 20:58:46 +00:00
|
|
|
/*
|
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* FILE: lib/kernel32/mem/timer.c
|
|
|
|
* PURPOSE: Implementing timer
|
|
|
|
* PROGRAMMER:
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* INCLUDES ******************************************************************/
|
|
|
|
|
|
|
|
#include <ddk/ntddk.h>
|
1999-10-07 23:46:27 +00:00
|
|
|
#include <windows.h>
|
1999-09-27 20:58:46 +00:00
|
|
|
|
|
|
|
/* FUNCTIONS *****************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
1999-11-24 11:51:55 +00:00
|
|
|
HANDLE CreateWaitableTimerW(LPSECURITY_ATTRIBUTES lpTimerAttributes,
|
|
|
|
WINBOOL bManualReset,
|
|
|
|
LPWSTR lpTimerName)
|
1999-09-27 20:58:46 +00:00
|
|
|
{
|
1999-11-24 11:51:55 +00:00
|
|
|
NTSTATUS errCode;
|
|
|
|
HANDLE TimerHandle;
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
|
|
UNICODE_STRING UnicodeName;
|
|
|
|
|
|
|
|
ULONG TimerType;
|
|
|
|
|
|
|
|
if (bManualReset)
|
|
|
|
TimerType = 1;
|
|
|
|
else
|
|
|
|
TimerType = 2;
|
|
|
|
|
|
|
|
RtlInitUnicodeString(&UnicodeName, lpTimerName);
|
|
|
|
InitializeObjectAttributes(&ObjectAttributes,
|
1999-09-27 20:58:46 +00:00
|
|
|
&UnicodeName,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
NULL);
|
1999-11-24 11:51:55 +00:00
|
|
|
//TIMER_ALL_ACCESS
|
|
|
|
errCode = NtCreateTimer(&TimerHandle,
|
|
|
|
0,
|
|
|
|
&ObjectAttributes,
|
|
|
|
TimerType);
|
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
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
HANDLE CreateWaitableTimerA(
|
|
|
|
LPSECURITY_ATTRIBUTES lpTimerAttributes,
|
|
|
|
WINBOOL bManualReset,
|
|
|
|
LPCSTR lpTimerName
|
|
|
|
)
|
|
|
|
{
|
|
|
|
WCHAR NameW[MAX_PATH];
|
|
|
|
ULONG i = 0;
|
|
|
|
|
|
|
|
while ((*lpTimerName)!=0 && i < MAX_PATH)
|
|
|
|
{
|
|
|
|
NameW[i] = *lpTimerName;
|
|
|
|
lpTimerName++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
NameW[i] = 0;
|
|
|
|
return CreateWaitableTimerW(lpTimerAttributes,
|
|
|
|
bManualReset,
|
|
|
|
NameW);
|
|
|
|
}
|
|
|
|
|
|
|
|
HANDLE OpenWaitableTimerW(
|
|
|
|
DWORD dwDesiredAccess,
|
|
|
|
WINBOOL bInheritHandle,
|
|
|
|
LPCWSTR lpTimerName
|
|
|
|
)
|
|
|
|
{
|
|
|
|
NTSTATUS errCode;
|
|
|
|
|
|
|
|
HANDLE TimerHandle;
|
|
|
|
OBJECT_ATTRIBUTES ObjectAttributes;
|
|
|
|
UNICODE_STRING UnicodeName;
|
|
|
|
ULONG Attributes = 0;
|
|
|
|
|
|
|
|
if ( bInheritHandle )
|
|
|
|
Attributes = OBJ_INHERIT;
|
|
|
|
|
|
|
|
|
|
|
|
RtlInitUnicodeString(&UnicodeName, lpTimerName);
|
|
|
|
InitializeObjectAttributes(&ObjectAttributes,
|
|
|
|
&UnicodeName,
|
|
|
|
Attributes,
|
|
|
|
NULL,
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
errCode = NtOpenTimer(
|
|
|
|
&TimerHandle,
|
|
|
|
dwDesiredAccess,
|
|
|
|
&ObjectAttributes
|
|
|
|
);
|
|
|
|
|
|
|
|
return TimerHandle;
|
|
|
|
}
|
|
|
|
|
|
|
|
HANDLE OpenWaitableTimerA(
|
|
|
|
DWORD dwDesiredAccess,
|
|
|
|
WINBOOL bInheritHandle,
|
|
|
|
LPCSTR lpTimerName
|
|
|
|
)
|
|
|
|
{
|
|
|
|
WCHAR NameW[MAX_PATH];
|
|
|
|
ULONG i = 0;
|
|
|
|
|
|
|
|
while ((*lpTimerName)!=0 && i < MAX_PATH)
|
|
|
|
{
|
|
|
|
NameW[i] = *lpTimerName;
|
|
|
|
lpTimerName++;
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
NameW[i] = 0;
|
|
|
|
return OpenWaitableTimerW(dwDesiredAccess, bInheritHandle,(LPCWSTR) NameW);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WINBOOL SetWaitableTimer(
|
|
|
|
HANDLE hTimer,
|
|
|
|
LARGE_INTEGER *pDueTime,
|
|
|
|
LONG lPeriod,
|
|
|
|
PTIMERAPCROUTINE pfnCompletionRoutine,
|
|
|
|
LPVOID lpArgToCompletionRoutine,
|
|
|
|
WINBOOL fResume
|
|
|
|
)
|
|
|
|
{
|
|
|
|
NTSTATUS errCode;
|
|
|
|
BOOLEAN pState;
|
|
|
|
|
|
|
|
errCode = NtSetTimer(hTimer, pDueTime,
|
|
|
|
pfnCompletionRoutine,
|
|
|
|
lpArgToCompletionRoutine, fResume, lPeriod, &pState);
|
|
|
|
|
|
|
|
if ( !NT_SUCCESS(errCode) ) {
|
|
|
|
SetLastError(RtlNtStatusToDosError(errCode));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
WINBOOL CancelWaitableTimer(HANDLE hTimer)
|
|
|
|
{
|
|
|
|
NTSTATUS errCode;
|
|
|
|
BOOLEAN CurrentState;
|
|
|
|
|
|
|
|
errCode = NtCancelTimer(
|
|
|
|
hTimer,
|
|
|
|
&CurrentState
|
|
|
|
);
|
|
|
|
if ( !NT_SUCCESS(errCode) ) {
|
|
|
|
SetLastError(RtlNtStatusToDosError(errCode));
|
|
|
|
return FALSE;
|
|
|
|
}
|
|
|
|
return TRUE;
|
|
|
|
|
1999-11-24 11:51:55 +00:00
|
|
|
}
|