ReactOS  0.4.15-dev-1397-g19779b3
pnp.c File Reference
#include "serial.h"
#include <stdio.h>
#include <ndk/haltypes.h>
#include <debug.h>
Include dependency graph for pnp.c:

Go to the source code of this file.

Functions

NTSTATUS NTAPI SerialAddDeviceInternal (IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo, IN UART_TYPE UartType, IN PULONG pComPortNumber OPTIONAL, OUT PDEVICE_OBJECT *pFdo OPTIONAL)
 
NTSTATUS NTAPI SerialAddDevice (IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT Pdo)
 
NTSTATUS NTAPI SerialPnpStartDevice (IN PDEVICE_OBJECT DeviceObject, IN PCM_RESOURCE_LIST ResourceList, IN PCM_RESOURCE_LIST ResourceListTranslated)
 
NTSTATUS NTAPI SerialPnp (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
 

Function Documentation

◆ SerialAddDevice()

NTSTATUS NTAPI SerialAddDevice ( IN PDRIVER_OBJECT  DriverObject,
IN PDEVICE_OBJECT  Pdo 
)

Definition at line 118 of file pnp.c.

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 }
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_ WDFDRIVER _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT Pdo
Definition: wdfminiport.h:64
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
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 NULL
Definition: types.h:112
#define STATUS_SUCCESS
Definition: shellext.h:65

◆ SerialAddDeviceInternal()

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 at line 18 of file pnp.c.

24 {
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);
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 
99  Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
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);
113  }
114  return Status;
115 }
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
#define DO_POWER_PAGABLE
SERIAL_DEVICE_STATE PnpState
Definition: serial.h:52
CIRCULAR_BUFFER OutputBuffer
Definition: serial.h:77
NTSTATUS FreeCircularBuffer(IN PCIRCULAR_BUFFER pBuffer)
PCONFIGURATION_INFORMATION NTAPI IoGetConfigurationInformation(VOID)
Definition: iorsrce.c:830
#define IoInitializeRemoveLock(Lock, AllocateTag, MaxLockedMinutes, HighWatermark)
Definition: iofuncs.h:2829
VOID NTAPI SerialCompleteIrp(IN PKDPC Dpc, IN PVOID pDeviceExtension, IN PVOID pIrp, IN PVOID Unused)
Definition: misc.c:145
LONG NTSTATUS
Definition: precomp.h:26
UNICODE_STRING SerialInterfaceName
Definition: serial.h:80
KSPIN_LOCK InputBufferLock
Definition: serial.h:76
PDEVICE_OBJECT Pdo
Definition: serial.h:50
#define DO_DIRECT_IO
Definition: env_spec_w32.h:396
KEVENT InputBufferNotEmpty
Definition: serial.h:74
KSPIN_LOCK OutputBufferLock
Definition: serial.h:78
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3272
#define FALSE
Definition: types.h:117
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_ WDFDRIVER _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT Pdo
Definition: wdfminiport.h:64
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
Definition: kefuncs.h:238
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
#define SERIAL_TAG
Definition: serial.h:100
Status
Definition: gdiplustypes.h:24
#define TRACE_(x)
Definition: compat.h:76
FxDevice * pFdo
#define ASSERT(a)
Definition: mode.c:45
__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
_Must_inspect_result_ _In_ WDFDEVICE Fdo
Definition: wdffdo.h:461
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
IO_REMOVE_LOCK RemoveLock
Definition: serial.h:53
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1251
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 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 NULL
Definition: types.h:112
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
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)
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
PDEVICE_OBJECT LowerDevice
Definition: serial.h:51
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define STATUS_SUCCESS
Definition: shellext.h:65
VOID NTAPI KeInitializeDpc(IN PKDPC Dpc, IN PKDEFERRED_ROUTINE DeferredRoutine, IN PVOID DeferredContext)
Definition: dpc.c:711
#define FILE_DEVICE_SERIAL_PORT
Definition: serial.c:44
#define WARN_(ch,...)
Definition: debug.h:157
UART_TYPE UartType
Definition: serial.h:66

Referenced by SerialAddDevice().

◆ SerialPnp()

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

Definition at line 327 of file pnp.c.

