ReactOS  0.4.14-dev-583-g2a1ba2c
rw.c File Reference
#include "serial.h"
#include <debug.h>
Include dependency graph for rw.c:

Go to the source code of this file.

Functions

static PVOID SerialGetUserBuffer (IN PIRP Irp)
 
static VOID ReadBytes (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PWORKITEM_DATA WorkItemData)
 
static VOID NTAPI SerialReadWorkItem (IN PDEVICE_OBJECT DeviceObject, IN PVOID pWorkItemData)
 
NTSTATUS NTAPI SerialRead (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 
NTSTATUS NTAPI SerialWrite (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 

Variables

static IO_WORKITEM_ROUTINE SerialReadWorkItem
 

Function Documentation

◆ ReadBytes()

static VOID ReadBytes ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp,
PWORKITEM_DATA  WorkItemData 
)
static

Definition at line 28 of file rw.c.

32 {
33  PSERIAL_DEVICE_EXTENSION DeviceExtension;
34  ULONG Length;
35  PUCHAR Buffer;
36  UCHAR ReceivedByte;
37  KTIMER TotalTimeoutTimer;
38  KIRQL Irql;
40  PVOID ObjectsArray[2];
43 
45  ASSERT(WorkItemData);
46 
50 
51  INFO_(SERIAL, "UseIntervalTimeout = %s, IntervalTimeout = %lu\n",
52  WorkItemData->UseIntervalTimeout ? "YES" : "NO",
53  WorkItemData->UseIntervalTimeout ? WorkItemData->IntervalTimeout.QuadPart : 0);
54  INFO_(SERIAL, "UseTotalTimeout = %s\n",
55  WorkItemData->UseTotalTimeout ? "YES" : "NO");
56 
57  ObjectCount = 1;
58  ObjectsArray[0] = &DeviceExtension->InputBufferNotEmpty;
59  if (WorkItemData->UseTotalTimeout)
60  {
61  KeInitializeTimer(&TotalTimeoutTimer);
62  KeSetTimer(&TotalTimeoutTimer, WorkItemData->TotalTimeoutTime, NULL);
63  ObjectsArray[ObjectCount] = &TotalTimeoutTimer;
64  ObjectCount++;
65  }
66 
67  /* while buffer is not fully filled */
68  while (TRUE)
69  {
70  /* read already received bytes from buffer */
71  KeAcquireSpinLock(&DeviceExtension->InputBufferLock, &Irql);
72  while (!IsCircularBufferEmpty(&DeviceExtension->InputBuffer)
73  && Length > 0)
74  {
75  PopCircularBufferEntry(&DeviceExtension->InputBuffer, &ReceivedByte);
76  INFO_(SERIAL, "Reading byte from buffer: 0x%02x\n", ReceivedByte);
77 
78  Buffer[Information++] = ReceivedByte;
79  Length--;
80  }
81  KeClearEvent(&DeviceExtension->InputBufferNotEmpty);
82  KeReleaseSpinLock(&DeviceExtension->InputBufferLock, Irql);
83 
84  if (Length == 0)
85  {
86  INFO_(SERIAL, "All bytes read\n");
87  break;
88  }
89 
90  if (WorkItemData->DontWait
91  && !(WorkItemData->ReadAtLeastOneByte && Information == 0))
92  {
93  INFO_(SERIAL, "Buffer empty. Don't wait more bytes\n");
94  break;
95  }
96 
99  ObjectsArray,
100  WaitAny,
101  Executive,
102  KernelMode,
103  FALSE,
104  (WorkItemData->UseIntervalTimeout && Information > 0) ? &WorkItemData->IntervalTimeout : NULL,
105  NULL);
106 
107  if (Status == STATUS_TIMEOUT /* interval timeout */
108  || Status == STATUS_WAIT_1) /* total timeout */
109  {
110  TRACE_(SERIAL, "Timeout when reading bytes. Status = 0x%08lx\n", Status);
111  break;
112  }
113  }
114 
115  /* stop total timeout timer */
116  if (WorkItemData->UseTotalTimeout)
117  KeCancelTimer(&TotalTimeoutTimer);
118 
119  Irp->IoStatus.Information = Information;
120  if (Information == 0)
121  Irp->IoStatus.Status = STATUS_TIMEOUT;
122  else
123  Irp->IoStatus.Status = STATUS_SUCCESS;
124 }
#define TRUE
Definition: types.h:120
BOOLEAN NTAPI KeSetTimer(IN OUT PKTIMER Timer, IN LARGE_INTEGER DueTime, IN PKDPC Dpc OPTIONAL)
Definition: timerobj.c:281
static PVOID SerialGetUserBuffer(IN PIRP Irp)
Definition: rw.c:17
BOOLEAN UseTotalTimeout
Definition: serial.h:93
#define INFO_(ch,...)
Definition: debug.h:159
_In_ PIRP Irp
Definition: csq.h:116
unsigned char * PUCHAR
Definition: retypes.h:3
LONG NTSTATUS
Definition: precomp.h:26
KSPIN_LOCK InputBufferLock
Definition: serial.h:76
_Out_ PKIRQL Irql
Definition: csq.h:179
uint32_t ULONG_PTR
Definition: typedefs.h:63
#define STATUS_TIMEOUT
Definition: ntstatus.h:81
KEVENT InputBufferNotEmpty
Definition: serial.h:74
UCHAR KIRQL
Definition: env_spec_w32.h:591
#define STATUS_WAIT_1
Definition: ntstatus.h:71
BOOLEAN DontWait
Definition: serial.h:96
LARGE_INTEGER IntervalTimeout
Definition: serial.h:94
BOOLEAN IsCircularBufferEmpty(IN PCIRCULAR_BUFFER pBuffer)
LONG ObjectCount
Definition: comsup.c:7
PVOID DeviceExtension
Definition: env_spec_w32.h:418
smooth NULL
Definition: ftsmooth.c:416
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
Definition: bufpool.h:45
#define TRACE_(x)
Definition: compat.h:66
BOOLEAN NTAPI KeCancelTimer(IN OUT PKTIMER Timer)
Definition: timerobj.c:206
LARGE_INTEGER TotalTimeoutTime
Definition: serial.h:95
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
BOOLEAN ReadAtLeastOneByte
Definition: serial.h:97
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
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)
Definition: wait.c:586
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
unsigned char UCHAR
Definition: xmlstorage.h:181
Status
Definition: gdiplustypes.h:24
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
NTSTATUS PopCircularBufferEntry(IN PCIRCULAR_BUFFER pBuffer, OUT PUCHAR Entry)
struct _SERIAL_DEVICE_EXTENSION * PSERIAL_DEVICE_EXTENSION
BOOLEAN UseIntervalTimeout
Definition: serial.h:92
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
CIRCULAR_BUFFER InputBuffer
Definition: serial.h:75
unsigned int ULONG
Definition: retypes.h:1
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2772
VOID NTAPI KeClearEvent(IN PKEVENT Event)
Definition: eventobj.c:22
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
return STATUS_SUCCESS
Definition: btrfs.c:2938
Iosb Information
Definition: create.c:4377
LONGLONG QuadPart
Definition: typedefs.h:112

