Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

419 lines
9.0 KiB

  1. /*++
  2. Copyright (c) 1990, 1991, 1992, 1993 Microsoft Corporation
  3. Module Name :
  4. serialp.h
  5. Abstract:
  6. Prototypes and macros that are used throughout the driver.
  7. Author:
  8. Anthony V. Ercolano September 26, 1991
  9. Revision History:
  10. --*/
  11. #if !defined(SERIALP_H)
  12. #define SERIALP_H
  13. typedef NTSTATUS(*PSERIAL_START_ROUTINE) (IN PPORT_DEVICE_EXTENSION);
  14. typedef VOID(*PSERIAL_GET_NEXT_ROUTINE)(IN PPORT_DEVICE_EXTENSION pPort,
  15. IN PIRP *CurrentOpIrp,
  16. IN PLIST_ENTRY QueueToProcess,
  17. OUT PIRP *NewIrp,
  18. IN BOOLEAN CompleteCurrent);
  19. NTSTATUS SerialRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  20. NTSTATUS SerialStartRead(IN PPORT_DEVICE_EXTENSION pPort);
  21. VOID SerialCompleteRead(IN PKDPC Dpc,
  22. IN PVOID DeferredContext,
  23. IN PVOID SystemContext1,
  24. IN PVOID SystemContext2);
  25. VOID SerialReadTimeout(IN PKDPC Dpc,
  26. IN PVOID DeferredContext,
  27. IN PVOID SystemContext1,
  28. IN PVOID SystemContext2);
  29. VOID SerialIntervalReadTimeout(IN PKDPC Dpc,
  30. IN PVOID DeferredContext,
  31. IN PVOID SystemContext1,
  32. IN PVOID SystemContext2);
  33. NTSTATUS SerialFlush(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  34. NTSTATUS SerialWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  35. NTSTATUS SerialStartWrite(IN PPORT_DEVICE_EXTENSION pPort);
  36. VOID SerialGetNextWrite(IN PPORT_DEVICE_EXTENSION pPort,
  37. IN PIRP *CurrentOpIrp,
  38. IN PLIST_ENTRY QueueToProcess,
  39. IN PIRP *NewIrp,
  40. IN BOOLEAN CompleteCurrent);
  41. VOID SerialCompleteWrite(IN PKDPC Dpc,
  42. IN PVOID DeferredContext,
  43. IN PVOID SystemContext1,
  44. IN PVOID SystemContext2);
  45. BOOLEAN SerialProcessEmptyTransmit(IN PVOID Context);
  46. VOID SerialWriteTimeout(IN PKDPC Dpc,
  47. IN PVOID DeferredContext,
  48. IN PVOID SystemContext1,
  49. IN PVOID SystemContext2);
  50. VOID SerialCommError(IN PKDPC Dpc,
  51. IN PVOID DeferredContext,
  52. IN PVOID SystemContext1,
  53. IN PVOID SystemContext2);
  54. NTSTATUS SerialCleanup(IN PDEVICE_OBJECT DeviceObject,
  55. IN PIRP Irp);
  56. NTSTATUS SerialCreateOpen(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  57. NTSTATUS SerialClose(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
  58. BOOLEAN SerialSetDTR(IN PVOID Context);
  59. BOOLEAN SerialClrDTR(IN PVOID Context);
  60. BOOLEAN SerialSetRTS(IN PVOID Context);
  61. BOOLEAN SerialClrRTS(IN PVOID Context);
  62. BOOLEAN SerialSetChars(IN PVOID Context);
  63. BOOLEAN SerialSetBaud(IN PVOID Context);
  64. BOOLEAN SerialSetLineControl(IN PVOID Context);
  65. BOOLEAN
  66. SerialSetupNewHandFlow(
  67. IN PPORT_DEVICE_EXTENSION pPort,
  68. IN PSERIAL_HANDFLOW NewHandFlow
  69. );
  70. BOOLEAN SerialSetHandFlow(IN PVOID Context);
  71. BOOLEAN SerialTurnOnBreak(IN PVOID Context);
  72. BOOLEAN SerialTurnOffBreak(IN PVOID Context);
  73. BOOLEAN SerialPretendXoff(IN PVOID Context);
  74. BOOLEAN SerialPretendXon(IN PVOID Context);
  75. VOID
  76. SerialHandleReducedIntBuffer(
  77. IN PPORT_DEVICE_EXTENSION pPort
  78. );
  79. VOID
  80. SerialProdXonXoff(
  81. IN PPORT_DEVICE_EXTENSION pPort,
  82. IN BOOLEAN SendXon
  83. );
  84. NTSTATUS
  85. SerialIoControl(
  86. IN PDEVICE_OBJECT DeviceObject,
  87. IN PIRP Irp
  88. );
  89. NTSTATUS
  90. SerialStartMask(
  91. IN PPORT_DEVICE_EXTENSION pPort
  92. );
  93. VOID
  94. SerialCancelWait(
  95. IN PDEVICE_OBJECT DeviceObject,
  96. IN PIRP Irp
  97. );
  98. VOID
  99. SerialCompleteWait(
  100. IN PKDPC Dpc,
  101. IN PVOID DeferredContext,
  102. IN PVOID SystemContext1,
  103. IN PVOID SystemContext2
  104. );
  105. VOID
  106. SerialStartImmediate(
  107. IN PPORT_DEVICE_EXTENSION pPort
  108. );
  109. VOID
  110. SerialCompleteImmediate(
  111. IN PKDPC Dpc,
  112. IN PVOID DeferredContext,
  113. IN PVOID SystemContext1,
  114. IN PVOID SystemContext2
  115. );
  116. VOID
  117. SerialTimeoutImmediate(
  118. IN PKDPC Dpc,
  119. IN PVOID DeferredContext,
  120. IN PVOID SystemContext1,
  121. IN PVOID SystemContext2
  122. );
  123. VOID
  124. SerialTimeoutXoff(
  125. IN PKDPC Dpc,
  126. IN PVOID DeferredContext,
  127. IN PVOID SystemContext1,
  128. IN PVOID SystemContext2
  129. );
  130. VOID
  131. SerialCompleteXoff(
  132. IN PKDPC Dpc,
  133. IN PVOID DeferredContext,
  134. IN PVOID SystemContext1,
  135. IN PVOID SystemContext2
  136. );
  137. NTSTATUS
  138. SerialStartPurge(
  139. IN PPORT_DEVICE_EXTENSION pPort
  140. );
  141. BOOLEAN
  142. SerialPurgeInterruptBuff(
  143. IN PVOID Context
  144. );
  145. NTSTATUS
  146. SerialQueryInformationFile(
  147. IN PDEVICE_OBJECT DeviceObject,
  148. IN PIRP Irp
  149. );
  150. NTSTATUS
  151. SerialSetInformationFile(
  152. IN PDEVICE_OBJECT DeviceObject,
  153. IN PIRP Irp
  154. );
  155. VOID
  156. SerialKillAllReadsOrWrites(
  157. IN PDEVICE_OBJECT DeviceObject,
  158. IN PLIST_ENTRY QueueToClean,
  159. IN PIRP *CurrentOpIrp
  160. );
  161. VOID
  162. SerialGetNextIrp(
  163. IN PPORT_DEVICE_EXTENSION pPort,
  164. IN PIRP *CurrentOpIrp,
  165. IN PLIST_ENTRY QueueToProcess,
  166. OUT PIRP *NextIrp,
  167. IN BOOLEAN CompleteCurrent
  168. );
  169. VOID
  170. SerialTryToCompleteCurrent(
  171. IN PPORT_DEVICE_EXTENSION pPort,
  172. IN PKSYNCHRONIZE_ROUTINE SynchRoutine OPTIONAL,
  173. IN KIRQL IrqlForRelease,
  174. IN NTSTATUS StatusToUse,
  175. IN PIRP *CurrentOpIrp,
  176. IN PLIST_ENTRY QueueToProcess,
  177. IN PKTIMER IntervalTimer,
  178. IN PKTIMER TotalTimer,
  179. IN PSERIAL_START_ROUTINE Starter,
  180. IN PSERIAL_GET_NEXT_ROUTINE GetNextIrp,
  181. IN LONG RefType
  182. );
  183. NTSTATUS
  184. SerialStartOrQueue(
  185. IN PPORT_DEVICE_EXTENSION pPort,
  186. IN PIRP Irp,
  187. IN PLIST_ENTRY QueueToExamine,
  188. IN PIRP *CurrentOpIrp,
  189. IN PSERIAL_START_ROUTINE Starter
  190. );
  191. VOID
  192. SerialCancelQueued(
  193. PDEVICE_OBJECT DeviceObject,
  194. PIRP Irp
  195. );
  196. NTSTATUS
  197. SerialCompleteIfError(
  198. PDEVICE_OBJECT DeviceObject,
  199. PIRP Irp
  200. );
  201. ULONG
  202. SerialHandleModemUpdate(
  203. IN PPORT_DEVICE_EXTENSION pPort,
  204. IN BOOLEAN DoingTX
  205. );
  206. BOOLEAN
  207. SerialISR(
  208. IN PKINTERRUPT InterruptObject,
  209. IN PVOID Context
  210. );
  211. BOOLEAN
  212. SerialDispatchISR(
  213. IN PKINTERRUPT InterruptObject,
  214. IN PVOID Context
  215. );
  216. NTSTATUS
  217. SerialGetDivisorFromBaud(
  218. IN ULONG ClockRate,
  219. IN LONG DesiredBaud,
  220. OUT PSHORT AppropriateDivisor
  221. );
  222. VOID SerialUnload(IN PDRIVER_OBJECT DriverObject);
  223. BOOLEAN SerialReset(IN PVOID Context);
  224. BOOLEAN ApplyInitialPortSettings(IN PVOID Context);
  225. BOOLEAN SerialPerhapsLowerRTS(IN PVOID Context);
  226. VOID
  227. SerialStartTimerLowerRTS(
  228. IN PKDPC Dpc,
  229. IN PVOID DeferredContext,
  230. IN PVOID SystemContext1,
  231. IN PVOID SystemContext2
  232. );
  233. VOID
  234. SerialInvokePerhapsLowerRTS(
  235. IN PKDPC Dpc,
  236. IN PVOID DeferredContext,
  237. IN PVOID SystemContext1,
  238. IN PVOID SystemContext2
  239. );
  240. VOID SerialCleanupDevice(IN PPORT_DEVICE_EXTENSION pPort);
  241. UCHAR SerialProcessLSR(IN PPORT_DEVICE_EXTENSION pPort);
  242. LARGE_INTEGER SerialGetCharTime(IN PPORT_DEVICE_EXTENSION pPort);
  243. BOOLEAN
  244. SerialSharerIsr(
  245. IN PKINTERRUPT InterruptObject,
  246. IN PVOID Context
  247. );
  248. BOOLEAN
  249. SerialMarkClose(
  250. IN PVOID Context
  251. );
  252. VOID
  253. SerialPutChar(
  254. IN PPORT_DEVICE_EXTENSION pPort,
  255. IN UCHAR CharToPut
  256. );
  257. VOID SerialGetProperties(
  258. IN PPORT_DEVICE_EXTENSION pPort,
  259. IN PSERIAL_COMMPROP Properties
  260. );
  261. BOOLEAN SerialGetStats(IN PVOID Context);
  262. BOOLEAN SerialClearStats(IN PVOID Context);
  263. typedef struct _SERIAL_UPDATE_CHAR
  264. {
  265. PPORT_DEVICE_EXTENSION pPort;
  266. ULONG CharsCopied;
  267. BOOLEAN Completed;
  268. } SERIAL_UPDATE_CHAR,*PSERIAL_UPDATE_CHAR;
  269. //
  270. // The following simple structure is used to send a pointer
  271. // the device extension and an ioctl specific pointer
  272. // to data.
  273. //
  274. typedef struct _SERIAL_IOCTL_SYNC
  275. {
  276. PPORT_DEVICE_EXTENSION pPort;
  277. PVOID Data;
  278. } SERIAL_IOCTL_SYNC,*PSERIAL_IOCTL_SYNC;
  279. //
  280. // The following three macros are used to initialize, set
  281. // and clear references in IRPs that are used by
  282. // this driver. The reference is stored in the fourth
  283. // argument of the irp, which is never used by any operation
  284. // accepted by this driver.
  285. //
  286. #define SERIAL_REF_ISR (0x00000001)
  287. #define SERIAL_REF_CANCEL (0x00000002)
  288. #define SERIAL_REF_TOTAL_TIMER (0x00000004)
  289. #define SERIAL_REF_INT_TIMER (0x00000008)
  290. #define SERIAL_REF_XOFF_REF (0x00000010)
  291. #define SERIAL_REF_COMPLETING (0x00000020)
  292. #define SERIAL_INIT_REFERENCE(Irp) { \
  293. ASSERT(sizeof(LONG) <= sizeof(PVOID)); \
  294. IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4 = NULL; \
  295. }
  296. #define SERIAL_SET_REFERENCE(Irp,RefType) \
  297. do { \
  298. LONG _refType = (RefType); \
  299. PLONG _arg4 = (PVOID)&IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4; \
  300. ASSERT(!(*_arg4 & _refType)); \
  301. *_arg4 |= _refType; \
  302. } while (0)
  303. #define SERIAL_CLEAR_REFERENCE(Irp,RefType) \
  304. do { \
  305. LONG _refType = (RefType); \
  306. PLONG _arg4 = (PVOID)&IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4; \
  307. ASSERT(*_arg4 & _refType); \
  308. *_arg4 &= ~_refType; \
  309. } while (0)
  310. #define SERIAL_REFERENCE_COUNT(Irp) \
  311. ((LONG)((IoGetCurrentIrpStackLocation((Irp))->Parameters.Others.Argument4)))
  312. #endif // End SERIALP_H