22 return Irp->MdlAddress;
24 return Irp->AssociatedIrp.SystemBuffer;
40 PVOID ObjectsArray[2];
51 INFO_(SERIAL,
"UseIntervalTimeout = %s, IntervalTimeout = %lu\n",
54 INFO_(SERIAL,
"UseTotalTimeout = %s\n",
76 INFO_(SERIAL,
"Reading byte from buffer: 0x%02x\n", ReceivedByte);
86 INFO_(SERIAL,
"All bytes read\n");
93 INFO_(SERIAL,
"Buffer empty. Don't wait more bytes\n");
110 TRACE_(SERIAL,
"Timeout when reading bytes. Status = 0x%08lx\n",
Status);
134 TRACE_(SERIAL,
"SerialReadWorkItem() called\n");
160 TRACE_(SERIAL,
"IRP_MJ_READ\n");
225 TotalTimeout * 10000;
240 INFO_(SERIAL,
"Insufficient resources\n");
271 TRACE_(SERIAL,
"IRP_MJ_WRITE\n");
307 WARN_(SERIAL,
"Buffer overrun on COM%lu\n", DeviceExtension->
ComPort);
#define KeQuerySystemTime(t)
NTSTATUS NTAPI SerialRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
static VOID ReadBytes(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PWORKITEM_DATA WorkItemData)
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
CIRCULAR_BUFFER OutputBuffer
#define STATUS_INSUFFICIENT_RESOURCES
static PVOID SerialGetUserBuffer(IN PIRP Irp)
_In_ ULONG _In_ ULONG _In_ ULONG Length
IN BOOLEAN OUT PSTR Buffer
#define STATUS_INVALID_PARAMETER
ULONG BufferOverrunErrorCount
ULONG ReadTotalTimeoutConstant
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
struct _WORKITEM_DATA * PWORKITEM_DATA
KSPIN_LOCK InputBufferLock
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
#define STATUS_BUFFER_TOO_SMALL
SERIAL_TIMEOUTS SerialTimeOuts
KEVENT InputBufferNotEmpty
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
_In_ PDEVICE_OBJECT DeviceObject
KSPIN_LOCK OutputBufferLock
LARGE_INTEGER IntervalTimeout
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
SERIALPERF_STATS SerialPerfStats
BOOLEAN IsCircularBufferEmpty(IN PCIRCULAR_BUFFER pBuffer)
ULONG ReadTotalTimeoutMultiplier
#define IoCompleteRequest
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
static IO_WORKITEM_ROUTINE SerialReadWorkItem
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
LARGE_INTEGER TotalTimeoutTime
#define NT_SUCCESS(StatCode)
BOOLEAN ReadAtLeastOneByte
ULONG ReadIntervalTimeout
NTSTATUS PushCircularBufferEntry(IN PCIRCULAR_BUFFER pBuffer, IN UCHAR Entry)
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)
#define ExAllocatePoolWithTag(hernya, size, tag)
IO_REMOVE_LOCK RemoveLock
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
NTSTATUS PopCircularBufferEntry(IN PCIRCULAR_BUFFER pBuffer, OUT PUCHAR Entry)
struct _SERIAL_DEVICE_EXTENSION * PSERIAL_DEVICE_EXTENSION
BOOLEAN UseIntervalTimeout
#define KeReleaseSpinLock(sl, irql)
NTSTATUS NTAPI SerialWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI SerialSendByte(IN PKDPC Dpc, IN PVOID pDeviceExtension, IN PVOID Unused1, IN PVOID Unused2)
CIRCULAR_BUFFER InputBuffer
#define RtlZeroMemory(Destination, Length)
_Must_inspect_result_ _In_ PWDF_WORKITEM_CONFIG _In_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFWORKITEM * WorkItem
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
VOID NTAPI KeClearEvent(IN PKEVENT Event)
#define ExFreePoolWithTag(_P, _T)
#define IoAcquireRemoveLock(RemoveLock, Tag)