18 #define EX_HYPERCRITICAL_WORK_THREADS 1 19 #define EX_DELAYED_WORK_THREADS 3 20 #define EX_CRITICAL_WORK_THREADS 5 23 #define EX_DYNAMIC_WORK_THREAD 0x80000000 26 #define EX_HYPERCRITICAL_QUEUE_PRIORITY_INCREMENT 7 27 #define EX_CRITICAL_QUEUE_PRIORITY_INCREMENT 5 28 #define EX_DELAYED_QUEUE_PRIORITY_INCREMENT 4 164 DPRINT1(
"Warning: Broken Worker Thread: %p %p %p came back " 165 "with APCs disabled!\n",
200 if (
WorkQueue->Info.QueueDisabled)
goto ProcessLoop;
208 NewValue.WorkerCount--;
343 if ((
Queue->QueueDepthLastPass) &&
344 (
Queue->WorkItemsProcessed ==
Queue->WorkItemsProcessedLastPass) &&
345 (
Queue->DynamicThreadCount < 16))
348 DPRINT1(
"EX: Work Queue Deadlock detected: %lu\n",
i);
350 DPRINT1(
"Dynamic threads queued %d\n",
Queue->DynamicThreadCount);
354 Queue->WorkItemsProcessedLastPass =
Queue->WorkItemsProcessed;
387 if ((
Queue->Info.MakeThreadsAsNecessary) &&
389 (
Queue->WorkerQueue.CurrentCount <
390 Queue->WorkerQueue.MaximumCount) &&
391 (
Queue->DynamicThreadCount < 16))
394 DPRINT1(
"EX: Creating new dynamic thread as requested\n");
438 WaitEvents[0] = &
Timer;
518 ULONG CriticalThreads, DelayedThreads;
560 for (
i = 0;
i < CriticalThreads;
i++)
568 for (
i = 0;
i < DelayedThreads;
i++)
615 AllowSwap = (
PBOOLEAN)NormalContext;
650 if (
Thread == CurrentThread)
740 if ((
WorkQueue->Info.MakeThreadsAsNecessary) &&
747 DPRINT1(
"Requesting a new thread. CurrentCount: %lu. MaxCount: %lu\n",
#define KeGetCurrentIrql()
VOID NTAPI KeInitializeApc(IN PKAPC Apc, IN PKTHREAD Thread, IN KAPC_ENVIRONMENT TargetEnvironment, IN PKKERNEL_ROUTINE KernelRoutine, IN PKRUNDOWN_ROUTINE RundownRoutine OPTIONAL, IN PKNORMAL_ROUTINE NormalRoutine, IN KPROCESSOR_MODE Mode, IN PVOID Context)
#define EX_DYNAMIC_WORK_THREAD
#define THREAD_ALL_ACCESS
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
VOID NTAPI ExSwapinWorkerThreads(IN BOOLEAN AllowSwap)
VOID NTAPI ExpCreateWorkerThread(WORK_QUEUE_TYPE WorkQueueType, IN BOOLEAN Dynamic)
#define PsGetCurrentThread()
#define UNREFERENCED_PARAMETER(P)
KEVENT ExpThreadSetManagerShutdownEvent
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
#define THREAD_SET_INFORMATION
#define InterlockedCompareExchange
LONG NTAPI KeSetBasePriorityThread(IN PKTHREAD Thread, IN LONG Increment)
PETHREAD ExpWorkerThreadBalanceManagerPtr
VOID NTAPI ExpWorkerThreadEntryPoint(IN PVOID Context)
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
PEPROCESS PsInitialSystemProcess
VOID NTAPI ExpDetectWorkerThreadDeadlock(VOID)
#define EX_CRITICAL_WORK_THREADS
_In_ PVOID _In_ ULONG Event
LONG NTAPI KeReadStateQueue(IN PKQUEUE Queue)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
VOID NTAPI ExpInitializeWorkerThreads(VOID)
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)
PETHREAD ExpLastWorkerThread
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
WORK_QUEUE_ITEM ExpDebuggerWorkItem
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
#define ExInitializeWorkItem(Item, Routine, Context)
VOID NTAPI ExpSetSwappingKernelApc(IN PKAPC Apc, OUT PKNORMAL_ROUTINE *NormalRoutine, IN OUT PVOID *NormalContext, IN OUT PVOID *SystemArgument1, IN OUT PVOID *SystemArgument2)
LIST_ENTRY ExpWorkerListHead
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
#define ObDereferenceObject
_In_opt_ PFILE_OBJECT _In_opt_ PETHREAD Thread
NTSTATUS NTAPI KeWaitForMultipleObjects(IN ULONG Count, IN PVOID Object[], IN WAIT_TYPE WaitType, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL, OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL)
ULONG ActiveImpersonationInfo
PETHREAD NTAPI PsGetNextProcessThread(IN PEPROCESS Process, IN PETHREAD Thread OPTIONAL)
enum _WORK_QUEUE_TYPE WORK_QUEUE_TYPE
_In_ WDFINTERRUPT _In_ WDF_INTERRUPT_POLICY _In_ WDF_INTERRUPT_PRIORITY Priority
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
POBJECT_TYPE PsThreadType
#define InterlockedDecrement
PLIST_ENTRY NTAPI KeRemoveQueue(IN PKQUEUE Queue, IN KPROCESSOR_MODE WaitMode, IN PLARGE_INTEGER Timeout OPTIONAL)
_Must_inspect_result_ _In_ WDFCMRESLIST List
#define EX_HYPERCRITICAL_QUEUE_PRIORITY_INCREMENT
VOID NTAPI ExpCheckDynamicThreadCount(VOID)
#define EX_DELAYED_QUEUE_PRIORITY_INCREMENT
_Must_inspect_result_ _In_ PWDF_TIMER_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFTIMER * Timer
KEVENT ExpThreadSetManagerEvent
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
FAST_MUTEX ExpWorkerSwapinMutex
VOID NTAPI ExpDebuggerWorker(IN PVOID Context)
#define EX_CRITICAL_QUEUE_PRIORITY_INCREMENT
#define KeInitializeEvent(pEvt, foo, foo2)
#define InterlockedIncrement
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
EX_WORK_QUEUE ExWorkerQueue[MaximumWorkQueue]
#define EX_DELAYED_WORK_THREADS
#define InitializeListHead(ListHead)
LONG NTAPI KeInsertQueue(IN PKQUEUE Queue, IN PLIST_ENTRY Entry)
NTSTATUS NTAPI PsTerminateSystemThread(IN NTSTATUS ExitStatus)
NTSTATUS NTAPI PsCreateSystemThread(OUT PHANDLE ThreadHandle, IN ACCESS_MASK DesiredAccess, IN POBJECT_ATTRIBUTES ObjectAttributes, IN HANDLE ProcessHandle, IN PCLIENT_ID ClientId, IN PKSTART_ROUTINE StartRoutine, IN PVOID StartContext)
ULONG ExDelayedWorkerThreads
BOOLEAN NTAPI KeInsertQueueApc(IN PKAPC Apc, IN PVOID SystemArgument1, IN PVOID SystemArgument2, IN KPRIORITY PriorityBoost)
ULONG MakeThreadsAsNecessary
VOID NTAPI KeInitializeQueue(IN PKQUEUE Queue, IN ULONG Count OPTIONAL)
ULONG ExpAdditionalCriticalWorkerThreads
_Must_inspect_result_ _In_ PLARGE_INTEGER _In_ PLARGE_INTEGER _In_ ULONG _In_ PFILE_OBJECT _In_ PVOID Process
struct tagContext Context
WINKD_WORKER_STATE ExpDebuggerWork
ULONG ExCriticalWorkerThreads
#define RtlZeroMemory(Destination, Length)
BOOLEAN ExpWorkersCanSwap
ULONG ExWorkerCanWaitUser
VOID(NTAPI * PKNORMAL_ROUTINE)(IN PVOID NormalContext OPTIONAL, IN PVOID SystemArgument1 OPTIONAL, IN PVOID SystemArgument2 OPTIONAL)
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
#define KeGetCurrentThread
VOID NTAPI KeClearEvent(IN PKEVENT Event)
EX_QUEUE_WORKER_INFO Info
ULONG ExpAdditionalDelayedWorkerThreads
#define Int32x32To64(a, b)
VOID NTAPI KeBugCheckEx(_In_ ULONG BugCheckCode, _In_ ULONG_PTR BugCheckParameter1, _In_ ULONG_PTR BugCheckParameter2, _In_ ULONG_PTR BugCheckParameter3, _In_ ULONG_PTR BugCheckParameter4)
VOID NTAPI ExpWorkerThreadBalanceManager(IN PVOID Context)
_Must_inspect_result_ _In_ PFLT_CALLBACK_DATA _In_ PFLT_DEFERRED_IO_WORKITEM_ROUTINE _In_ WORK_QUEUE_TYPE QueueType
#define STATUS_SYSTEM_SHUTDOWN
BOOLEAN NTAPI KeSetKernelStackSwapEnable(IN BOOLEAN Enable)