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
This commit is contained in:
Thomas Bluemel
2004-07-08 00:40:31 +00:00
parent 8d126dbfc4
commit 580f2e7a68
10 changed files with 547 additions and 153 deletions
+2 -2
View File
@@ -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 */
/* ----------------------------------------------- */
-23
View File
@@ -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
+30 -1
View File
@@ -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
+2 -2
View File
@@ -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 \
+1 -122
View File
@@ -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
*/
+377
View File
@@ -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 <w3seek@reactos.com>
*/
/* INCLUDES ******************************************************************/
#include <k32.h>
#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 */
+7 -1
View File
@@ -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
+7 -1
View File
@@ -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
+2 -1
View File
@@ -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 = \
+119
View File
@@ -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 <ddk/ntddk.h>
#define NDEBUG
#include <ntdll/ntdll.h>
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 */