Referenced by SerialRead(), and SerialReadWorkItem().

◆ SerialGetUserBuffer()

static PVOID SerialGetUserBuffer ( IN PIRP  Irp)
static

Definition at line 17 of file rw.c.

18 {
19  ASSERT(Irp);
20 
21  if (Irp->MdlAddress)
22  return Irp->MdlAddress;
23  else
24  return Irp->AssociatedIrp.SystemBuffer;
25 }
_In_ PIRP Irp
Definition: csq.h:116
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)

Referenced by ReadBytes(), SerialRead(), and SerialWrite().

◆ SerialRead()

NTSTATUS NTAPI SerialRead ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 148 of file rw.c.

151 {
152  PIO_STACK_LOCATION Stack;
153  PSERIAL_DEVICE_EXTENSION DeviceExtension;
154  ULONG Length;
155  PUCHAR Buffer;
156  PWORKITEM_DATA WorkItemData;
157  PIO_WORKITEM WorkItem;
159 
160  TRACE_(SERIAL, "IRP_MJ_READ\n");
161 
163  Length = Stack->Parameters.Read.Length;
166 
167  if (Stack->Parameters.Read.ByteOffset.QuadPart != 0 || Buffer == NULL)
168  {
170  goto ByeBye;
171  }
172 
173  if (Length == 0)
174  {
176  goto ByeBye;
177  }
178 
179  /* Allocate memory for parameters */
180  WorkItemData = ExAllocatePoolWithTag(PagedPool, sizeof(WORKITEM_DATA), SERIAL_TAG);
181  if (!WorkItemData)
182  {
184  goto ByeBye;
185  }
186  RtlZeroMemory(WorkItemData, sizeof(WORKITEM_DATA));
187  WorkItemData->Irp = Irp;
188 
189  /* Calculate time outs */
190  if (DeviceExtension->SerialTimeOuts.ReadIntervalTimeout == INFINITE &&
191  DeviceExtension->SerialTimeOuts.ReadTotalTimeoutMultiplier == INFINITE &&
192  DeviceExtension->SerialTimeOuts.ReadTotalTimeoutConstant > 0 &&
194  {
195  /* read at least one byte, and at most bytes already received */
196  WorkItemData->DontWait = TRUE;
197  WorkItemData->ReadAtLeastOneByte = TRUE;
198  }
199  else if (DeviceExtension->SerialTimeOuts.ReadIntervalTimeout == INFINITE &&
200  DeviceExtension->SerialTimeOuts.ReadTotalTimeoutConstant == 0 &&
201  DeviceExtension->SerialTimeOuts.ReadTotalTimeoutMultiplier == 0)
202  {
203  /* read only bytes that are already in buffer */
204  WorkItemData->DontWait = TRUE;
205  }
206  else
207  {
208  /* use timeouts */
209  if (DeviceExtension->SerialTimeOuts.ReadIntervalTimeout != 0)
210  {
211  WorkItemData->UseIntervalTimeout = TRUE;
212  WorkItemData->IntervalTimeout.QuadPart = DeviceExtension->SerialTimeOuts.ReadIntervalTimeout;
213  }
214  if (DeviceExtension->SerialTimeOuts.ReadTotalTimeoutMultiplier != 0 ||
215  DeviceExtension->SerialTimeOuts.ReadTotalTimeoutConstant != 0)
216  {
217  ULONG TotalTimeout;
218  LARGE_INTEGER SystemTime;
219 
220  WorkItemData->UseTotalTimeout = TRUE;
221  TotalTimeout = DeviceExtension->SerialTimeOuts.ReadTotalTimeoutConstant +
223  KeQuerySystemTime(&SystemTime);
224  WorkItemData->TotalTimeoutTime.QuadPart = SystemTime.QuadPart +
225  TotalTimeout * 10000;
226  }
227  }
228 
229  /* Pend IRP */
230  WorkItem = IoAllocateWorkItem(DeviceObject);
231  if (WorkItem)
232  {
233  WorkItemData->IoWorkItem = WorkItem;
235  IoQueueWorkItem(WorkItem, SerialReadWorkItem, DelayedWorkQueue, WorkItemData);
236  return STATUS_PENDING;
237  }
238 
239  /* Insufficient resources, we can't pend the Irp */
240  INFO_(SERIAL, "Insufficient resources\n");
241  Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, ULongToPtr(DeviceExtension->ComPort));
242  if (!NT_SUCCESS(Status))
243  {
244  ExFreePoolWithTag(WorkItemData, SERIAL_TAG);
245  goto ByeBye;
246  }
247  ReadBytes(DeviceObject, Irp, WorkItemData);
248  Status = Irp->IoStatus.Status;
249 
250  IoReleaseRemoveLock(&DeviceExtension->RemoveLock, ULongToPtr(DeviceExtension->ComPort));
251 
252 ByeBye:
253  Irp->IoStatus.Status = Status;
255  return Status;
256 }
#define KeQuerySystemTime(t)
Definition: env_spec_w32.h:570
PIRP Irp
Definition: serial.h:89
static VOID ReadBytes(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PWORKITEM_DATA WorkItemData)
Definition: rw.c:28
#define TRUE
Definition: types.h:120
#define ULongToPtr(ul)
Definition: basetsd.h:92
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
static PVOID SerialGetUserBuffer(IN PIRP Irp)
Definition: rw.c:17
PIO_WORKITEM IoWorkItem
Definition: serial.h:90
BOOLEAN UseTotalTimeout
Definition: serial.h:93
#define INFO_(ch,...)
Definition: debug.h:159
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
unsigned char * PUCHAR
Definition: retypes.h:3
ULONG ReadTotalTimeoutConstant
Definition: ntddser.h:305
LONG NTSTATUS
Definition: precomp.h:26
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2716
PIO_WORKITEM NTAPI IoAllocateWorkItem(IN PDEVICE_OBJECT DeviceObject)
Definition: iowork.c:75
SERIAL_TIMEOUTS SerialTimeOuts
Definition: serial.h:72
BOOLEAN DontWait
Definition: serial.h:96
LARGE_INTEGER IntervalTimeout
Definition: serial.h:94
PVOID DeviceExtension
Definition: env_spec_w32.h:418
ULONG ReadTotalTimeoutMultiplier
Definition: ntddser.h:304
smooth NULL
Definition: ftsmooth.c:416
#define IoCompleteRequest
Definition: irp.c:1240
Definition: bufpool.h:45
static IO_WORKITEM_ROUTINE SerialReadWorkItem
Definition: rw.c:14
#define SERIAL_TAG
Definition: serial.h:100
#define TRACE_(x)
Definition: compat.h:66
LARGE_INTEGER TotalTimeoutTime
Definition: serial.h:95
if(!(yy_init))
Definition: macro.lex.yy.c:714
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_PENDING
Definition: ntstatus.h:82
BOOLEAN ReadAtLeastOneByte
Definition: serial.h:97
ULONG ReadIntervalTimeout
Definition: ntddser.h:303
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
IO_REMOVE_LOCK RemoveLock
Definition: serial.h:53
Status
Definition: gdiplustypes.h:24
VOID NTAPI IoQueueWorkItem(IN PIO_WORKITEM IoWorkItem, IN PIO_WORKITEM_ROUTINE WorkerRoutine, IN WORK_QUEUE_TYPE QueueType, IN PVOID Context)
Definition: iowork.c:40
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
struct _SERIAL_DEVICE_EXTENSION * PSERIAL_DEVICE_EXTENSION
BOOLEAN UseIntervalTimeout
Definition: serial.h:92
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:566
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2772
#define INFINITE
Definition: serial.h:102
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
return STATUS_SUCCESS
Definition: btrfs.c:2938
IoMarkIrpPending(Irp)
#define IoAcquireRemoveLock(RemoveLock, Tag)
LONGLONG QuadPart
Definition: typedefs.h:112