330 {
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 
370  ASSERT(((PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->PnpState == dsStopped);
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 IRP_MN_FILTER_RESOURCE_REQUIREMENTS
DRIVER_DISPATCH ForwardIrpAndForget
Definition: i8042prt.h:341
LONG NTSTATUS
Definition: precomp.h:26
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
Definition: wdfrequest.h:1044
uint32_t ULONG_PTR
Definition: typedefs.h:65
_In_ WDFREQUEST _In_ PIO_STACK_LOCATION Stack
Definition: wdfrequest.h:636
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_In_ PIRP Irp
Definition: csq.h:116
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1697
#define IoCompleteRequest
Definition: irp.c:1240
Status
Definition: gdiplustypes.h:24
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:76
#define ASSERT(a)
Definition: mode.c:45
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define IRP_MN_START_DEVICE
DRIVER_DISPATCH ForwardIrpAndWait
Definition: i8042prt.h:343
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2789
#define IRP_MN_QUERY_DEVICE_RELATIONS
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581

◆ SerialPnpStartDevice()

NTSTATUS NTAPI SerialPnpStartDevice ( IN PDEVICE_OBJECT  DeviceObject,
IN PCM_RESOURCE_LIST  ResourceList,
IN PCM_RESOURCE_LIST  ResourceListTranslated 
)

Definition at line 136 of file pnp.c.

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 
161  DeviceExtension = (PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
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 }
#define STATUS_REVISION_MISMATCH
Definition: ntstatus.h:325
NTSTATUS NTAPI SerialSetLineControl(IN PSERIAL_DEVICE_EXTENSION DeviceExtension, IN PSERIAL_LINE_CONTROL NewSettings)
Definition: devctrl.c:88
SERIAL_DEVICE_STATE PnpState
Definition: serial.h:52
#define SER_FCR(x)
Definition: serial.h:127
#define ULongToPtr(ul)
Definition: basetsd.h:92
_In_ PKSERVICE_ROUTINE _In_opt_ PVOID _In_opt_ PKSPIN_LOCK _In_ ULONG _In_ KIRQL _In_ KIRQL _In_ KINTERRUPT_MODE InterruptMode
Definition: iofuncs.h:798
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
#define STOP_BIT_1
Definition: ntddser.h:215
#define INFO_(ch,...)
Definition: debug.h:159
#define KEY_SET_VALUE
Definition: nt_native.h:1017
#define OBJ_CASE_INSENSITIVE
Definition: winternl.h:228
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385::@388 Interrupt
#define READ_PORT_UCHAR(p)
Definition: pc98vid.h:22
#define TRUE
Definition: types.h:120
NTSYSAPI NTSTATUS NTAPI ZwClose(_In_ HANDLE Handle)
#define SR_IER_MSR_CHANGE
Definition: serial.h:116
unsigned char * PUCHAR
Definition: retypes.h:3
SERIAL_LINE_CONTROL SerialLineControl
Definition: serial.h:65
LONG NTSTATUS
Definition: precomp.h:26
KSERVICE_ROUTINE SerialInterruptService
Definition: serial.h:273
#define SR_IER_THR_EMPTY
Definition: serial.h:114
UNICODE_STRING SerialInterfaceName
Definition: serial.h:80
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385::@387 Port
_Must_inspect_result_ _In_ WDFIORESREQLIST _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFIORESLIST * ResourceList
Definition: wdfresource.h:304
#define CmResourceTypePort
Definition: hwresource.cpp:123
#define SER_MSR(x)
Definition: serial.h:161
UCHAR KIRQL
Definition: env_spec_w32.h:591
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@385 u
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3272
#define SR_IER_DATA_RECEIVED
Definition: serial.h:113
#define SR_FCR_CLEAR_XMIT
Definition: serial.h:130
#define FALSE
Definition: types.h:117
#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
unsigned char BOOLEAN
enum _KINTERRUPT_MODE KINTERRUPT_MODE
#define SR_MCR_RTS
Definition: serial.h:151
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
Definition: deviface.c:1311
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING KeyName
Definition: wdfdevice.h:2697
Status
Definition: gdiplustypes.h:24
NTSTATUS NTAPI SerialSetBaudRate(IN PSERIAL_DEVICE_EXTENSION DeviceExtension, IN ULONG NewBaudRate)
Definition: devctrl.c:50
PUCHAR KdComPortInUse
Definition: usage.c:17
#define ASSERT(a)
Definition: mode.c:45
if(!(yy_init))
Definition: macro.lex.yy.c:714
__wchar_t WCHAR
Definition: xmlstorage.h:180
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define swprintf(buf, format,...)
Definition: sprintf.c:56
_In_ ULONG _In_ ULONG _In_ ULONG _Out_ PKIRQL _Out_ PKAFFINITY Affinity
Definition: halfuncs.h:170
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
unsigned char UCHAR
Definition: xmlstorage.h:181
static const WCHAR L[]
Definition: oid.c:1250
#define WRITE_PORT_UCHAR(p, d)
Definition: pc98vid.h:21
PKINTERRUPT Interrupt
Definition: serial.h:60
#define SR_FCR_CLEAR_RCVR
Definition: serial.h:129
#define NO_PARITY
Definition: serial.c:89
struct _SERIAL_DEVICE_EXTENSION * PSERIAL_DEVICE_EXTENSION
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
#define SER_MCR(x)
Definition: serial.h:149
FxAutoRegKey hKey
ULONG_PTR KAFFINITY
Definition: compat.h:85
#define SR_MCR_DTR
Definition: serial.h:150
UART_TYPE SerialDetectUartType(IN PUCHAR BaseAddress)
Definition: legacy.c:16
#define NULL
Definition: types.h:112
#define SER_IER(x)
Definition: serial.h:112
#define CmResourceTypeInterrupt
Definition: hwresource.cpp:124
#define CM_RESOURCE_INTERRUPT_LATCHED
Definition: cmtypes.h:144
unsigned int ULONG
Definition: retypes.h:1
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
#define STATUS_SUCCESS
Definition: shellext.h:65
#define REG_OPTION_VOLATILE
Definition: nt_native.h:1060
#define WARN_(ch,...)
Definition: debug.h:157
UART_TYPE UartType
Definition: serial.h:66
#define REG_SZ
Definition: layer.c:22

Referenced by SerialPnp().