diff --git a/dlls/kernel32/kernel32.spec b/dlls/kernel32/kernel32.spec index b48ea3b599f..882013c54f0 100644 --- a/dlls/kernel32/kernel32.spec +++ b/dlls/kernel32/kernel32.spec @@ -234,7 +234,7 @@ # @ stub CloseThreadpoolIo # @ stub CloseThreadpoolTimer # @ stub CloseThreadpoolWait -# @ stub CloseThreadpoolWork +@ stdcall CloseThreadpoolWork(ptr) ntdll.TpReleaseWork @ stdcall CmdBatNotification(long) @ stdcall CommConfigDialogA(str long ptr) @ stdcall CommConfigDialogW(wstr long ptr) @@ -336,7 +336,7 @@ # @ stub CreateThreadpoolIo # @ stub CreateThreadpoolTimer # @ stub CreateThreadpoolWait -# @ stub CreateThreadpoolWork +@ stdcall CreateThreadpoolWork(ptr ptr ptr) @ stdcall CreateTimerQueue () @ stdcall CreateTimerQueueTimer(ptr long ptr ptr long long long) @ stdcall CreateToolhelp32Snapshot(long long) @@ -1482,7 +1482,7 @@ # @ stub SortCloseHandle # @ stub SortGetHandle # @ stub StartThreadpoolIo -# @ stub SubmitThreadpoolWork +@ stdcall SubmitThreadpoolWork(ptr) ntdll.TpPostWork @ stdcall SuspendThread(long) @ stdcall SwitchToFiber(ptr) @ stdcall SwitchToThread() @@ -1573,7 +1573,7 @@ # @ stub WaitForThreadpoolIoCallbacks # @ stub WaitForThreadpoolTimerCallbacks # @ stub WaitForThreadpoolWaitCallbacks -# @ stub WaitForThreadpoolWorkCallbacks +@ stdcall WaitForThreadpoolWorkCallbacks(ptr long) ntdll.TpWaitForWork @ stdcall WaitNamedPipeA (str long) @ stdcall WaitNamedPipeW (wstr long) @ stdcall WakeAllConditionVariable(ptr) ntdll.RtlWakeAllConditionVariable diff --git a/dlls/kernel32/thread.c b/dlls/kernel32/thread.c index b2b9defb1e6..313295ccfaf 100644 --- a/dlls/kernel32/thread.c +++ b/dlls/kernel32/thread.c @@ -880,3 +880,24 @@ PTP_CLEANUP_GROUP WINAPI CreateThreadpoolCleanupGroup( void ) return group; } + +/*********************************************************************** + * CreateThreadpoolWork (KERNEL32.@) + */ +PTP_WORK WINAPI CreateThreadpoolWork( PTP_WORK_CALLBACK callback, PVOID userdata, + TP_CALLBACK_ENVIRON *environment ) +{ + TP_WORK *work; + NTSTATUS status; + + TRACE( "%p, %p, %p\n", callback, userdata, environment ); + + status = TpAllocWork( &work, callback, userdata, environment ); + if (status) + { + SetLastError( RtlNtStatusToDosError(status) ); + return NULL; + } + + return work; +} diff --git a/include/winternl.h b/include/winternl.h index c918e097405..ab8de5e0a01 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -2619,8 +2619,12 @@ NTSYSAPI NTSTATUS WINAPI RtlLargeIntegerToChar(const ULONGLONG *,ULONG,ULONG,PC /* Threadpool functions */ NTSYSAPI NTSTATUS WINAPI TpAllocCleanupGroup(TP_CLEANUP_GROUP **); +NTSYSAPI NTSTATUS WINAPI TpAllocWork(TP_WORK **,PTP_WORK_CALLBACK,PVOID,TP_CALLBACK_ENVIRON *); +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 TpReleaseWork(TP_WORK *); +NTSYSAPI void WINAPI TpWaitForWork(TP_WORK *,BOOL); /* Wine internal functions */