◆ SerialReadWorkItem()

static VOID NTAPI SerialReadWorkItem ( IN PDEVICE_OBJECT  DeviceObject,
IN PVOID  pWorkItemData 
)
static

Definition at line 127 of file rw.c.

130 {
131  PWORKITEM_DATA WorkItemData;
132  PIRP Irp;
133 
134  TRACE_(SERIAL, "SerialReadWorkItem() called\n");
135 
136  WorkItemData = (PWORKITEM_DATA)pWorkItemData;
137  Irp = WorkItemData->Irp;
138 
139  ReadBytes(DeviceObject, Irp, WorkItemData);
140 
142 
143  IoFreeWorkItem(WorkItemData->IoWorkItem);
144  ExFreePoolWithTag(pWorkItemData, SERIAL_TAG);
145 }
PIRP Irp
Definition: serial.h:89
static VOID ReadBytes(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, PWORKITEM_DATA WorkItemData)
Definition: rw.c:28
PIO_WORKITEM IoWorkItem
Definition: serial.h:90
_In_ PIRP Irp
Definition: csq.h:116
struct _WORKITEM_DATA * PWORKITEM_DATA
VOID NTAPI IoFreeWorkItem(IN PIO_WORKITEM IoWorkItem)
Definition: iowork.c:64
#define IoCompleteRequest
Definition: irp.c:1240
#define SERIAL_TAG
Definition: serial.h:100
#define TRACE_(x)
Definition: compat.h:66
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
#define IO_NO_INCREMENT
Definition: iotypes.h:566
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099

