From: Sebastian Lackner Subject: [9/12] kernel32: Forward threadpool timer functions to ntdll. Message-Id: <5595D07B.2070605@fds-team.de> Date: Fri, 3 Jul 2015 01:59:55 +0200 --- dlls/kernel32/kernel32.spec | 10 +++++----- dlls/kernel32/thread.c | 40 ++++++++++++++++++++++++++++++++++++++++ include/winternl.h | 5 +++++ 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index 882013c..3d3a68b 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -232,7 +232,7 @@ @ stdcall CloseThreadpoolCleanupGroup(ptr) ntdll.TpReleaseCleanupGroup @ stdcall CloseThreadpoolCleanupGroupMembers(ptr long ptr) ntdll.TpReleaseCleanupGroupMembers # @ stub CloseThreadpoolIo -# @ stub CloseThreadpoolTimer +@ stdcall CloseThreadpoolTimer(ptr) ntdll.TpReleaseTimer # @ stub CloseThreadpoolWait @ stdcall CloseThreadpoolWork(ptr) ntdll.TpReleaseWork @ stdcall CmdBatNotification(long) @@ -334,7 +334,7 @@ # @ stub CreateThreadpool @ stdcall CreateThreadpoolCleanupGroup() # @ stub CreateThreadpoolIo -# @ stub CreateThreadpoolTimer +@ stdcall CreateThreadpoolTimer(ptr ptr ptr) # @ stub CreateThreadpoolWait @ stdcall CreateThreadpoolWork(ptr ptr ptr) @ stdcall CreateTimerQueue () @@ -981,7 +981,7 @@ @ stub -i386 IsSLCallback @ stdcall IsSystemResumeAutomatic() @ stdcall IsThreadAFiber() -# @ stub IsThreadpoolTimerSet +@ stdcall IsThreadpoolTimerSet(ptr) ntdll.TpIsTimerSet # @ stub IsTimeZoneRedirectionEnabled # @ stub IsValidCalDateTime @ stdcall IsValidCodePage(long) @@ -1456,7 +1456,7 @@ # @ stub SetThreadpoolStackInformation # @ stub SetThreadpoolThreadMaximum # @ stub SetThreadpoolThreadMinimum -# @ stub SetThreadpoolTimer +@ stdcall SetThreadpoolTimer(ptr ptr long long) # @ stub SetThreadpoolWait @ stdcall SetTimeZoneInformation(ptr) @ stub SetTimerQueueTimer @@ -1571,7 +1571,7 @@ @ stdcall WaitForSingleObject(long long) @ stdcall WaitForSingleObjectEx(long long long) # @ stub WaitForThreadpoolIoCallbacks -# @ stub WaitForThreadpoolTimerCallbacks +@ stdcall WaitForThreadpoolTimerCallbacks(ptr long) ntdll.TpWaitForTimer # @ stub WaitForThreadpoolWaitCallbacks @ stdcall WaitForThreadpoolWorkCallbacks(ptr long) ntdll.TpWaitForWork @ stdcall WaitNamedPipeA (str long) diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c index 313295c..1ca0945 100644 --- a/dlls/kernel32/thread.c +++ b/dlls/kernel32/thread.c @@ -882,6 +882,27 @@ PTP_CLEANUP_GROUP WINAPI CreateThreadpoolCleanupGroup( void ) } /*********************************************************************** + * CreateThreadpoolTimer (KERNEL32.@) + */ +PTP_TIMER WINAPI CreateThreadpoolTimer( PTP_TIMER_CALLBACK callback, PVOID userdata, + TP_CALLBACK_ENVIRON *environment ) +{ + TP_TIMER *timer; + NTSTATUS status; + + TRACE( "%p, %p, %p\n", callback, userdata, environment ); + + status = TpAllocTimer( &timer, callback, userdata, environment ); + if (status) + { + SetLastError( RtlNtStatusToDosError(status) ); + return NULL; + } + + return timer; +} + +/*********************************************************************** * CreateThreadpoolWork (KERNEL32.@) */ PTP_WORK WINAPI CreateThreadpoolWork( PTP_WORK_CALLBACK callback, PVOID userdata, @@ -901,3 +922,22 @@ PTP_WORK WINAPI CreateThreadpoolWork( PTP_WORK_CALLBACK callback, PVOID userdata return work; } + +/*********************************************************************** + * SetThreadpoolTimer (KERNEL32.@) + */ +VOID WINAPI SetThreadpoolTimer( TP_TIMER *timer, FILETIME *due_time, + DWORD period, DWORD window_length ) +{ + LARGE_INTEGER timeout; + + TRACE( "%p, %p, %u, %u\n", timer, due_time, period, window_length ); + + if (due_time) + { + timeout.u.LowPart = due_time->dwLowDateTime; + timeout.u.HighPart = due_time->dwHighDateTime; + } + + TpSetTimer( timer, due_time ? &timeout : NULL, period, window_length ); +} diff --git a/include/winternl.h b/include/winternl.h index ab8de5e..ab64a71 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2619,11 +2619,16 @@ NTSYSAPI NTSTATUS WINAPI RtlLargeIntegerToChar(const ULONGLONG *,ULONG,ULONG,PC /* Threadpool functions */ NTSYSAPI NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **); +NTSYSAPI NTSTATUS WINAPI TpAllocTimer(TP_TIMER **,PTP_TIMER_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); NTSYSAPI NTSTATUS WINAPI TpAllocWork(TP_WORK **,PTP_WORK_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); +NTSYSAPI BOOL WINAPI TpIsTimerSet(TP_TIMER *); NTSYSAPI void WINAPI TpPostWork(TP_WORK *); NTSYSAPI void WINAPI TpReleaseCleanupGroup(TP_CLEANUP_GROUP *); NTSYSAPI void WINAPI TpReleaseCleanupGroupMembers(TP_CLEANUP_GROUP *,BOOL,PVOID); +NTSYSAPI void WINAPI TpReleaseTimer(TP_TIMER *); NTSYSAPI void WINAPI TpReleaseWork(TP_WORK *); +NTSYSAPI void WINAPI TpSetTimer(TP_TIMER *, LARGE_INTEGER *,LONG,LONG); +NTSYSAPI void WINAPI TpWaitForTimer(TP_TIMER *,BOOL); NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *,BOOL); /* Wine internal functions */ -- 2.4.4