48 #define MAX_WORKERTHREADS 0x100 49 #define WORKERTHREAD_CREATION_THRESHOLD 0x5 78 #define IsThreadPoolInitialized() (*((volatile LONG*)&ThreadPoolInitialized) == 1) 128 else if (InitStatus == 2)
140 }
while (InitStatus != 1);
169 volatile LONG WorkerInitialized = 0;
180 while (WorkerInitialized == 0)
223 DPRINT(
"RtlpExecuteWorkItem: Function: 0x%p Context: 0x%p ImpersonationToken: 0x%p\n",
WorkItem.Function,
WorkItem.Context,
WorkItem.TokenHandle);
243 DPRINT1(
"Failed to revert worker thread to self!!! Status: 0x%x\n",
Status);
340 DPRINT(
"RtlpExecuteIoWorkItem: Function: 0x%p Context: 0x%p ImpersonationToken: 0x%p\n",
WorkItem.Function,
WorkItem.Context,
WorkItem.TokenHandle);
360 DPRINT1(
"Failed to revert worker thread to self!!! Status: 0x%x\n",
Status);
412 CurrentEntry = CurrentEntry->
Flink;
425 DPRINT1(
"Failed to find a worker thread for the persistent IO thread!\n");
451 CurrentEntry = CurrentEntry->
Flink;
459 DPRINT1(
"Failed to find a worker thread for the work item 0x%p!\n",
WorkItem);
504 DPRINT1(
"Failed to queue APC for work item 0x%p\n",
WorkItem->Function);
524 if (ThreadHandle ==
NULL)
538 CreatedHandle =
TRUE;
584 DPRINT1(
"Failed to create handle to own thread! Status: 0x%x\n",
Status);
632 Timeout.QuadPart = -0x7FFFFFFFFFFFFFFF
LL;
666 DPRINT1(
"Failed to acquire the thread pool lock!!! Status: 0x%x\n",
Status);
684 ULONG TimeoutCount = 0;
743 if (TimeoutCount++ > 2 &&
815 DPRINT1(
"Failed to get impersonation token! Status: 0x%x\n",
Status);
935 sizeof(FileCompletionInfo),
#define MAX_WORKERTHREADS
static NTSTATUS RtlpGetImpersonationToken(OUT PHANDLE TokenHandle)
VOID(* PIO_APC_ROUTINE)(IN PVOID ApcContext, IN PIO_STATUS_BLOCK IoStatusBlock, IN ULONG Reserved)
#define IO_COMPLETION_ALL_ACCESS
NTSTATUS NTAPI NtSetInformationFile(HANDLE hFile, PIO_STATUS_BLOCK io, PVOID ptr, ULONG len, FILE_INFORMATION_CLASS FileInformationClass)
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
_In_ CDROM_SCAN_FOR_SPECIAL_INFO _In_ PCDROM_SCAN_FOR_SPECIAL_HANDLER Function
#define WT_EXECUTEINUITHREAD
_In_ ULONG _In_opt_ POBJECT_ATTRIBUTES _In_opt_ HANDLE _Out_opt_ PCLIENT_ID _In_ PKSTART_ROUTINE StartRoutine
NTSTATUS NTAPI RtlSetThreadPoolStartFunc(IN PRTL_START_POOL_THREAD StartPoolThread, IN PRTL_EXIT_POOL_THREAD ExitPoolThread)
FORCEINLINE VOID InsertHeadList(_Inout_ PLIST_ENTRY ListHead, _Inout_ __drv_aliasesMem PLIST_ENTRY Entry)
_In_ WDFDPC _In_ BOOLEAN Wait
NTSTATUS RtlpInitializeTimerThread(VOID)
#define STATUS_CANT_OPEN_ANONYMOUS
BOOLEAN NTAPI RtlFreeHeap(IN PVOID HeapHandle, IN ULONG Flags, IN PVOID HeapBase)
#define NtCurrentThread()
struct _RTLP_WORKITEM * PRTLP_WORKITEM
#define WT_EXECUTEINIOTHREAD
static LONG ThreadPoolWorkerThreadsLongRequests
NTSYSAPI NTSTATUS NTAPI RtlEnterCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define InterlockedCompareExchange
struct _ThreadInfo ThreadInfo
#define TOKEN_IMPERSONATE
#define WT_TRANSFER_IMPERSONATION
struct _RTLP_IOWORKERTHREAD * PRTLP_IOWORKERTHREAD
#define InsertTailList(ListHead, Entry)
NTSTATUS NTAPI NtQueueApcThread(IN HANDLE ThreadHandle, IN PKNORMAL_ROUTINE ApcRoutine, IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define WT_EXECUTEINPERSISTENTTHREAD
ULONG(NTAPI * PTHREAD_START_ROUTINE)(PVOID Parameter)
static NTSTATUS RtlpQueueIoWorkerThread(IN OUT PRTLP_WORKITEM WorkItem)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
static LONG ThreadPoolIOWorkerThreads
struct _RTLP_IOWORKERTHREAD RTLP_IOWORKERTHREAD
#define DUPLICATE_SAME_ACCESS
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
NTSYSAPI NTSTATUS NTAPI RtlLeaveCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define WORKERTHREAD_CREATION_THRESHOLD
#define IsThreadPoolInitialized()
#define EXCEPTION_EXECUTE_HANDLER
_In_ ACCESS_MASK _In_ ULONG _Out_ PHANDLE TokenHandle
NTSTATUS NTAPI NtSetInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
NTSTATUS NTAPI NtDelayExecution(IN BOOLEAN Alertable, IN PLARGE_INTEGER DelayInterval)
#define NtCurrentProcess()
PVOID NTAPI RtlAllocateHeap(IN PVOID HeapHandle, IN ULONG Flags, IN SIZE_T Size)
NTSTATUS NTAPI RtlSetIoCompletionCallback(IN HANDLE FileHandle, IN PIO_APC_ROUTINE Callback, IN ULONG Flags)
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
struct _LIST_ENTRY * Flink
#define WT_EXECUTELONGFUNCTION
NTSTATUS NtTerminateThread(IN HANDLE ThreadHandle OPTIONAL, IN NTSTATUS ExitStatus)
NTSTATUS NTAPI NtResumeThread(IN HANDLE ThreadHandle, OUT PULONG SuspendCount OPTIONAL)
_Must_inspect_result_ _In_ ULONG Flags
static LIST_ENTRY ThreadPoolIOWorkerThreadsList
NTSYSAPI NTSTATUS NTAPI RtlInitializeCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
#define NT_SUCCESS(StatCode)
NTSTATUS NTAPI RtlpStartThread(IN PTHREAD_START_ROUTINE Function, IN PVOID Parameter, OUT PHANDLE ThreadHandle)
#define WT_EXECUTEINPERSISTENTIOTHREAD
static LONG ThreadPoolWorkerThreadsRequests
static VOID NTAPI RtlpExecuteIoWorkItem(IN OUT PVOID NormalContext, IN OUT PVOID SystemArgument1, IN OUT PVOID SystemArgument2)
static ULONG NTAPI RtlpIoWorkerThreadProc(IN PVOID Parameter)
NTSTATUS NTAPI NtSetIoCompletion(IN HANDLE IoCompletionPortHandle, IN PVOID CompletionKey, IN PVOID CompletionContext, IN NTSTATUS CompletionStatus, IN ULONG CompletionInformation)
NTSTATUS NTAPI RtlpExitThread(IN NTSTATUS ExitStatus)
NTSTATUS NTAPI NtQueryInformationThread(IN HANDLE ThreadHandle, IN THREADINFOCLASS ThreadInformationClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, OUT PULONG ReturnLength OPTIONAL)
NTSTATUS NTAPI NtClose(IN HANDLE Handle)
_In_opt_ HANDLE _In_opt_ PIO_APC_ROUTINE ApcRoutine
static LONG ThreadPoolIOWorkerThreadsRequests
static PRTLP_IOWORKERTHREAD PersistentIoThread
static NTSTATUS RtlpStartWorkerThread(PTHREAD_START_ROUTINE StartRoutine)
#define InterlockedDecrement
NTSTATUS NTAPI RtlQueueWorkItem(IN WORKERCALLBACKFUNC Function, IN PVOID Context OPTIONAL, IN ULONG Flags)
NTSYSAPI NTSTATUS NTAPI RtlCreateUserThread(_In_ PVOID ThreadContext, _Out_ HANDLE *OutThreadHandle, _Reserved_ PVOID Reserved1, _Reserved_ PVOID Reserved2, _Reserved_ PVOID Reserved3, _Reserved_ PVOID Reserved4, _Reserved_ PVOID Reserved5, _Reserved_ PVOID Reserved6, _Reserved_ PVOID Reserved7, _Reserved_ PVOID Reserved8)
static const WCHAR Cleanup[]
static LONG ThreadPoolWorkerThreads
#define InterlockedExchange
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
_In_ WDFINTERRUPT _In_ PFN_WDF_INTERRUPT_SYNCHRONIZE Callback
struct _RTLP_WORKITEM RTLP_WORKITEM
#define InterlockedIncrement
PRTL_EXIT_POOL_THREAD RtlpExitThreadFunc
static NTSTATUS RtlpQueueWorkerThread(IN OUT PRTLP_WORKITEM WorkItem)
PRTL_START_POOL_THREAD RtlpStartThreadFunc
#define InitializeListHead(ListHead)
static NTSTATUS RtlpInitializeThreadPool(VOID)
static OUT PIO_STATUS_BLOCK IoStatusBlock
static LONG ThreadPoolIOWorkerThreadsLongRequests
NTSTATUS NTAPI NtRemoveIoCompletion(IN HANDLE IoCompletionHandle, OUT PVOID *KeyContext, OUT PVOID *ApcContext, OUT PIO_STATUS_BLOCK IoStatusBlock, IN PLARGE_INTEGER Timeout OPTIONAL)
NTSTATUS NTAPI NtOpenThreadToken(IN HANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN BOOLEAN OpenAsSelf, OUT PHANDLE TokenHandle)
VOID(NTAPI * WORKERCALLBACKFUNC)(_In_ PVOID Context)
struct tagContext Context
NTSTATUS NTAPI NtDuplicateObject(IN HANDLE SourceProcessHandle, IN HANDLE SourceHandle, IN HANDLE TargetProcessHandle OPTIONAL, OUT PHANDLE TargetHandle OPTIONAL, IN ACCESS_MASK DesiredAccess, IN ULONG HandleAttributes, IN ULONG Options)
NTSTATUS NTAPI NtCreateIoCompletion(OUT PHANDLE IoCompletionHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN ULONG NumberOfConcurrentThreads)
static BOOLEAN RtlpIsIoPending(IN HANDLE ThreadHandle OPTIONAL)
static LONG ThreadPoolInitialized
static HANDLE ThreadPoolCompletionPort
#define _SEH2_EXCEPT(...)
#define _SEH2_GetExceptionCode()
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
WORKERCALLBACKFUNC Function
static RTL_CRITICAL_SECTION ThreadPoolLock
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
NTSYSAPI NTSTATUS NTAPI RtlDeleteCriticalSection(_In_ PRTL_CRITICAL_SECTION CriticalSection)
static VOID NTAPI RtlpExecuteWorkItem(IN OUT PVOID NormalContext, IN OUT PVOID SystemArgument1, IN OUT PVOID SystemArgument2)
NTSTATUS(NTAPI * PRTL_EXIT_POOL_THREAD)(_In_ NTSTATUS ExitStatus)
static ULONG NTAPI RtlpWorkerThreadProc(IN PVOID Parameter)
NTSTATUS(NTAPI * PRTL_START_POOL_THREAD)(_In_ PTHREAD_START_ROUTINE Function, _In_ PVOID Parameter, _Out_ PHANDLE ThreadHandle)
PULONG MinorVersion OPTIONAL