From 580f2e7a686fb2a0da7ff3ca441232a867ff9778 Mon Sep 17 00:00:00 2001 From: Thomas Bluemel Date: Thu, 8 Jul 2004 00:40:31 +0000 Subject: [PATCH] 1. implemented the timer queue functions of kernel32 (I tested the implementation of CreateTimerQueueTimer() and DeleteTimerQueueTimer() on windows) 2. export the timer queue Rtl* stubs of ntdll svn path=/trunk/; revision=10029 --- reactos/include/base.h | 4 +- reactos/include/funcs.h | 23 -- reactos/include/ntdll/rtl.h | 31 +- reactos/lib/kernel32/makefile | 4 +- reactos/lib/kernel32/misc/stubs.c | 123 +------- reactos/lib/kernel32/misc/timerqueue.c | 377 +++++++++++++++++++++++++ reactos/lib/ntdll/def/ntdll.def | 8 +- reactos/lib/ntdll/def/ntdll.edf | 8 +- reactos/lib/ntdll/makefile | 3 +- reactos/lib/ntdll/rtl/timerqueue.c | 119 ++++++++ 10 files changed, 547 insertions(+), 153 deletions(-) create mode 100644 reactos/lib/kernel32/misc/timerqueue.c create mode 100644 reactos/lib/ntdll/rtl/timerqueue.c diff --git a/reactos/include/base.h b/reactos/include/base.h index 282db9f5917..333a062fe56 100644 --- a/reactos/include/base.h +++ b/reactos/include/base.h @@ -733,8 +733,8 @@ typedef enum _MEMORY_RESOURCE_NOTIFICATION_TYPE { HighMemoryResourceNotification } MEMORY_RESOURCE_NOTIFICATION_TYPE; -typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); -typedef WAITORTIMERCALLBACKFUNC WAITORTIMERCALLBACK; +typedef VOID (CALLBACK *WAITORTIMERCALLBACK) (PVOID, BOOLEAN ); + /* End of stuff from ddeml.h in old Cygnus headers */ /* ----------------------------------------------- */ diff --git a/reactos/include/funcs.h b/reactos/include/funcs.h index 7c8423d1c9a..763a63f156c 100644 --- a/reactos/include/funcs.h +++ b/reactos/include/funcs.h @@ -1073,29 +1073,6 @@ STDCALL RtlQueryDepthSList ( PSLIST_HEADER ListHead ); -NTSTATUS -STDCALL -RtlCreateTimer(HANDLE TimerQueue,PHANDLE phNewTimer, WAITORTIMERCALLBACK Callback,PVOID Parameter,DWORD DueTime,DWORD Period,ULONG Flags); - -NTSTATUS -STDCALL -RtlCreateTimerQueue(PHANDLE TimerQueue); - -NTSTATUS -STDCALL -RtlDeleteTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent); - -NTSTATUS -STDCALL -RtlUpdateTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period); - -NTSTATUS -STDCALL -RtlDeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent); - -NTSTATUS -STDCALL -RtlDeleteTimerQueue(HANDLE TimerQueue); NTSTATUS STDCALL diff --git a/reactos/include/ntdll/rtl.h b/reactos/include/ntdll/rtl.h index 365a41386e3..e61f005d1cc 100644 --- a/reactos/include/ntdll/rtl.h +++ b/reactos/include/ntdll/rtl.h @@ -1,4 +1,4 @@ -/* $Id: rtl.h,v 1.43 2004/02/03 14:19:56 ekohl Exp $ +/* $Id: rtl.h,v 1.44 2004/07/08 00:40:30 weiden Exp $ * */ @@ -616,6 +616,35 @@ VOID STDCALL RtlRunEncodeUnicodeString (IN OUT PUCHAR Hash, IN OUT PUNICODE_STRING String); +/* Timer Queue functions */ + +typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); + +NTSTATUS +STDCALL +RtlCreateTimer(HANDLE TimerQueue,PHANDLE phNewTimer, WAITORTIMERCALLBACKFUNC Callback,PVOID Parameter,DWORD DueTime,DWORD Period,ULONG Flags); + +NTSTATUS +STDCALL +RtlCreateTimerQueue(PHANDLE TimerQueue); + +NTSTATUS +STDCALL +RtlDeleteTimer(HANDLE TimerQueue,HANDLE Timer,HANDLE CompletionEvent); + +NTSTATUS +STDCALL +RtlUpdateTimer(HANDLE TimerQueue,HANDLE Timer,ULONG DueTime,ULONG Period); + +NTSTATUS +STDCALL +RtlDeleteTimerQueueEx(HANDLE TimerQueue,HANDLE CompletionEvent); + +NTSTATUS +STDCALL +RtlDeleteTimerQueue(HANDLE TimerQueue); + + #ifndef __NTDRIVER__ #ifndef __INTERLOCKED_DECLARED diff --git a/reactos/lib/kernel32/makefile b/reactos/lib/kernel32/makefile index eff36290df5..9258dd80b04 100644 --- a/reactos/lib/kernel32/makefile +++ b/reactos/lib/kernel32/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.81 2004/06/26 20:11:18 gdalsnes Exp $ +# $Id: makefile,v 1.82 2004/07/08 00:40:30 weiden Exp $ PATH_TO_TOP = ../.. @@ -30,7 +30,7 @@ SYNCH_OBJECTS = synch/critical.o synch/event.o synch/intrlck.o synch/mutex.o \ MISC_OBJECTS = misc/error.o misc/atom.o misc/handle.o misc/env.o \ misc/dllmain.o misc/comm.o misc/errormsg.o \ - misc/console.o misc/time.o misc/toolhelp.o \ + misc/console.o misc/time.o misc/timerqueue.o misc/toolhelp.o \ misc/stubs.o misc/lang.o misc/ldr.o misc/res.o \ misc/sysinfo.o misc/profile.o \ misc/mbchars.o misc/muldiv.o misc/computername.o \ diff --git a/reactos/lib/kernel32/misc/stubs.c b/reactos/lib/kernel32/misc/stubs.c index 0c5056691c7..ca067da5f21 100644 --- a/reactos/lib/kernel32/misc/stubs.c +++ b/reactos/lib/kernel32/misc/stubs.c @@ -1,4 +1,4 @@ -/* $Id: stubs.c,v 1.79 2004/06/26 12:56:11 navaraf Exp $ +/* $Id: stubs.c,v 1.80 2004/07/08 00:40:30 weiden Exp $ * * KERNEL32.DLL stubs (unimplemented functions) * Remove from this file, if you implement them. @@ -653,35 +653,6 @@ CancelDeviceWakeupRequest( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -CancelTimerQueueTimer( - HANDLE TimerQueue, - HANDLE Timer - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} -/* - * @unimplemented - */ - -BOOL -STDCALL -ChangeTimerQueueTimer( - HANDLE TimerQueue, - HANDLE Timer, - ULONG DueTime, - ULONG Period - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} /* * @unimplemented @@ -736,38 +707,6 @@ CreateMemoryResourceNotification( return 0; } -/* - * @unimplemented - */ -HANDLE -STDCALL -CreateTimerQueue( - VOID - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -CreateTimerQueueTimer( - PHANDLE phNewTimer, - HANDLE TimerQueue, - WAITORTIMERCALLBACK Callback, - PVOID Parameter, - DWORD DueTime, - DWORD Period, - ULONG Flags - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -783,48 +722,6 @@ DeactivateActCtx( return 0; } -/* - * @unimplemented - */ -BOOL -STDCALL -DeleteTimerQueue( - HANDLE TimerQueue - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -DeleteTimerQueueEx( - HANDLE TimerQueue, - HANDLE CompletionEvent - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/* - * @unimplemented - */ -BOOL -STDCALL -DeleteTimerQueueTimer( - HANDLE TimerQueue, - HANDLE Timer, - HANDLE CompletionEvent - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ @@ -1458,24 +1355,6 @@ SetThreadExecutionState( return 0; } -/* - * @unimplemented - */ -HANDLE -STDCALL -SetTimerQueueTimer( - HANDLE TimerQueue, - WAITORTIMERCALLBACK Callback, - PVOID Parameter, - DWORD DueTime, - DWORD Period, - BOOL PreferIo - ) -{ - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - /* * @unimplemented */ diff --git a/reactos/lib/kernel32/misc/timerqueue.c b/reactos/lib/kernel32/misc/timerqueue.c new file mode 100644 index 00000000000..4bb0e1aeeb6 --- /dev/null +++ b/reactos/lib/kernel32/misc/timerqueue.c @@ -0,0 +1,377 @@ +/* + * ReactOS kernel + * Copyright (C) 2004 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* $Id: timerqueue.c,v 1.1 2004/07/08 00:40:30 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Timer Queue functions + * FILE: lib/kernel32/misc/timerqueue.c + * PROGRAMER: Thomas Weidenmueller + */ + +/* INCLUDES ******************************************************************/ + +#include + +#define NDEBUG +#include "../include/debug.h" + + +/* FUNCTIONS *****************************************************************/ + +HANDLE DefaultTimerQueue = NULL; + +/* + * Create the default timer queue for the current process. This function is only + * called if CreateTimerQueueTimer() or SetTimerQueueTimer() is called. + * However, ChangeTimerQueueTimer() fails with ERROR_INVALID_PARAMETER if the + * default timer queue has not been created, because it assumes there has to be + * a timer queue with a timer if it want's to be changed. + */ +static BOOL +IntCreateDefaultTimerQueue(VOID) +{ + NTSTATUS Status; + + /* FIXME - make this thread safe */ + + /* create the timer queue */ + Status = RtlCreateTimerQueue(&DefaultTimerQueue); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + DPRINT1("Unable to create the default timer queue!\n"); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +CancelTimerQueueTimer(HANDLE TimerQueue, + HANDLE Timer) +{ + /* Since this function is not documented in PSDK and apparently does nothing + but delete the timer, we just do the same as DeleteTimerQueueTimer(), without + passing a completion event. */ + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* let's use the process' default timer queue. We assume the default timer + queue has been created with a previous call to CreateTimerQueueTimer() or + SetTimerQueueTimer(), otherwise this call wouldn't make much sense. */ + if(!(TimerQueue = DefaultTimerQueue)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + } + + if(Timer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* delete the timer */ + Status = RtlDeleteTimer(TimerQueue, Timer, NULL); + + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +ChangeTimerQueueTimer(HANDLE TimerQueue, + HANDLE Timer, + ULONG DueTime, + ULONG Period) +{ + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* let's use the process' default timer queue. We assume the default timer + queue has been created with a previous call to CreateTimerQueueTimer() or + SetTimerQueueTimer(), otherwise this call wouldn't make much sense. */ + if(!(TimerQueue = DefaultTimerQueue)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + } + + if(Timer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* update the timer */ + Status = RtlUpdateTimer(TimerQueue, Timer, DueTime, Period); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +HANDLE +STDCALL +CreateTimerQueue(VOID) +{ + HANDLE Handle; + NTSTATUS Status; + + /* create the timer queue */ + Status = RtlCreateTimerQueue(&Handle); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return NULL; + } + + return Handle; +} + +/* + * @implemented + */ +BOOL +STDCALL +CreateTimerQueueTimer(PHANDLE phNewTimer, + HANDLE TimerQueue, + WAITORTIMERCALLBACK Callback, + PVOID Parameter, + DWORD DueTime, + DWORD Period, + ULONG Flags) +{ + NTSTATUS Status; + + /* windows seems not to test this parameter at all, so we'll try to clear it here + so we don't crash somewhere inside ntdll */ + *phNewTimer = NULL; + + if(TimerQueue == NULL) + { + /* the default timer queue is requested, try to create it if it hasn't been already */ + if(!(TimerQueue = DefaultTimerQueue)) + { + if(!IntCreateDefaultTimerQueue()) + { + /* IntCreateDefaultTimerQueue() set the last error code already, just fail */ + return FALSE; + } + TimerQueue = DefaultTimerQueue; + } + } + + /* !!! Win doesn't even check if Callback == NULL, so we don't, too! That'll + raise a nice exception later... */ + + /* create the timer */ + Status = RtlCreateTimer(TimerQueue, phNewTimer, Callback, Parameter, DueTime, + Period, Flags); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +DeleteTimerQueue(HANDLE TimerQueue) +{ + NTSTATUS Status; + + /* We don't allow the user to delete the default timer queue */ + if(TimerQueue == NULL) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + /* delete the timer queue */ + Status = RtlDeleteTimerQueue(TimerQueue); + return NT_SUCCESS(Status); +} + +/* + * @implemented + */ +BOOL +STDCALL +DeleteTimerQueueEx(HANDLE TimerQueue, + HANDLE CompletionEvent) +{ + NTSTATUS Status; + + /* We don't allow the user to delete the default timer queue */ + if(TimerQueue == NULL) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + + /* delete the queue */ + Status = RtlDeleteTimerQueueEx(TimerQueue, CompletionEvent); + + if((CompletionEvent != INVALID_HANDLE_VALUE && Status == STATUS_PENDING) || + !NT_SUCCESS(Status)) + { + /* In case CompletionEvent == NULL, RtlDeleteTimerQueueEx() returns before + all callback routines returned. We set the last error code to STATUS_PENDING + and return FALSE. In case CompletionEvent == INVALID_HANDLE_VALUE we only + can get here if another error occured. In case CompletionEvent is something + else, we get here and fail, even though it isn't really an error (if Status == STATUS_PENDING). + We also handle all other failures the same way. */ + + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +BOOL +STDCALL +DeleteTimerQueueTimer(HANDLE TimerQueue, + HANDLE Timer, + HANDLE CompletionEvent) +{ + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* let's use the process' default timer queue. We assume the default timer + queue has been created with a previous call to CreateTimerQueueTimer() or + SetTimerQueueTimer(), otherwise this call wouldn't make much sense. */ + if(!(TimerQueue = DefaultTimerQueue)) + { + SetLastError(ERROR_INVALID_HANDLE); + return FALSE; + } + } + + if(Timer == NULL) + { + SetLastError(ERROR_INVALID_PARAMETER); + return FALSE; + } + + /* delete the timer */ + Status = RtlDeleteTimer(TimerQueue, Timer, CompletionEvent); + + if((CompletionEvent != INVALID_HANDLE_VALUE && Status == STATUS_PENDING) || + !NT_SUCCESS(Status)) + { + /* In case CompletionEvent == NULL, RtlDeleteTimer() returns before + the callback routine returned. We set the last error code to STATUS_PENDING + and return FALSE. In case CompletionEvent == INVALID_HANDLE_VALUE we only + can get here if another error occured. In case CompletionEvent is something + else, we get here and fail, even though it isn't really an error (if Status == STATUS_PENDING). + We also handle all other failures the same way. */ + + SetLastErrorByStatus(Status); + return FALSE; + } + + return TRUE; +} + +/* + * @implemented + */ +HANDLE +STDCALL +SetTimerQueueTimer(HANDLE TimerQueue, + WAITORTIMERCALLBACK Callback, + PVOID Parameter, + DWORD DueTime, + DWORD Period, + BOOL PreferIo) +{ + /* Since this function is not documented in PSDK and apparently does nothing + but create a timer, we just do the same as CreateTimerQueueTimer(). Unfortunately + I don't really know what PreferIo is supposed to be, it propably just affects the + Flags parameter of CreateTimerQueueTimer(). Looking at the PSDK documentation of + CreateTimerQueueTimer() there's only one flag (WT_EXECUTEINIOTHREAD) that causes + the callback function queued to an I/O worker thread. I guess it uses this flag + if PreferIo == TRUE, otherwise let's just use WT_EXECUTEDEFAULT. We should + test this though, this is only guess work and I'm too lazy to do further + investigation. */ + + HANDLE Timer; + NTSTATUS Status; + + if(TimerQueue == NULL) + { + /* the default timer queue is requested, try to create it if it hasn't been already */ + if(!(TimerQueue = DefaultTimerQueue)) + { + if(!IntCreateDefaultTimerQueue()) + { + /* IntCreateDefaultTimerQueue() set the last error code already, just fail */ + return FALSE; + } + TimerQueue = DefaultTimerQueue; + } + } + + /* create the timer */ + Status = RtlCreateTimer(TimerQueue, &Timer, Callback, Parameter, DueTime, + Period, (PreferIo ? WT_EXECUTEINIOTHREAD : WT_EXECUTEDEFAULT)); + if(!NT_SUCCESS(Status)) + { + SetLastErrorByStatus(Status); + return NULL; + } + + return Timer; +} + +/* EOF */ diff --git a/reactos/lib/ntdll/def/ntdll.def b/reactos/lib/ntdll/def/ntdll.def index ab3eb203f25..eabbc65de8a 100644 --- a/reactos/lib/ntdll/def/ntdll.def +++ b/reactos/lib/ntdll/def/ntdll.def @@ -1,4 +1,4 @@ -; $Id: ntdll.def,v 1.123 2004/07/03 17:13:09 hbirr Exp $ +; $Id: ntdll.def,v 1.124 2004/07/08 00:40:30 weiden Exp $ ; ; ReactOS Operating System ; @@ -354,6 +354,8 @@ RtlCreateProcessParameters@40 RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor@8 ;RtlCreateTagHeap +RtlCreateTimer@28 +RtlCreateTimerQueue@4 RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz@8 RtlCreateUserProcess@40 @@ -377,6 +379,9 @@ RtlDeleteRange@24 RtlDeleteRegistryValue@12 RtlDeleteResource@4 ;RtlDeleteSecurityObject +RtlDeleteTimer@12 +RtlDeleteTimerQueue@4 +RtlDeleteTimerQueueEx@8 RtlDestroyAtomTable@4 RtlDestroyEnvironment@4 RtlDestroyHandleTable@4 @@ -623,6 +628,7 @@ RtlUpcaseUnicodeStringToOemString@12 RtlUpcaseUnicodeToCustomCPN@24 RtlUpcaseUnicodeToMultiByteN@20 RtlUpcaseUnicodeToOemN@20 +RtlUpdateTimer@16 RtlUpperChar@4 RtlUpperString@8 ;RtlUsageHeap diff --git a/reactos/lib/ntdll/def/ntdll.edf b/reactos/lib/ntdll/def/ntdll.edf index a3cb299df88..ebfbc5a1778 100644 --- a/reactos/lib/ntdll/def/ntdll.edf +++ b/reactos/lib/ntdll/def/ntdll.edf @@ -1,4 +1,4 @@ -; $Id: ntdll.edf,v 1.113 2004/07/03 17:13:09 hbirr Exp $ +; $Id: ntdll.edf,v 1.114 2004/07/08 00:40:30 weiden Exp $ ; ; ReactOS Operating System ; @@ -354,6 +354,8 @@ RtlCreateProcessParameters=RtlCreateProcessParameters@40 RtlCreateRegistryKey=RtlCreateRegistryKey@8 RtlCreateSecurityDescriptor=RtlCreateSecurityDescriptor@8 ;RtlCreateTagHeap +RtlCreateTimer=RtlCreateTimer@28 +RtlCreateTimerQueue=RtlCreateTimerQueue@4 RtlCreateUnicodeString=RtlCreateUnicodeString@8 RtlCreateUnicodeStringFromAsciiz=RtlCreateUnicodeStringFromAsciiz@8 RtlCreateUserProcess=RtlCreateUserProcess@40 @@ -377,6 +379,9 @@ RtlDeleteRange=RtlDeleteRange@24 RtlDeleteRegistryValue=RtlDeleteRegistryValue@12 RtlDeleteResource=RtlDeleteResource@4 ;RtlDeleteSecurityObject +RtlDeleteTimer=RtlDeleteTimer@12 +RtlDeleteTimerQueue=RtlDeleteTimerQueue@4 +RtlDeleteTimerQueueEx=RtlDeleteTimerQueueEx@8 RtlDestroyAtomTable=RtlDestroyAtomTable@4 RtlDestroyEnvironment=RtlDestroyEnvironment@4 RtlDestroyHandleTable=RtlDestroyHandleTable@4 @@ -625,6 +630,7 @@ RtlUpcaseUnicodeStringToOemString=RtlUpcaseUnicodeStringToOemString@12 RtlUpcaseUnicodeToCustomCPN=RtlUpcaseUnicodeToCustomCPN@24 RtlUpcaseUnicodeToMultiByteN=RtlUpcaseUnicodeToMultiByteN@20 RtlUpcaseUnicodeToOemN=RtlUpcaseUnicodeToOemN@20 +RtlUpdateTimer=RtlUpdateTimer@16 RtlUpperChar=RtlUpperChar@4 RtlUpperString=RtlUpperString@8 ;RtlUsageHeap diff --git a/reactos/lib/ntdll/makefile b/reactos/lib/ntdll/makefile index e8d80ccb614..58585e0afd4 100644 --- a/reactos/lib/ntdll/makefile +++ b/reactos/lib/ntdll/makefile @@ -1,4 +1,4 @@ -# $Id: makefile,v 1.105 2004/07/03 17:40:23 navaraf Exp $ +# $Id: makefile,v 1.106 2004/07/08 00:40:31 weiden Exp $ PATH_TO_TOP = ../.. @@ -83,6 +83,7 @@ RTL_OBJECTS = \ rtl/resource.o \ rtl/teb.o \ rtl/thread.o \ + rtl/timerqueue.o \ rtl/libsupp.o STDIO_OBJECTS = \ diff --git a/reactos/lib/ntdll/rtl/timerqueue.c b/reactos/lib/ntdll/rtl/timerqueue.c new file mode 100644 index 00000000000..74875dc8c2b --- /dev/null +++ b/reactos/lib/ntdll/rtl/timerqueue.c @@ -0,0 +1,119 @@ +/* + * ReactOS kernel + * Copyright (C) 2004 ReactOS Team + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ +/* $Id: timerqueue.c,v 1.1 2004/07/08 00:40:31 weiden Exp $ + * + * COPYRIGHT: See COPYING in the top level directory + * PROJECT: ReactOS system libraries + * PURPOSE: Timer Queue implementation + * FILE: lib/ntdll/rtl/timerqueue.c + */ + +/* INCLUDES ****************************************************************/ + +#include + +#define NDEBUG +#include + +typedef VOID (CALLBACK *WAITORTIMERCALLBACKFUNC) (PVOID, BOOLEAN ); + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlCreateTimer(HANDLE TimerQueue, + PHANDLE phNewTimer, + WAITORTIMERCALLBACKFUNC Callback, + PVOID Parameter, + DWORD DueTime, + DWORD Period, + ULONG Flags) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlCreateTimerQueue(PHANDLE TimerQueue) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlDeleteTimer(HANDLE TimerQueue, + HANDLE Timer, + HANDLE CompletionEvent) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlDeleteTimerQueue(HANDLE TimerQueue) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlDeleteTimerQueueEx(HANDLE TimerQueue, + HANDLE CompletionEvent) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + + +/* + * @unimplemented + */ +NTSTATUS +STDCALL +RtlUpdateTimer(HANDLE TimerQueue, + HANDLE Timer, + ULONG DueTime, + ULONG Period) +{ + DPRINT1("RtlCreateTimer: stub\n"); + return STATUS_NOT_IMPLEMENTED; +} + +/* EOF */