prevent buffer overflow, LoadString accepts the size of the buffer in TCHARs, not...
[reactos.git] / reactos / drivers / dd / green / pnp.c
1 /* $Id:
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS VT100 emulator
5 * FILE: drivers/dd/green/pnp.c
6 * PURPOSE: IRP_MJ_PNP operations
7 *
8 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.com)
9 */
10
11 #define NDEBUG
12 #include "green.h"
13
14 NTSTATUS STDCALL
15 GreenAddDevice(
16 IN PDRIVER_OBJECT DriverObject,
17 IN PDEVICE_OBJECT Pdo)
18 {
19 PDEVICE_OBJECT Fdo = NULL;
20 PGREEN_DEVICE_EXTENSION DeviceExtension;
21 UNICODE_STRING serialPortName;
22 NTSTATUS Status;
23
24 DPRINT("Green: AddDevice(DriverObject %p, Pdo %p)\n", DriverObject, Pdo);
25
26 /* Create green FDO */
27 Status = IoCreateDevice(DriverObject,
28 sizeof(GREEN_DEVICE_EXTENSION),
29 NULL,
30 FILE_DEVICE_UNKNOWN,
31 FILE_DEVICE_SECURE_OPEN,
32 TRUE,
33 &Fdo);
34 if (!NT_SUCCESS(Status))
35 return Status;
36
37 DeviceExtension = (PGREEN_DEVICE_EXTENSION)Fdo->DeviceExtension;
38 RtlZeroMemory(DeviceExtension, sizeof(GREEN_DEVICE_EXTENSION));
39 DeviceExtension->Common.Type = Green;
40
41 Status = KeyboardInitialize(DriverObject, &DeviceExtension->Keyboard);
42 if (!NT_SUCCESS(Status))
43 {
44 IoDeleteDevice(Fdo);
45 return Status;
46 }
47 ((PKEYBOARD_DEVICE_EXTENSION)DeviceExtension->Keyboard->DeviceExtension)->Green = Fdo;
48
49 Status = ScreenInitialize(DriverObject, &DeviceExtension->Screen);
50 if (!NT_SUCCESS(Status))
51 {
52 IoDeleteDevice(DeviceExtension->Keyboard);
53 IoDeleteDevice(Fdo);
54 return Status;
55 }
56 ((PSCREEN_DEVICE_EXTENSION)DeviceExtension->Screen->DeviceExtension)->Green = Fdo;
57
58 /* initialize green Fdo */
59 DeviceExtension->LowerDevice = IoAttachDeviceToDeviceStack(Fdo, Pdo);
60 DeviceExtension->LineControl.WordLength = 8;
61 DeviceExtension->LineControl.Parity = NO_PARITY;
62 DeviceExtension->LineControl.StopBits = STOP_BIT_1;
63 DeviceExtension->BaudRate = SERIAL_BAUD_38400;
64 DeviceExtension->Timeouts.ReadTotalTimeoutConstant = 1; /* not null */
65 DeviceExtension->Timeouts.ReadIntervalTimeout = INFINITE;
66 DeviceExtension->Timeouts.ReadTotalTimeoutMultiplier = INFINITE;
67 DeviceExtension->Timeouts.WriteTotalTimeoutMultiplier = 0; /* FIXME */
68 DeviceExtension->Timeouts.WriteTotalTimeoutConstant = 0; /* FIXME */
69
70 /* open associated serial port */
71 RtlInitUnicodeString(&serialPortName, L"\\Device\\Serial1"); /* FIXME: don't hardcode string */
72 Status = ObReferenceObjectByName(
73 &serialPortName,
74 OBJ_EXCLUSIVE | OBJ_KERNEL_HANDLE,
75 NULL,
76 (ACCESS_MASK)0,
77 IoDeviceObjectType,
78 KernelMode,
79 NULL,
80 (PVOID*)&DeviceExtension->Serial);
81 /* FIXME: we never ObDereferenceObject */
82
83 Fdo->Flags |= DO_POWER_PAGABLE | DO_BUFFERED_IO;
84 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
85
86 return Status;
87 }