29 #include "clntirp.tmh" 142 if (listEntry ==
NULL) {
182 ULONG activeIdleIoMax = 1;
187 &idlePrioritySupported);
190 if (idlePrioritySupported ==
FALSE) {
233 activeIdleIoMax =
max(activeIdleIoMax, 1);
283 mstotimer = (-10) * 1000;
292 FdoData->IdleInterval,
365 (
ULONGLONG)FdoData->LastNonIdleIoTime.QuadPart,
377 idleTime = FdoData->IdleInterval;
418 if (FdoData->ActiveIoCount > 0) {
419 if (CurrentTimeIn !=
NULL) {
420 *CurrentTimeIn =
NULL;
433 if (CurrentTimeIn !=
NULL) {
434 **CurrentTimeIn = CurrentTime;
437 if (idleInterval >= FdoData->IdleInterval) {
486 if (fdoExtension ==
NULL) {
491 fdoData = fdoExtension->PrivateFdoData;
507 pCurrentTime = ¤tTime;
549 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_TIMER,
"ClasspIdleTimerDpc: Starvation timer. Send one idle request\n"));
595 pCurrentTime = ¤tTime;
597 issueRequest =
FALSE;
605 issueRequest =
FALSE;
622 issueRequest =
FALSE;
729 TracePrint((
TRACE_LEVEL_INFORMATION, TRACE_FLAG_TIMER,
"ClasspCompleteIdleRequest: Service next idle reqeusts\n"));
FORCEINLINE ULONGLONG ClasspTimeDiffToMs(ULONGLONG TimeDiff)
#define CLASS_STARVATION_INTERVAL
_Must_inspect_result_ _In_ PWDF_DPC_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFDPC * Dpc
#define UNREFERENCED_PARAMETER(P)
VOID EnqueueDeferredClientIrp(PDEVICE_OBJECT Fdo, PIRP Irp)
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
FORCEINLINE LARGE_INTEGER ClasspGetCurrentTime(VOID)
#define InterlockedCompareExchange
BOOLEAN NTAPI KeSetTimerEx(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN LONG Period, IN PKDPC Dpc OPTIONAL)
#define InsertTailList(ListHead, Entry)
#define TRACE_LEVEL_INFORMATION
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
#define CLASS_IDLE_INTERVAL_MIN
NTSTATUS ClasspEnqueueIdleRequest(PDEVICE_OBJECT DeviceObject, PIRP Irp)
VOID ClasspStopIdleTimer(PCLASS_PRIVATE_FDO_DATA FdoData)
_In_ PDEVICE_OBJECT DeviceObject
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define CLASSP_REG_SUBKEY_NAME
PIRP ClasspDequeueIdleRequest(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
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)
LIST_ENTRY DeferredClientIrpList
_In_opt_ PVOID _In_opt_ PVOID SystemArgument1
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
#define CLASSP_REG_IDLE_INTERVAL_NAME
#define NT_SUCCESS(StatCode)
ULONGLONG ClasspGetIdleTime(IN PCLASS_PRIVATE_FDO_DATA FdoData, IN LARGE_INTEGER CurrentTime)
USHORT StarvationDuration
VOID ClasspInitializeIdleTimer(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
_Must_inspect_result_ _In_ WDFDEVICE Fdo
BOOLEAN IdlePrioritySupported
LOGICAL ClasspIdleDurationSufficient(IN PCLASS_PRIVATE_FDO_DATA FdoData, OUT LARGE_INTEGER **CurrentTimeIn)
NTSTATUS ServiceTransferRequest(PDEVICE_OBJECT Fdo, PIRP Irp, BOOLEAN PostToDpc)
VOID ClasspStartIdleTimer(IN PCLASS_PRIVATE_FDO_DATA FdoData)
_In_opt_ PVOID _In_opt_ PVOID _In_opt_ PVOID SystemArgument2
#define InitializeListHead(ListHead)
KDEFERRED_ROUTINE ClasspIdleTimerDpc
VOID ClasspCompleteIdleRequest(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension)
#define KeReleaseSpinLock(sl, irql)
struct tagContext Context
PIRP DequeueDeferredClientIrp(PDEVICE_OBJECT Fdo)
LARGE_INTEGER AntiStarvationStartTime
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
static SERVICE_STATUS status
VOID ClasspServiceIdleRequest(PFUNCTIONAL_DEVICE_EXTENSION FdoExtension, BOOLEAN PostToDpc)
#define CLASS_IDLE_INTERVAL
#define Int32x32To64(a, b)
#define CLASSP_REG_IDLE_PRIORITY_SUPPORTED
#define CLASSP_REG_IDLE_ACTIVE_MAX