◆ SerialWrite()

NTSTATUS NTAPI SerialWrite ( IN PDEVICE_OBJECT  DeviceObject,
IN PIRP  Irp 
)

Definition at line 259 of file rw.c.

262 {
263  PIO_STACK_LOCATION Stack;
264  PSERIAL_DEVICE_EXTENSION DeviceExtension;
265  ULONG Length;
267  PUCHAR Buffer;
268  KIRQL Irql;
270 
271  TRACE_(SERIAL, "IRP_MJ_WRITE\n");
272 
273  /* FIXME: pend operation if possible */
274  /* FIXME: use write timeouts */
275 
277  Length = Stack->Parameters.Write.Length;
280 
281  if (Stack->Parameters.Write.ByteOffset.QuadPart != 0 || Buffer == NULL)
282  {
284  goto ByeBye;
285  }
286 
287  Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, ULongToPtr(DeviceExtension->ComPort));
288  if (!NT_SUCCESS(Status))
289  goto ByeBye;
290 
291  /* push bytes into output buffer */
292  KeAcquireSpinLock(&DeviceExtension->OutputBufferLock, &Irql);
293  while (Information < Length)
294  {
296  if (!NT_SUCCESS(Status))
297  {
299  {
300  KeReleaseSpinLock(&DeviceExtension->OutputBufferLock, Irql);
301  SerialSendByte(NULL, DeviceExtension, NULL, NULL);
302  KeAcquireSpinLock(&DeviceExtension->OutputBufferLock, &Irql);
303  continue;
304  }
305  else
306  {
307  WARN_(SERIAL, "Buffer overrun on COM%lu\n", DeviceExtension->ComPort);
308  DeviceExtension->SerialPerfStats.BufferOverrunErrorCount++;
309  break;
310  }
311  }
312  Information++;
313  }
314  KeReleaseSpinLock(&DeviceExtension->OutputBufferLock, Irql);
315  IoReleaseRemoveLock(&DeviceExtension->RemoveLock, ULongToPtr(DeviceExtension->ComPort));
316 
317  /* send bytes */
318  SerialSendByte(NULL, DeviceExtension, NULL, NULL);
319 
320 ByeBye:
321  Irp->IoStatus.Information = Information;
322  Irp->IoStatus.Status = Status;
324  return Status;
325 }
#define ULongToPtr(ul)
Definition: basetsd.h:92
CIRCULAR_BUFFER OutputBuffer
Definition: serial.h:77
static PVOID SerialGetUserBuffer(IN PIRP Irp)
Definition: rw.c:17
_In_ PIRP Irp
Definition: csq.h:116
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
ULONG BufferOverrunErrorCount
Definition: ntddser.h:298
unsigned char * PUCHAR
Definition: retypes.h:3
LONG NTSTATUS
Definition: precomp.h:26
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2716
_Out_ PKIRQL Irql
Definition: csq.h:179
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
uint32_t ULONG_PTR
Definition: typedefs.h:63
UCHAR KIRQL
Definition: env_spec_w32.h:591
KSPIN_LOCK OutputBufferLock
Definition: serial.h:78
SERIALPERF_STATS SerialPerfStats
Definition: serial.h:71
PVOID DeviceExtension
Definition: env_spec_w32.h:418
smooth NULL
Definition: ftsmooth.c:416
#define IoCompleteRequest
Definition: irp.c:1240
Definition: bufpool.h:45
#define TRACE_(x)
Definition: compat.h:66
if(!(yy_init))
Definition: macro.lex.yy.c:714
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define KeAcquireSpinLock(sl, irql)
Definition: env_spec_w32.h:609
NTSTATUS PushCircularBufferEntry(IN PCIRCULAR_BUFFER pBuffer, IN UCHAR Entry)
_In_ ULONG _In_ ULONG _In_ ULONG Length
Definition: ntddpcm.h:101
IO_REMOVE_LOCK RemoveLock
Definition: serial.h:53
Status
Definition: gdiplustypes.h:24
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
struct _SERIAL_DEVICE_EXTENSION * PSERIAL_DEVICE_EXTENSION
#define KeReleaseSpinLock(sl, irql)
Definition: env_spec_w32.h:627
VOID NTAPI SerialSendByte(IN PKDPC Dpc, IN PVOID pDeviceExtension, IN PVOID Unused1, IN PVOID Unused2)
Definition: misc.c:107
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:566
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2772
IN BOOLEAN OUT PSTR Buffer
Definition: progress.h:34
return STATUS_SUCCESS
Definition: btrfs.c:2938
#define WARN_(ch,...)
Definition: debug.h:157
#define IoAcquireRemoveLock(RemoveLock, Tag)
Iosb Information
Definition: create.c:4377

Variable Documentation

◆ SerialReadWorkItem

IO_WORKITEM_ROUTINE SerialReadWorkItem
static

Definition at line 14 of file rw.c.

Referenced by SerialRead().