Sync with trunk r58740.
[reactos.git] / drivers / sac / driver / init.c
1 /*
2 * PROJECT: ReactOS Boot Loader
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/sac/driver/init.c
5 * PURPOSE: Driver for the Server Administration Console (SAC) for EMS
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "sacdrv.h"
12
13 /* GLOBALS ********************************************************************/
14
15 /* FUNCTIONS ******************************************************************/
16
17 NTSTATUS
18 NTAPI
19 DriverEntry(
20 IN PDRIVER_OBJECT DriverObject,
21 IN PUNICODE_STRING RegistryPath
22 )
23 {
24 HEADLESS_RSP_QUERY_INFO HeadlessInformation;
25 ULONG InfoSize;
26 NTSTATUS Status;
27 UNICODE_STRING DriverName;
28 PDEVICE_OBJECT DeviceObject;
29 PSAC_DEVICE_EXTENSION DeviceExtension;
30 PAGED_CODE();
31
32 SAC_DBG(SAC_DBG_ENTRY_EXIT, "Entering.\n");
33
34 HeadlessDispatch(
35 HeadlessCmdQueryInformation,
36 NULL,
37 0,
38 &HeadlessInformation,
39 &InfoSize
40 );
41 if ((HeadlessInformation.Serial.TerminalType != HeadlessUndefinedPortType) &&
42 ((HeadlessInformation.Serial.TerminalType != HeadlessSerialPort) ||
43 (HeadlessInformation.Serial.TerminalAttached)))
44 {
45 RtlInitUnicodeString(&DriverName, L"\\Device\\SAC");
46
47 Status = IoCreateDevice(
48 DriverObject,
49 sizeof(SAC_DEVICE_EXTENSION),
50 &DriverName,
51 FILE_DEVICE_UNKNOWN,
52 FILE_DEVICE_SECURE_OPEN,
53 FALSE,
54 &DeviceObject
55 );
56 if (NT_SUCCESS(Status))
57 {
58 DeviceExtension = DeviceObject->DeviceExtension;
59 DeviceExtension->Initialized = FALSE;
60
61 RtlFillMemoryUlong(
62 DriverObject->MajorFunction,
63 sizeof(DriverObject->MajorFunction) / sizeof(PVOID),
64 (ULONG_PTR)Dispatch);
65 DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
66 DispatchDeviceControl;
67 DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] =
68 DispatchShutdownControl;
69 DriverObject->FastIoDispatch = NULL;
70 DriverObject->DriverUnload = UnloadHandler;
71
72 if (InitializeGlobalData(RegistryPath, DriverObject))
73 {
74 if (InitializeDeviceData(DeviceObject))
75 {
76 IoRegisterShutdownNotification(DeviceObject);
77 return Status;
78 }
79 }
80
81 Status = STATUS_INSUFFICIENT_RESOURCES;
82 }
83 else
84 {
85 SAC_DBG(SAC_DBG_INIT, "unable to create device object: %X\n", Status);
86 }
87
88 FreeGlobalData();
89 SAC_DBG(SAC_DBG_ENTRY_EXIT, "Exiting with status 0x%x\n", Status);
90 return Status;
91 }
92
93 return STATUS_PORT_DISCONNECTED;
94 }