ReactOS  0.4.14-dev-41-g31d7680
pnp.c
Go to the documentation of this file.
1 /*
2  * COPYRIGHT: See COPYING in the top level directory
3  * PROJECT: Serial port driver
4  * FILE: drivers/dd/serial/pnp.c
5  * PURPOSE: Serial IRP_MJ_PNP operations
6  *
7  * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
8  */
9 /* FIXME: call IoAcquireRemoveLock/IoReleaseRemoveLock around each I/O operation */
10 
11 #include "serial.h"
12 
13 #include <stdio.h>
14 #include <ndk/haltypes.h>
15 #include <debug.h>
16 
21  IN UART_TYPE UartType,
22  IN PULONG pComPortNumber OPTIONAL,
24 {
25  PDEVICE_OBJECT Fdo = NULL;
26  PSERIAL_DEVICE_EXTENSION DeviceExtension = NULL;
28  WCHAR DeviceNameBuffer[32];
30 
31  TRACE_(SERIAL, "SerialAddDeviceInternal()\n");
32 
34  ASSERT(Pdo);
35 
36  /* Create new device object */
37  swprintf(DeviceNameBuffer, L"\\Device\\Serial%lu", IoGetConfigurationInformation()->SerialCount);
38  RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
41  &DeviceName,
44  FALSE,
45  &Fdo);
46  if (!NT_SUCCESS(Status))
47  {
48  WARN_(SERIAL, "IoCreateDevice() failed with status 0x%08x\n", Status);
49  Fdo = NULL;
50  goto ByeBye;
51  }
52  DeviceExtension = (PSERIAL_DEVICE_EXTENSION)Fdo->DeviceExtension;
53  RtlZeroMemory(DeviceExtension, sizeof(SERIAL_DEVICE_EXTENSION));
54 
55  /* Register device interface */
56  Status = IoRegisterDeviceInterface(Pdo, &GUID_DEVINTERFACE_COMPORT, NULL, &DeviceExtension->SerialInterfaceName);
57  if (!NT_SUCCESS(Status))
58  {
59  WARN_(SERIAL, "IoRegisterDeviceInterface() failed with status 0x%08x\n", Status);
60  goto ByeBye;
61  }
62 
64  if (pComPortNumber == NULL)
65  DeviceExtension->ComPort = DeviceExtension->SerialPortNumber + 1;
66  else
67  DeviceExtension->ComPort = *pComPortNumber;
68  DeviceExtension->Pdo = Pdo;
69  DeviceExtension->PnpState = dsStopped;
70  DeviceExtension->UartType = UartType;
71  Status = InitializeCircularBuffer(&DeviceExtension->InputBuffer, 16);
72  if (!NT_SUCCESS(Status)) goto ByeBye;
73  Status = InitializeCircularBuffer(&DeviceExtension->OutputBuffer, 16);
74  if (!NT_SUCCESS(Status)) goto ByeBye;
75  IoInitializeRemoveLock(&DeviceExtension->RemoveLock, SERIAL_TAG, 0, 0);
76  KeInitializeSpinLock(&DeviceExtension->InputBufferLock);
77  KeInitializeSpinLock(&DeviceExtension->OutputBufferLock);
79  KeInitializeDpc(&DeviceExtension->ReceivedByteDpc, SerialReceiveByte, DeviceExtension);
80  KeInitializeDpc(&DeviceExtension->SendByteDpc, SerialSendByte, DeviceExtension);
81  KeInitializeDpc(&DeviceExtension->CompleteIrpDpc, SerialCompleteIrp, DeviceExtension);
82  Status = IoAttachDeviceToDeviceStackSafe(Fdo, Pdo, &DeviceExtension->LowerDevice);
83  if (!NT_SUCCESS(Status))
84  {
85  WARN_(SERIAL, "IoAttachDeviceToDeviceStackSafe() failed with status 0x%08x\n", Status);
86  goto ByeBye;
87  }
88  if (DeviceExtension->LowerDevice->Flags & DO_POWER_PAGABLE)
89  Fdo->Flags |= DO_POWER_PAGABLE;
90  if (DeviceExtension->LowerDevice->Flags & DO_BUFFERED_IO)
91  Fdo->Flags |= DO_BUFFERED_IO;
92  if (DeviceExtension->LowerDevice->Flags & DO_DIRECT_IO)
93  Fdo->Flags |= DO_DIRECT_IO;
94 
95  /* Choose default strategy */
96  if ((Fdo->Flags & (DO_BUFFERED_IO | DO_DIRECT_IO)) == 0)
97  Fdo->Flags |= DO_BUFFERED_IO;
98 
100  if (pFdo)
101  {
102  *pFdo = Fdo;
103  }
104 
105  return STATUS_SUCCESS;
106 
107 ByeBye:
108  if (Fdo)
109  {
110  FreeCircularBuffer(&DeviceExtension->InputBuffer);
111  FreeCircularBuffer(&DeviceExtension->OutputBuffer);
112  IoDeleteDevice(Fdo);
113  }
114  return Status;
115 }
116 
121 {
122  /* Serial.sys is a legacy driver. AddDevice is called once
123  * with a NULL Pdo just after the driver initialization.
124  * Detect this case and return success.
125  */
126  if (Pdo == NULL)
127  return STATUS_SUCCESS;
128 
129  /* We have here a PDO not null. It represents a real serial
130  * port. So call the internal AddDevice function.
131  */
133 }
134 
139  IN PCM_RESOURCE_LIST ResourceListTranslated)
140 {
141  PSERIAL_DEVICE_EXTENSION DeviceExtension;
142  WCHAR DeviceNameBuffer[32];
144  WCHAR LinkNameBuffer[32];
145  UNICODE_STRING LinkName;
146  WCHAR ComPortBuffer[32];
147  UNICODE_STRING ComPort;
148  ULONG Vector = 0;
149  ULONG i;
150  UCHAR IER;
151  KIRQL Dirql;
152  KAFFINITY Affinity = 0;
154  BOOLEAN ShareInterrupt = TRUE;
155  OBJECT_ATTRIBUTES objectAttributes;
156  PUCHAR ComPortBase;
158  HANDLE hKey;
160 
162 
163  ASSERT(DeviceExtension);
164 
165  if (!ResourceList)
166  {
167  WARN_(SERIAL, "No allocated resources sent to driver\n");
169  }
170  if (ResourceList->Count != 1)
171  {
172  WARN_(SERIAL, "Wrong number of allocated resources sent to driver\n");
174  }
175  if (ResourceList->List[0].PartialResourceList.Version != 1
176  || ResourceList->List[0].PartialResourceList.Revision != 1
177  || ResourceListTranslated->List[0].PartialResourceList.Version != 1
178  || ResourceListTranslated->List[0].PartialResourceList.Revision != 1)
179  {
180  WARN_(SERIAL, "Revision mismatch: %u.%u != 1.1 or %u.%u != 1.1\n",
181  ResourceList->List[0].PartialResourceList.Version,
182  ResourceList->List[0].PartialResourceList.Revision,
183  ResourceListTranslated->List[0].PartialResourceList.Version,
184  ResourceListTranslated->List[0].PartialResourceList.Revision);
186  }
187 
188  DeviceExtension->BaudRate = 19200;
189  DeviceExtension->BaseAddress = 0;
190  Dirql = 0;
191  for (i = 0; i < ResourceList->List[0].PartialResourceList.Count; i++)
192  {
193  PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptor = &ResourceList->List[0].PartialResourceList.PartialDescriptors[i];
194  PCM_PARTIAL_RESOURCE_DESCRIPTOR PartialDescriptorTranslated = &ResourceListTranslated->List[0].PartialResourceList.PartialDescriptors[i];
195  switch (PartialDescriptor->Type)
196  {
197  case CmResourceTypePort:
198  if (PartialDescriptor->u.Port.Length < 7)
200  if (DeviceExtension->BaseAddress != 0)
201  return STATUS_UNSUCCESSFUL;
202  DeviceExtension->BaseAddress = PartialDescriptor->u.Port.Start.u.LowPart;
203  break;
205  Dirql = (KIRQL)PartialDescriptorTranslated->u.Interrupt.Level;
206  Vector = PartialDescriptorTranslated->u.Interrupt.Vector;
207  Affinity = PartialDescriptorTranslated->u.Interrupt.Affinity;
208  if (PartialDescriptorTranslated->Flags & CM_RESOURCE_INTERRUPT_LATCHED)
210  else
212  ShareInterrupt = (PartialDescriptorTranslated->ShareDisposition == CmResourceShareShared);
213  break;
214  }
215  }
216  INFO_(SERIAL, "New COM port. Base = 0x%lx, Irql = %u\n",
217  DeviceExtension->BaseAddress, Dirql);
218  if (!DeviceExtension->BaseAddress)
220  if (!Dirql)
222  ComPortBase = ULongToPtr(DeviceExtension->BaseAddress);
223 
224  /* Test if we are trying to start the serial port used for debugging */
225  INFO_(SERIAL, "Comparing addresses: KdComPortInUse: %p, ComPortBase: %p\n", KdComPortInUse, ComPortBase);
226  if (KdComPortInUse == ComPortBase)
227  {
228  INFO_(SERIAL, "Failing IRP_MN_START_DEVICE as this serial port is used for debugging\n");
230  }
231 
232  if (DeviceExtension->UartType == UartUnknown)
233  DeviceExtension->UartType = SerialDetectUartType(ComPortBase);
234 
235  /* Get current settings */
236  DeviceExtension->MCR = READ_PORT_UCHAR(SER_MCR(ComPortBase));
237  DeviceExtension->MSR = READ_PORT_UCHAR(SER_MSR(ComPortBase));
238  DeviceExtension->WaitMask = 0;
239 
240  /* Set baud rate */
241  Status = SerialSetBaudRate(DeviceExtension, DeviceExtension->BaudRate);
242  if (!NT_SUCCESS(Status))
243  {
244  WARN_(SERIAL, "SerialSetBaudRate() failed with status 0x%08x\n", Status);
245  return Status;
246  }
247 
248  /* Set line control */
249  DeviceExtension->SerialLineControl.StopBits = STOP_BIT_1;
250  DeviceExtension->SerialLineControl.Parity = NO_PARITY;
251  DeviceExtension->SerialLineControl.WordLength = 8;
252  Status = SerialSetLineControl(DeviceExtension, &DeviceExtension->SerialLineControl);
253  if (!NT_SUCCESS(Status))
254  {
255  WARN_(SERIAL, "SerialSetLineControl() failed with status 0x%08x\n", Status);
256  return Status;
257  }
258 
259  /* Clear receive/transmit buffers */
260  if (DeviceExtension->UartType >= Uart16550A)
261  {
262  /* 16550 UARTs also have FIFO queues, but they are unusable due to a bug */
263  WRITE_PORT_UCHAR(SER_FCR(ComPortBase),
265  }
266 
267  /* Create link \DosDevices\COMX -> \Device\SerialX */
268  swprintf(DeviceNameBuffer, L"\\Device\\Serial%lu", DeviceExtension->SerialPortNumber);
269  swprintf(LinkNameBuffer, L"\\DosDevices\\COM%lu", DeviceExtension->ComPort);
270  swprintf(ComPortBuffer, L"COM%lu", DeviceExtension->ComPort);
271  RtlInitUnicodeString(&DeviceName, DeviceNameBuffer);
272  RtlInitUnicodeString(&LinkName, LinkNameBuffer);
273  RtlInitUnicodeString(&ComPort, ComPortBuffer);
274  Status = IoCreateSymbolicLink(&LinkName, &DeviceName);
275  if (!NT_SUCCESS(Status))
276  {
277  WARN_(SERIAL, "IoCreateSymbolicLink() failed with status 0x%08x\n", Status);
278  return Status;
279  }
280 
281  /* Connect interrupt and enable them */
283  &DeviceExtension->Interrupt, SerialInterruptService,
285  Vector, Dirql, Dirql,
286  InterruptMode, ShareInterrupt,
287  Affinity, FALSE);
288  if (!NT_SUCCESS(Status))
289  {
290  WARN_(SERIAL, "IoConnectInterrupt() failed with status 0x%08x\n", Status);
292  IoDeleteSymbolicLink(&LinkName);
293  return Status;
294  }
295 
296  /* Write an entry value under HKLM\HARDWARE\DeviceMap\SERIALCOMM */
297  /* This step is not mandatory, so don't exit in case of error */
298  RtlInitUnicodeString(&KeyName, L"\\Registry\\Machine\\HARDWARE\\DeviceMap\\SERIALCOMM");
300  Status = ZwCreateKey(&hKey, KEY_SET_VALUE, &objectAttributes, 0, NULL, REG_OPTION_VOLATILE, NULL);
301  if (NT_SUCCESS(Status))
302  {
303  /* Key = \Device\Serialx, Value = COMx */
304  ZwSetValueKey(hKey, &DeviceName, 0, REG_SZ, ComPortBuffer, ComPort.Length + sizeof(WCHAR));
305  ZwClose(hKey);
306  }
307 
308  DeviceExtension->PnpState = dsStarted;
309 
310  /* Activate interrupt modes */
311  IER = READ_PORT_UCHAR(SER_IER(ComPortBase));
313  WRITE_PORT_UCHAR(SER_IER(ComPortBase), IER);
314 
315  /* Activate DTR, RTS */
316  DeviceExtension->MCR |= SR_MCR_DTR | SR_MCR_RTS;
317  WRITE_PORT_UCHAR(SER_MCR(ComPortBase), DeviceExtension->MCR);
318 
319  /* Activate serial interface */
321  /* We don't really care if the call succeeded or not... */
322 
323  return STATUS_SUCCESS;
324 }
325 
329  IN PIRP Irp)
330 {
332  PIO_STACK_LOCATION Stack;
335 
337  MinorFunction = Stack->MinorFunction;
338 
339  switch (MinorFunction)
340  {
341  /* FIXME: do all these minor functions
342  IRP_MN_QUERY_REMOVE_DEVICE 0x1
343  IRP_MN_REMOVE_DEVICE 0x2
344  {
345  TRACE_(SERIAL, "IRP_MJ_PNP / IRP_MN_REMOVE_DEVICE\n");
346  IoAcquireRemoveLock
347  IoReleaseRemoveLockAndWait
348  pass request to DeviceExtension-LowerDriver
349  disable interface
350  IoDeleteDevice(Fdo) and/or IoDetachDevice
351  break;
352  }
353  IRP_MN_CANCEL_REMOVE_DEVICE 0x3
354  IRP_MN_STOP_DEVICE 0x4
355  IRP_MN_QUERY_STOP_DEVICE 0x5
356  IRP_MN_CANCEL_STOP_DEVICE 0x6
357  IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations (optional) 0x7
358  IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations (optional) 0x7
359  IRP_MN_QUERY_INTERFACE (optional) 0x8
360  IRP_MN_QUERY_CAPABILITIES (optional) 0x9
361  IRP_MN_FILTER_RESOURCE_REQUIREMENTS (optional) 0xd
362  IRP_MN_QUERY_PNP_DEVICE_STATE (optional) 0x14
363  IRP_MN_DEVICE_USAGE_NOTIFICATION (required or optional) 0x16
364  IRP_MN_SURPRISE_REMOVAL 0x17
365  */
366  case IRP_MN_START_DEVICE: /* 0x0 */
367  {
368  TRACE_(SERIAL, "IRP_MJ_PNP / IRP_MN_START_DEVICE\n");
369 
371 
372  /* Call lower driver */
374  if (NT_SUCCESS(Status))
376  DeviceObject,
377  Stack->Parameters.StartDevice.AllocatedResources,
378  Stack->Parameters.StartDevice.AllocatedResourcesTranslated);
379  break;
380  }
381  case IRP_MN_QUERY_DEVICE_RELATIONS: /* (optional) 0x7 */
382  {
383  switch (Stack->Parameters.QueryDeviceRelations.Type)
384  {
385  case BusRelations:
386  {
387  TRACE_(SERIAL, "IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / BusRelations\n");
389  }
390  case RemovalRelations:
391  {
392  TRACE_(SERIAL, "IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / RemovalRelations\n");
394  }
395  default:
396  TRACE_(SERIAL, "IRP_MJ_PNP / IRP_MN_QUERY_DEVICE_RELATIONS / Unknown type 0x%lx\n",
397  Stack->Parameters.QueryDeviceRelations.Type);
399  }
400  break;
401  }
402  case IRP_MN_FILTER_RESOURCE_REQUIREMENTS: /* (optional) 0xd */
403  {
404  TRACE_(SERIAL, "IRP_MJ_PNP / IRP_MN_FILTER_RESOURCE_REQUIREMENTS\n");
406  }
407  default:
408  {
409  TRACE_(SERIAL, "Unknown minor function 0x%x\n", MinorFunction);
411  }
412  }
413 
414  Irp->IoStatus.Information = Information;
415  Irp->IoStatus.Status = Status;
417  return Status;
418 }
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:311
NTSTATUS NTAPI SerialSetLineControl(IN PSERIAL_DEVICE_EXTENSION DeviceExtension, IN PSERIAL_LINE_CONTROL NewSettings)
Definition: devctrl.c:88
#define DO_POWER_PAGABLE
_Must_inspect_result_ _Out_ PNDIS_STATUS _In_ NDIS_HANDLE _In_ ULONG _Out_ PNDIS_STRING KeyName
Definition: ndis.h:4711
SERIAL_DEVICE_STATE PnpState
Definition: serial.h:52
#define IN
Definition: typedefs.h:38
#define TRUE
Definition: types.h:120
#define SER_FCR(x)
Definition: serial.h:127
#define ULongToPtr(ul)
Definition: basetsd.h:92
CIRCULAR_BUFFER OutputBuffer
Definition: serial.h:77
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE InterruptMode
Definition: iofuncs.h:798
NTSTATUS FreeCircularBuffer(IN PCIRCULAR_BUFFER pBuffer)
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT Pdo
Definition: classpnp.h:301
#define STOP_BIT_1
Definition: ntddser.h:215
#define INFO_(ch,...)
Definition: debug.h:159
#define KEY_SET_VALUE
Definition: nt_native.h:1017
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Definition: iorsrce.c:830
_In_ PIRP Irp
Definition: csq.h:116
#define IoInitializeRemoveLock(Lock, AllocateTag, MaxLockedMinutes, HighWatermark)
Definition: iofuncs.h:2785
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define IRP_MN_FILTER_RESOURCE_REQUIREMENTS
#define SR_IER_MSR_CHANGE
Definition: serial.h:116
VOID NTAPI SerialCompleteIrp(IN PKDPC Dpc, IN PVOID pDeviceExtension, IN PVOID pIrp, IN PVOID Unused)
Definition: misc.c:145
unsigned char * PUCHAR
Definition: retypes.h:3
SERIAL_LINE_CONTROL SerialLineControl
Definition: serial.h:65
UCHAR NTAPI READ_PORT_UCHAR(PUCHAR Address)
Definition: mach.c:528
DRIVER_DISPATCH ForwardIrpAndForget
Definition: i8042prt.h:341
LONG NTSTATUS
Definition: precomp.h:26
NTSTATUS NTAPI SerialPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: pnp.c:327
KSERVICE_ROUTINE SerialInterruptService
Definition: serial.h:273
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@371::@374 Interrupt
#define SR_IER_THR_EMPTY
Definition: serial.h:114
UNICODE_STRING SerialInterfaceName
Definition: serial.h:80
KSPIN_LOCK InputBufferLock
Definition: serial.h:76
WCHAR DeviceName[]
Definition: adapter.cpp:21
PDEVICE_OBJECT Pdo
Definition: serial.h:50
const MUI_LANGUAGE_RESOURCE ResourceList[]
Definition: muilanguages.h:414
#define CmResourceTypePort
Definition: hwresource.cpp:123
#define DO_DIRECT_IO
Definition: env_spec_w32.h:396
#define SER_MSR(x)
Definition: serial.h:161
uint32_t ULONG_PTR
Definition: typedefs.h:63
KEVENT InputBufferNotEmpty
Definition: serial.h:74
UCHAR KIRQL
Definition: env_spec_w32.h:591
KSPIN_LOCK OutputBufferLock
Definition: serial.h:78
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
Definition: glfuncs.h:248
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
#define SR_IER_DATA_RECEIVED
Definition: serial.h:113
#define SR_FCR_CLEAR_XMIT
Definition: serial.h:130
#define SR_IER_LSR_CHANGE
Definition: serial.h:115
NTSTATUS NTAPI IoConnectInterrupt(OUT PKINTERRUPT *InterruptObject, IN PKSERVICE_ROUTINE ServiceRoutine, IN PVOID ServiceContext, IN PKSPIN_LOCK SpinLock, IN ULONG Vector, IN KIRQL Irql, IN KIRQL SynchronizeIrql, IN KINTERRUPT_MODE InterruptMode, IN BOOLEAN ShareVector, IN KAFFINITY ProcessorEnableMask, IN BOOLEAN FloatingSave)
Definition: irq.c:22
#define IER
Definition: serial_port.h:62
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:251
PVOID DeviceExtension
Definition: env_spec_w32.h:418
unsigned char BOOLEAN
smooth NULL
Definition: ftsmooth.c:416
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@371 u
enum _KINTERRUPT_MODE KINTERRUPT_MODE
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@371::@373 Port
#define SR_MCR_RTS
Definition: serial.h:151
static PDRIVER_OBJECT DriverObject
Definition: template.c:42
#define IoCompleteRequest
Definition: irp.c:1240
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
Definition: deviface.c:1311
#define SERIAL_TAG
Definition: serial.h:100
NTSTATUS NTAPI SerialPnpStartDevice(IN PDEVICE_OBJECT DeviceObject, IN PCM_RESOURCE_LIST ResourceList, IN PCM_RESOURCE_LIST ResourceListTranslated)
Definition: pnp.c:136
#define TRACE_(x)
Definition: compat.h:66
NTSTATUS NTAPI SerialSetBaudRate(IN PSERIAL_DEVICE_EXTENSION DeviceExtension, IN ULONG NewBaudRate)
Definition: devctrl.c:50
PUCHAR KdComPortInUse
Definition: usage.c:17
if(!(yy_init))
Definition: macro.lex.yy.c:714
__wchar_t WCHAR
Definition: xmlstorage.h:180
NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject)
Definition: device.c:980
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define DO_BUFFERED_IO
Definition: env_spec_w32.h:394
#define swprintf(buf, format,...)
Definition: sprintf.c:56
#define IRP_MN_START_DEVICE
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
Definition: halfuncs.h:170
DRIVER_DISPATCH ForwardIrpAndWait
Definition: i8042prt.h:343
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
unsigned char UCHAR
Definition: xmlstorage.h:181
static const WCHAR L[]
Definition: oid.c:1250
VOID NTAPI SerialReceiveByte(IN PKDPC Dpc, IN PVOID pDeviceExtension, IN PVOID Unused1, IN PVOID Unused2)
Definition: misc.c:70
_In_ UCHAR MinorFunction
Definition: pofuncs.h:42
UART_TYPE
Definition: serial.h:29
IO_REMOVE_LOCK RemoveLock
Definition: serial.h:53
Status
Definition: gdiplustypes.h:24
PKINTERRUPT Interrupt
Definition: serial.h:60
IN PDEVICE_OBJECT DeviceObject
Definition: fatprocs.h:1560
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2745
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
#define SR_FCR_CLEAR_RCVR
Definition: serial.h:129
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
Definition: deviface.c:955
#define NO_PARITY
Definition: serial.c:89
#define KeInitializeEvent(pEvt, foo, foo2)
Definition: env_spec_w32.h:477
NTSTATUS InitializeCircularBuffer(IN PCIRCULAR_BUFFER pBuffer, IN ULONG BufferSize)
struct _SERIAL_DEVICE_EXTENSION * PSERIAL_DEVICE_EXTENSION
#define SER_MCR(x)
Definition: serial.h:149
ULONG_PTR KAFFINITY
Definition: compat.h:75
NTSTATUS NTAPI SerialAddDeviceInternal(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo, IN UART_TYPE UartType, IN PULONG pComPortNumber OPTIONAL, OUT PDEVICE_OBJECT *pFdo OPTIONAL)
Definition: pnp.c:18
#define SR_MCR_DTR
Definition: serial.h:150
UART_TYPE SerialDetectUartType(IN PUCHAR BaseAddress)
Definition: legacy.c:16
unsigned int * PULONG
Definition: retypes.h:1
#define SER_IER(x)
Definition: serial.h:112
#define IRP_MN_QUERY_DEVICE_RELATIONS
#define CmResourceTypeInterrupt
Definition: hwresource.cpp:124
VOID NTAPI SerialSendByte(IN PKDPC Dpc, IN PVOID pDeviceExtension, IN PVOID Unused1, IN PVOID Unused2)
Definition: misc.c:107
CIRCULAR_BUFFER InputBuffer
Definition: serial.h:75
#define OUT
Definition: typedefs.h:39
#define CM_RESOURCE_INTERRUPT_LATCHED
Definition: cmtypes.h:144
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:566
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1031
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
void WRITE_PORT_UCHAR(PUCHAR Address, UCHAR Value)
Definition: mach.c:532
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
PDEVICE_OBJECT LowerDevice
Definition: serial.h:51
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
NTSTATUS NTAPI SerialAddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo)
Definition: pnp.c:118
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
Definition: iotypes.h:2772
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:711
return STATUS_SUCCESS
Definition: btrfs.c:2966
#define FILE_DEVICE_SERIAL_PORT
Definition: serial.c:44
#define WARN_(ch,...)
Definition: debug.h:157
UART_TYPE UartType
Definition: serial.h:66
Iosb Information
Definition: create.c:4377
#define REG_SZ
Definition: layer.c:22
PULONG MinorVersion OPTIONAL
Definition: CrossNt.h:68