diff --git a/dlls/kernel/sync.c b/dlls/kernel/sync.c index 90fd5b9e0eb..891b020d3b1 100644 --- a/dlls/kernel/sync.c +++ b/dlls/kernel/sync.c @@ -478,6 +478,197 @@ BOOL WINAPI ReleaseSemaphore( HANDLE handle, LONG count, LONG *previous ) } +/* + * Timers + */ + + +/*********************************************************************** + * CreateWaitableTimerA (KERNEL32.@) + */ +HANDLE WINAPI CreateWaitableTimerA( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCSTR name ) +{ + WCHAR buffer[MAX_PATH]; + + if (!name) return CreateWaitableTimerW( sa, manual, NULL ); + + if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) + { + SetLastError( ERROR_FILENAME_EXCED_RANGE ); + return 0; + } + return CreateWaitableTimerW( sa, manual, buffer ); +} + + +/*********************************************************************** + * CreateWaitableTimerW (KERNEL32.@) + */ +HANDLE WINAPI CreateWaitableTimerW( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCWSTR name ) +{ + HANDLE handle; + NTSTATUS status; + UNICODE_STRING us; + DWORD attr = 0; + OBJECT_ATTRIBUTES oa; + + if (name) RtlInitUnicodeString(&us, name); + if (sa && (sa->nLength >= sizeof(*sa)) && sa->bInheritHandle) + attr |= OBJ_INHERIT; + InitializeObjectAttributes(&oa, name ? &us : NULL, attr, + NULL /* FIXME */, NULL /* FIXME */); + status = NtCreateTimer(&handle, TIMER_ALL_ACCESS, &oa, + manual ? NotificationTimer : SynchronizationTimer); + + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError(status) ); + return 0; + } + return handle; +} + + +/*********************************************************************** + * OpenWaitableTimerA (KERNEL32.@) + */ +HANDLE WINAPI OpenWaitableTimerA( DWORD access, BOOL inherit, LPCSTR name ) +{ + WCHAR buffer[MAX_PATH]; + + if (!name) return OpenWaitableTimerW( access, inherit, NULL ); + + if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) + { + SetLastError( ERROR_FILENAME_EXCED_RANGE ); + return 0; + } + return OpenWaitableTimerW( access, inherit, buffer ); +} + + +/*********************************************************************** + * OpenWaitableTimerW (KERNEL32.@) + */ +HANDLE WINAPI OpenWaitableTimerW( DWORD access, BOOL inherit, LPCWSTR name ) +{ + NTSTATUS status; + ULONG attr = 0; + UNICODE_STRING us; + HANDLE handle; + OBJECT_ATTRIBUTES oa; + + if (inherit) attr |= OBJ_INHERIT; + + if (name) RtlInitUnicodeString(&us, name); + InitializeObjectAttributes(&oa, name ? &us : NULL, attr, NULL /* FIXME */, NULL /* FIXME */); + status = NtOpenTimer(&handle, access, &oa); + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError(status) ); + return 0; + } + return handle; +} + + +/*********************************************************************** + * SetWaitableTimer (KERNEL32.@) + */ +BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG period, + PTIMERAPCROUTINE callback, LPVOID arg, BOOL resume ) +{ + NTSTATUS status = NtSetTimer(handle, when, callback, arg, resume, period, NULL); + + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError(status) ); + if (status != STATUS_TIMER_RESUME_IGNORED) return FALSE; + } + return TRUE; +} + + +/*********************************************************************** + * CancelWaitableTimer (KERNEL32.@) + */ +BOOL WINAPI CancelWaitableTimer( HANDLE handle ) +{ + NTSTATUS status; + + status = NtCancelTimer(handle, NULL); + if (status != STATUS_SUCCESS) + { + SetLastError( RtlNtStatusToDosError(status) ); + return FALSE; + } + return TRUE; +} + + +/*********************************************************************** + * CreateTimerQueue (KERNEL32.@) + */ +HANDLE WINAPI CreateTimerQueue(void) +{ + FIXME("stub\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return NULL; +} + + +/*********************************************************************** + * DeleteTimerQueueEx (KERNEL32.@) + */ +BOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent) +{ + FIXME("(%p, %p): stub\n", TimerQueue, CompletionEvent); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return 0; +} + +/*********************************************************************** + * CreateTimerQueueTimer (KERNEL32.@) + * + * Creates a timer-queue timer. This timer expires at the specified due + * time (in ms), then after every specified period (in ms). When the timer + * expires, the callback function is called. + * + * RETURNS + * nonzero on success or zero on faillure + * + * BUGS + * Unimplemented + */ +BOOL WINAPI CreateTimerQueueTimer( PHANDLE phNewTimer, HANDLE TimerQueue, + WAITORTIMERCALLBACK Callback, PVOID Parameter, + DWORD DueTime, DWORD Period, ULONG Flags ) +{ + FIXME("stub\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return TRUE; +} + +/*********************************************************************** + * DeleteTimerQueueTimer (KERNEL32.@) + * + * Cancels a timer-queue timer. + * + * RETURNS + * nonzero on success or zero on faillure + * + * BUGS + * Unimplemented + */ +BOOL WINAPI DeleteTimerQueueTimer( HANDLE TimerQueue, HANDLE Timer, + HANDLE CompletionEvent ) +{ + FIXME("stub\n"); + SetLastError(ERROR_CALL_NOT_IMPLEMENTED); + return TRUE; +} + + /* * Pipes */ diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in index 563287614be..ba714dd76b2 100644 --- a/dlls/ntdll/Makefile.in +++ b/dlls/ntdll/Makefile.in @@ -59,7 +59,6 @@ C_SRCS = \ $(TOPOBJDIR)/scheduler/sysdeps.c \ $(TOPOBJDIR)/scheduler/syslevel.c \ $(TOPOBJDIR)/scheduler/thread.c \ - $(TOPOBJDIR)/scheduler/timer.c \ $(TOPOBJDIR)/win32/device.c \ $(TOPOBJDIR)/win32/except.c \ $(TOPOBJDIR)/win32/kernel32.c \ diff --git a/scheduler/timer.c b/scheduler/timer.c deleted file mode 100644 index a2d52ddd736..00000000000 --- a/scheduler/timer.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Win32 waitable timers - * - * Copyright 1999 Alexandre Julliard - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "config.h" -#include "wine/port.h" - -#include -#include - -#define NONAMELESSUNION -#define NONAMELESSSTRUCT -#include "winerror.h" -#include "winnls.h" -#include "wine/unicode.h" -#include "wine/server.h" -#include "wine/debug.h" -#include "ntdll_misc.h" - -WINE_DEFAULT_DEBUG_CHANNEL(timer); - - -/*********************************************************************** - * CreateWaitableTimerA (KERNEL32.@) - */ -HANDLE WINAPI CreateWaitableTimerA( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCSTR name ) -{ - WCHAR buffer[MAX_PATH]; - - if (!name) return CreateWaitableTimerW( sa, manual, NULL ); - - if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) - { - SetLastError( ERROR_FILENAME_EXCED_RANGE ); - return 0; - } - return CreateWaitableTimerW( sa, manual, buffer ); -} - - -/*********************************************************************** - * CreateWaitableTimerW (KERNEL32.@) - */ -HANDLE WINAPI CreateWaitableTimerW( SECURITY_ATTRIBUTES *sa, BOOL manual, LPCWSTR name ) -{ - HANDLE handle; - NTSTATUS status; - UNICODE_STRING us; - DWORD attr = 0; - OBJECT_ATTRIBUTES oa; - - if (name) RtlInitUnicodeString(&us, name); - if (sa && (sa->nLength >= sizeof(*sa)) && sa->bInheritHandle) - attr |= OBJ_INHERIT; - InitializeObjectAttributes(&oa, name ? &us : NULL, attr, - NULL /* FIXME */, NULL /* FIXME */); - status = NtCreateTimer(&handle, TIMER_ALL_ACCESS, &oa, - manual ? NotificationTimer : SynchronizationTimer); - - if (status != STATUS_SUCCESS) - { - SetLastError( RtlNtStatusToDosError(status) ); - return NULL; - } - return handle; -} - - -/*********************************************************************** - * OpenWaitableTimerA (KERNEL32.@) - */ -HANDLE WINAPI OpenWaitableTimerA( DWORD access, BOOL inherit, LPCSTR name ) -{ - WCHAR buffer[MAX_PATH]; - - if (!name) return OpenWaitableTimerW( access, inherit, NULL ); - - if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH )) - { - SetLastError( ERROR_FILENAME_EXCED_RANGE ); - return 0; - } - return OpenWaitableTimerW( access, inherit, buffer ); -} - - -/*********************************************************************** - * OpenWaitableTimerW (KERNEL32.@) - */ -HANDLE WINAPI OpenWaitableTimerW( DWORD access, BOOL inherit, LPCWSTR name ) -{ - NTSTATUS status; - ULONG attr = 0; - UNICODE_STRING us; - HANDLE handle; - OBJECT_ATTRIBUTES oa; - - if (inherit) attr |= OBJ_INHERIT; - - if (name) RtlInitUnicodeString(&us, name); - InitializeObjectAttributes(&oa, name ? &us : NULL, attr, NULL /* FIXME */, NULL /* FIXME */); - status = NtOpenTimer(&handle, access, &oa); - if (status != STATUS_SUCCESS) - { - SetLastError( RtlNtStatusToDosError(status) ); - return NULL; - } - return handle; -} - - -/*********************************************************************** - * SetWaitableTimer (KERNEL32.@) - */ -BOOL WINAPI SetWaitableTimer( HANDLE handle, const LARGE_INTEGER *when, LONG period, - PTIMERAPCROUTINE callback, LPVOID arg, BOOL resume ) -{ - NTSTATUS status; - - status = NtSetTimer(handle, when, callback, arg, resume, period, NULL); - if (status != STATUS_SUCCESS) - { - SetLastError( RtlNtStatusToDosError(status) ); - if (status != STATUS_TIMER_RESUME_IGNORED) return FALSE; - } - return TRUE; -} - - -/*********************************************************************** - * CancelWaitableTimer (KERNEL32.@) - */ -BOOL WINAPI CancelWaitableTimer( HANDLE handle ) -{ - NTSTATUS status; - - status = NtCancelTimer(handle, NULL); - if (status != STATUS_SUCCESS) - { - SetLastError( RtlNtStatusToDosError(status) ); - return FALSE; - } - return TRUE; -} - - -/*********************************************************************** - * CreateTimerQueue (KERNEL32.@) - */ -HANDLE WINAPI CreateTimerQueue(void) -{ - FIXME("stub\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return NULL; -} - - -/*********************************************************************** - * DeleteTimerQueueEx (KERNEL32.@) - */ -BOOL WINAPI DeleteTimerQueueEx(HANDLE TimerQueue, HANDLE CompletionEvent) -{ - FIXME("(%p, %p): stub\n", TimerQueue, CompletionEvent); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return 0; -} - -/*********************************************************************** - * CreateTimerQueueTimer (KERNEL32.@) - * - * Creates a timer-queue timer. This timer expires at the specified due - * time (in ms), then after every specified period (in ms). When the timer - * expires, the callback function is called. - * - * RETURNS - * nonzero on success or zero on faillure - * - * BUGS - * Unimplemented - */ -BOOL WINAPI CreateTimerQueueTimer( PHANDLE phNewTimer, HANDLE TimerQueue, - WAITORTIMERCALLBACK Callback, PVOID Parameter, - DWORD DueTime, DWORD Period, ULONG Flags ) -{ - FIXME("stub\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return TRUE; -} - -/*********************************************************************** - * DeleteTimerQueueTimer (KERNEL32.@) - * - * Cancels a timer-queue timer. - * - * RETURNS - * nonzero on success or zero on faillure - * - * BUGS - * Unimplemented - */ -BOOL WINAPI DeleteTimerQueueTimer( HANDLE TimerQueue, HANDLE Timer, - HANDLE CompletionEvent ) -{ - FIXME("stub\n"); - SetLastError(ERROR_CALL_NOT_IMPLEMENTED); - return TRUE; -}