24#include "../fxtargetsshared.hpp"
27#if defined(EVENT_TRACING)
28#include "FxIoTarget.tmh"
119 "WDFIOTARGET %p, setting Dispose event %p",
128#if (FX_CORE_MODE==FX_CORE_USER_MODE)
141 "WDFIOTARGET %p, Waiting on Dispose event %p",
145 event->EnterCRAndWaitAndLeave();
218 "Sending Pended WDFREQUEST %p, Irp %p",
219 Request->GetTraceObjectHandle(),
232 "Completing Pended WDFREQUEST %p, Irp %p, %!STATUS!",
297 "WDFIOTARGET %p started status %!STATUS!",
302#define START_TAG ((PVOID) ('trtS'))
319 FxIoTarget::Lock(&
irql);
332 "WDFIOTARGET %p is being started while it is being stopped or "
333 "purged by another thread. WdfIoTargetStart and "
334 "WdfIoTargetStop/WdfIoTargetPurge must be called synchronously. "
335 "After the driver calls one of these functions, it must not call "
336 "the other function before the first one returns.",
362 FxIoTarget::Lock(&
irql);
439 if (RequestWillBeResent) {
464 if (
FALSE == enqueue) {
483 "WDFIOTARGET %p, WDFREQUEST %p is being canceled on another thread,"
484 " allowing other thread to complete request, not resending",
568 while (RequestListHead->Next !=
NULL) {
597 for (
ple = SendList->Blink;
ple != SendList;
ple =
ple->Blink) {
638 BOOLEAN getSentList, wait, added;
670 "WDFIOTARGET %p stopped, but it is currently in the "
671 "%!WDF_IO_TARGET_STATE! state, not started or stopped",
694 "WDFIOTARGET %p is already in the process of being stopped "
695 "or purged from another thread. Driver must wait for the "
696 "first WdfIoTargetStop or WdfIoTargetPurge to complete "
697 "before calling it again.",
843 "WDFIOTARGET %p purged, but it is currently in the "
844 "%!WDF_IO_TARGET_STATE! state, not started, stopped or purged",
861 if (added ==
FALSE) {
873 "WDFIOTARGET %p is already in the process of being purged "
874 "or stopped from another thread. Driver must wait for the "
875 "first WdfIoTargetPurge or WdfIoTargetStop to complete "
876 "before calling it again.",
973 BOOLEAN sentAdded, ignoredAdded;
984 "WDFIOTARGET %p is being deleted while it is being stopped/purged "
985 "by another thread. Driver must wait for WdfIoTargetStop or "
986 "WdfIoTargetPurge to complete before deleting the object.",
1028 if (sentAdded || ignoredAdded) {
1144#if (FX_CORE_MODE == FX_CORE_KERNEL_MODE)
1149 "Init WDFIOTARGET %p, unexpected NULL, m_InStackDevice %p, "
1150 "m_TargetDevice %p, m_TargetPdo %p, m_Driver %p",
1160 "Init WDFIOTARGET %p, unexpected NULL, m_InStackDevice %p, "
1206 "WDFREQUEST %p has not been formatted, cannot send, %!STATUS!",
1216 "WDFREQUEST %p is already pending on a WDFIOTARGET",
1217 Request->GetTraceObjectHandle());
1233 "WDFREQUEST %p, PIRP %p does not have enough stack locations %d"
1234 " for this WDFIOTARGET %p (requires %d locations), %!STATUS!",
1296 stateIgnored =
FALSE;
1304 if (
Request->m_IrpCompletionReferenceCount != 0) {
1307 "WDFREQUEST %p already sent to a target",
1308 Request->GetTraceObjectHandle());
1349 "WDFREQUEST %p, could not create timer, %!STATUS!",
1376 "WDFIOTARGET %p state %!WDF_IO_TARGET_STATE!, sending "
1377 "WDFREQUEST %p cannot ignore current state, %!STATUS!",
1388 "ignoring WDFIOTARGET %p state, sending WDFREQUEST %p, state "
1389 "%!WDF_IO_TARGET_STATE!",
1395 stateIgnored =
TRUE;
1423 "failing WDFREQUEST %p, WDFIOTARGET %p not accepting requests, "
1424 "state %!WDF_IO_TARGET_STATE!",
Request->GetTraceObjectHandle(),
1482 Request->m_IrpCompletionReferenceCount = 1;
1557 "Pending WDFREQUEST %p, WDFIOTARGET %p is paused, %!STATUS!",
1601 "Starting timer on WDFREQUEST %p",
1602 Request->GetTraceObjectHandle());
1669 "WDFIOTARGET %p, WDFREQUEST %p",
1672#if (FX_CORE_MODE == FX_CORE_USER_MODE)
1681 "Failed to initialize sync event for "
1682 "WDFIOTARGET %p, WDFREQUEST %p",
1691 clearContext =
Request->ShouldClearContext();
1718 params.OrigTargetCompletionContext =
Request->m_TargetCompletionContext;
1719 params.OrigTargetCompletionRoutine =
1720 Request->m_CompletionRoutine.m_Completion;
1744 "WDFREQUEST %p, Action 0x%x",
Request->GetTraceObjectHandle(),
1759 "Sending WDFREQUEST %p, Irp %p",
Request->GetTraceObjectHandle(),
1829 Request->m_TargetCompletionContext =
params.OrigTargetCompletionContext;
1830 Request->m_CompletionRoutine.m_Completion =
1831 params.OrigTargetCompletionRoutine;
1853 params.SynchEvent.EnterCRAndWaitAndLeave();
1870 Request->ContextReleaseAndRestore();
1949 Request->GetTraceObjectHandle());
2080 BOOLEAN completeRequest, setStopEvent;
2081 LONG completionRefCount;
2083 completeRequest =
FALSE;
2084 setStopEvent =
FALSE;
2088 Request->GetTraceObjectHandle());
2104 completeRequest =
Request->CanComplete();
2120 &
Request->m_IrpCompletionReferenceCount);
2121 ASSERT(completionRefCount != 0);
2133 completeRequest =
Request->CanComplete();
2139 if (completeRequest) {
2160 if (completeRequest) {
2163 "WDFREQUEST %p completed in timer callback",
2164 Request->GetTraceObjectHandle());
2171 "WDFIOTARGET %p, setting stop event %p in timer callback",
2177 if (completeRequest) {
2210 "WDFREQUEST %p completed in from cancel",
2211 Request->GetTraceObjectHandle());
2216 "WDFIOTARGET %p, setting stop event %p",
2248 "WDFREQUEST %p",
Request->GetTraceObjectHandle());
2250 setStopEvent =
FALSE;
2289 "WDFREQUEST %p completed in completion routine",
2290 Request->GetTraceObjectHandle());
2295 "WDFIOTARGET %p, setting stop event %p",
2324 BOOLEAN completeRequest, setStopEvent;
2327 "WDFREQUEST %p",
Request->GetTraceObjectHandle());
2330 setStopEvent =
FALSE;
2331 completeRequest =
FALSE;
2354 completeRequest =
Request->CanComplete();
2357 if (completeRequest) {
2378 "WDFREQUEST %p deferring completion due to outstanding completion "
2379 "references",
Request->GetTraceObjectHandle());
2384 if (completeRequest) {
2386 "WDFREQUEST %p completed in completion routine",
2387 Request->GetTraceObjectHandle());
2393 "WDFIOTARGET %p, setting stop event %p",
2398 if (completeRequest) {
2477 if (pContext ==
NULL) {
2480 "Could not allocate context for request");
2485 Request->SetContext(pContext);
2516 "Could not retrieve buffer %d, status %!STATUS!",
i+1,
status);
2518 Request->ContextReleaseAndRestore();
2525 Request->VerifierSetFormatted();
2649 "Cancelling pending I/O on WDFIOTARGET %p ",
2685 "Ignoring WDFIOTARGET %p state to send request",
2711 "WDFIOTARGET %p has changed IoType with outstanding IO",
#define CheckState(OldState, NewState)
struct outqueuenode * head
#define InterlockedDecrement
virtual VOID RemoveIoTarget(__inout FxIoTarget *IoTarget)
NTSTATUS _Must_inspect_result_ QueryInterface(__inout FxQueryInterfaceParams *Params)
virtual _Must_inspect_result_ NTSTATUS GotoStartState(__in PLIST_ENTRY RequestListHead, __in BOOLEAN Lock=TRUE)
virtual VOID Stop(__in WDF_IO_TARGET_SENT_IO_ACTION Action)
VOID DrainPendedRequestsLocked(__in PLIST_ENTRY RequestListHead, __in BOOLEAN RequestWillBeResent)
VOID CompleteCanceledRequest(__in FxRequestBase *Request)
VOID SetCompletionRoutine(__in FxRequestBase *Request)
static MdCompletionRoutineType _RequestCompletionRoutine
virtual VOID GotoStopState(__in WDF_IO_TARGET_SENT_IO_ACTION Action, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
LIST_ENTRY m_IgnoredIoListHead
VOID FailPendedRequest(__in FxRequestBase *Request, __in NTSTATUS Status)
static VOID _CancelSentRequest(__in FxRequestBase *Request)
_Must_inspect_result_ NTSTATUS SubmitSync(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options=NULL, __out_opt PULONG Action=NULL)
virtual VOID Remove(VOID)
VOID TimerCallback(__in FxRequestBase *Request)
VOID RequestCompletionRoutine(__in FxRequestBase *Request)
ULONG SubmitLocked(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in ULONG Flags)
BOOLEAN m_AddedToDeviceList
UCHAR GetTargetIoType(VOID)
VOID HandleFailedResubmit(__in FxRequestBase *Request)
LIST_ENTRY m_SentIoListHead
_Must_inspect_result_ NTSTATUS SubmitSyncRequestIgnoreTargetState(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS RequestOptions)
_Must_inspect_result_ NTSTATUS Init(__in CfxDeviceBase *Device)
MdDeviceObject m_TargetDevice
MdDeviceObject m_TargetPdo
FxTransactionedEntry m_TransactionedEntry
virtual VOID WaitForDisposeEvent(VOID)
VOID UpdateTargetIoType(VOID)
virtual BOOLEAN Dispose(VOID)
__inline VOID CompleteRequest(__in FxRequestBase *Request)
MdDeviceObject m_InStackDevice
WDF_IO_TARGET_STATE m_State
__inline VOID CopyFileObjectAndFlags(__in FxRequestBase *Request)
FxCREvent m_DisposeEventUm
VOID SubmitPendedRequests(__in PLIST_ENTRY RequestListHeadHead)
_Must_inspect_result_ NTSTATUS PendRequestLocked(__in FxRequestBase *Request)
VOID CompletePendedRequest(__in FxRequestBase *Request)
__inline VOID DecrementIoCount(VOID)
VOID CompletePendedRequestList(__in PLIST_ENTRY RequestListHead)
virtual VOID ClearTargetPointers(VOID)
BOOLEAN RemoveCompletedRequestLocked(__in FxRequestBase *Request)
_Must_inspect_result_ NTSTATUS FormatInternalIoctlOthersRequest(__in FxRequestBase *Request, __in ULONG Ioctl, __in FxRequestBuffer *Buffers)
virtual _Must_inspect_result_ MdDeviceObject GetTargetDeviceObject(_In_ CfxDeviceBase *Device)
static VOID _CancelSentRequests(__in PSINGLE_LIST_ENTRY RequestListHead)
static VOID _RequestCancelled(__in FxIrpQueue *Queue, __in MdIrp Irp, __in PMdIoCsqIrpContext pCsqContext, __in KIRQL CallerIrql)
FxCREvent * m_DisposeEvent
virtual VOID GotoPurgeState(__in WDF_IO_TARGET_PURGE_IO_ACTION Action, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __out PBOOLEAN Wait, __in BOOLEAN LockSelf)
VOID SubmitPendedRequest(__in FxRequestBase *Request)
virtual VOID Send(_In_ MdIrp Irp)
static const PVOID m_SentRequestTag
static EVT_WDF_REQUEST_COMPLETION_ROUTINE _SyncCompletionRoutine
_Must_inspect_result_ NTSTATUS InitModeSpecific(__in CfxDeviceBase *Device)
BOOLEAN m_WaitingForSentIo
virtual VOID GotoRemoveState(__in WDF_IO_TARGET_STATE NewState, __in PLIST_ENTRY PendedRequestListHead, __in PSINGLE_LIST_ENTRY SentRequestListHead, __in BOOLEAN Lock, __out PBOOLEAN Wait)
__inline VOID IncrementIoCount(VOID)
ULONG Submit(__in FxRequestBase *Request, __in_opt PWDF_REQUEST_SEND_OPTIONS Options, __in_opt ULONG Flags)
VOID ClearCompletedRequestVerifierFlags(__in FxRequestBase *Request)
VOID GetSentRequestsListLocked(__in PSINGLE_LIST_ENTRY RequestListHead, __in PLIST_ENTRY SendList, __out PBOOLEAN AddedToList)
VOID PrintDisposeMessage(VOID)
virtual VOID Purge(__in WDF_IO_TARGET_PURGE_IO_ACTION Action)
FxIoTarget(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in USHORT ObjectSize)
virtual _Must_inspect_result_ NTSTATUS Start(VOID)
virtual VOID WaitForSentIoToComplete(VOID)
MdFileObject m_TargetFileObject
_Must_inspect_result_ NTSTATUS InsertTailRequest(__inout MdIrp Irp, __in_opt PMdIoCsqIrpContext CsqContext, __out_opt ULONG *pRequestCount)
VOID Initialize(__in FxNonPagedObject *LockObject, __in PFN_IRP_QUEUE_CANCEL Callback)
MdIrp GetNextRequest(__out PMdIoCsqIrpContext *pCsqContext)
PVOID * GetNextStackParameterOthersArgument2Pointer()
PVOID * GetNextStackParameterOthersArgument4Pointer()
CCHAR GetCurrentIrpStackLocationIndex()
VOID SetMajorFunction(__in UCHAR MajorFunction)
VOID SetParameterIoctlCode(__in ULONG DeviceIoControlCode)
VOID SetNextIrpStackLocation(VOID)
VOID SkipCurrentIrpStackLocation(VOID)
VOID PropagatePendingReturned(VOID)
VOID SetStatus(__in NTSTATUS Status)
PVOID * GetNextStackParameterOthersArgument1Pointer()
VOID SetInformation(__in ULONG_PTR Information)
BOOLEAN IsCurrentIrpStackLocationValid(VOID)
VOID ClearNextStackLocation(VOID)
VOID MarkPassiveDispose(__in FxObjectLockState State=ObjectLock)
VOID SetDeviceBase(__in CfxDeviceBase *DeviceBase)
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
CfxDeviceBase * m_DeviceBase
__drv_restoresIRQL KIRQL __in BOOLEAN Unlock
VOID MarkDisposeOverride(__in FxObjectLockState State=ObjectLock)
virtual _Must_inspect_result_ NTSTATUS QueryInterface(__in FxQueryInterfaceParams *Params)
__inline VOID CallCleanup(VOID)
SINGLE_LIST_ENTRY m_DrainSingleEntry
__inline FxIrp * GetSubmitFxIrp(VOID)
__inline PVOID GetTraceObjectHandle(VOID)
__inline VOID SetTargetFlags(__in UCHAR Flags)
__inline BOOLEAN CanComplete(VOID)
static __inline FxRequestBase * _FromListEntry(__in PLIST_ENTRY Entry)
__inline ULONG ClearTargetFlags(__in UCHAR Flags)
static __inline FxRequestBase * _FromDrainEntry(__in PSINGLE_LIST_ENTRY Entry)
_Must_inspect_result_ BOOLEAN CancelTimer(VOID)
FxRequestCompletionCallback m_CompletionRoutine
static __inline FxRequestBase * _FromCsqContext(__in PMdIoCsqIrpContext Context)
__inline UCHAR GetTargetFlags(VOID)
PFN_WDF_REQUEST_COMPLETION_ROUTINE m_Completion
__inline VOID SetObject(__in_opt MdDeviceObject DeviceObject)
static __inline KIRQL MxGetCurrentIrql()
#define NT_SUCCESS(StatCode)
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
#define RemoveHeadList(ListHead)
#define InitializeListHead(ListHead)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
PFX_DRIVER_GLOBALS pFxDriverGlobals
return pObject GetObjectHandle()
MxDeviceObject deviceObject
FxVerifierDbgBreakPoint(pFxDriverGlobals)
__inline LONG FxInterlockedIncrementGTZero(__inout LONG volatile *Target)
_Must_inspect_result_ NTSTATUS _In_ FxRequestBase * Request
@ SubmitSyncCallCompletion
_Must_inspect_result_ __in WDFIOTARGET __in_opt WDFREQUEST __in ULONG Ioctl
__in MdIrp __in PMdIoCsqIrpContext __in KIRQL CallerIrql
#define FX_VF_METHOD(classname, fnName)
#define WDF_REQUEST_SEND_INTERNAL_OPTION_FAIL_ON_PEND
@ FX_REQUEST_IGNORE_STATE
@ FX_REQUEST_CANCELLED_FROM_TIMER
@ FXREQUEST_FLAG_FORMATTED
@ FXREQUEST_FLAG_SENT_TO_TARGET
#define FX_REQUEST_NUM_OTHER_PARAMS
@ FX_RCT_INTERNAL_IOCTL_OTHERS
#define FxVerifierBugCheck(FxDriverGlobals, Error,...)
GLenum const GLfloat * params
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
HRESULT Next([in] ULONG celt, [out, size_is(celt), length_is(*pceltFetched)] STATPROPSETSTG *rgelt, [out] ULONG *pceltFetched)
#define _Must_inspect_result_
#define UNREFERENCED_PARAMETER(P)
#define STATUS_REQUEST_NOT_ACCEPTED
void CheckError(HRESULT hr)
#define STATUS_MORE_PROCESSING_REQUIRED
#define TRACE_LEVEL_WARNING
#define TRACE_LEVEL_VERBOSE
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_INFORMATION
FxCREvent * GetSelfPointer(VOID)
CHECK_RETURN_IF_USER_MODE NTSTATUS Initialize(__in BOOLEAN InitialState=FALSE)
VOID StoreAndReferenceOtherMemories(__in FxRequestBuffer *Buffer1, __in FxRequestBuffer *Buffer2, __in FxRequestBuffer *Buffer4)
WDFCONTEXT OrigTargetCompletionContext
PFN_WDF_REQUEST_COMPLETION_ROUTINE OrigTargetCompletionRoutine
VOID SetTransactionedObject(__in FxObject *Object)
_Must_inspect_result_ BOOLEAN IsVerificationEnabled(__in ULONG Major, __in ULONG Minor, __in FxVerifierDownlevelOption DownLevel)
struct _SINGLE_LIST_ENTRY * Next
#define RtlCopyMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_IO_TIMEOUT
#define STATUS_UNSUCCESSFUL
#define STATUS_INVALID_DEVICE_STATE
#define STATUS_INSUFFICIENT_RESOURCES
@ WDF_REQUEST_FATAL_ERROR
@ WDF_REQUEST_FATAL_ERROR_REQUEST_ALREADY_SENT
_Must_inspect_result_ _In_ WDFDEVICE Device
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
_In_ PWDFDEVICE_INIT _In_ PWDF_REMOVE_LOCK_OPTIONS Options
_In_ WDFDPC _In_ BOOLEAN Wait
enum _WDF_IO_TARGET_PURGE_IO_ACTION WDF_IO_TARGET_PURGE_IO_ACTION
@ WdfIoTargetCancelSentIo
@ WdfIoTargetWaitForSentIoToComplete
@ WdfIoTargetLeaveSentIoPending
enum _WDF_IO_TARGET_SENT_IO_ACTION WDF_IO_TARGET_SENT_IO_ACTION
@ WdfIoTargetClosedForQueryRemove
_In_ WDFIOTARGET _In_ _Strict_type_match_ WDF_IO_TARGET_SENT_IO_ACTION Action
@ WdfIoTargetPurgeIoAndWait
WDF_EXTERN_C_START enum _WDF_IO_TARGET_STATE WDF_IO_TARGET_STATE
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR _In_opt_ PLONGLONG _In_opt_ PWDF_REQUEST_SEND_OPTIONS RequestOptions
FORCEINLINE VOID WDF_REQUEST_SEND_OPTIONS_INIT(_Out_ PWDF_REQUEST_SEND_OPTIONS Options, _In_ ULONG Flags)
@ WDF_REQUEST_SEND_OPTION_TIMEOUT
@ WDF_REQUEST_SEND_OPTION_IGNORE_TARGET_STATE
_In_ WDFIOTARGET _In_ PWDF_REQUEST_COMPLETION_PARAMS Params
#define STATUS_WDF_QUEUED
#define STATUS_WDF_DEVICE_REMOVED_NOT_SENT
_Must_inspect_result_ _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWAITLOCK * Lock
_Must_inspect_result_ _In_ ULONG Flags
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
FORCEINLINE PSINGLE_LIST_ENTRY PopEntryList(_Inout_ PSINGLE_LIST_ENTRY ListHead)
static void startTimer(void)