mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-29 19:26:33 +00:00
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:
@@ -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 */
|
||||
/* ----------------------------------------------- */
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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
|
||||
*/
|
||||
|
||||
@@ -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 */
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 = \
|
||||
|
||||
@@ -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 */
|
||||
Reference in New Issue
Block a user