mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 10:04:49 +00:00
92 lines
3.4 KiB
C
92 lines
3.4 KiB
C
/*
|
|
* PROJECT: ReactOS Drivers
|
|
* LICENSE: BSD - See COPYING.ARM in the top level directory
|
|
* FILE: drivers/sac/driver/init.c
|
|
* PURPOSE: Driver for the Server Administration Console (SAC) for EMS
|
|
* PROGRAMMERS: ReactOS Portable Systems Group
|
|
*/
|
|
|
|
/* INCLUDES *******************************************************************/
|
|
|
|
#include "sacdrv.h"
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
NTSTATUS
|
|
NTAPI
|
|
DriverEntry(IN PDRIVER_OBJECT DriverObject,
|
|
IN PUNICODE_STRING RegistryPath)
|
|
{
|
|
HEADLESS_RSP_QUERY_INFO HeadlessInformation;
|
|
SIZE_T InfoSize = sizeof(HeadlessInformation);
|
|
NTSTATUS Status;
|
|
UNICODE_STRING DriverName;
|
|
PDEVICE_OBJECT DeviceObject;
|
|
PSAC_DEVICE_EXTENSION DeviceExtension;
|
|
PAGED_CODE();
|
|
SAC_DBG(SAC_DBG_ENTRY_EXIT, "Entering.\n");
|
|
|
|
/* Check if EMS is enabled in the kernel */
|
|
HeadlessDispatch(HeadlessCmdQueryInformation,
|
|
NULL,
|
|
0,
|
|
&HeadlessInformation,
|
|
&InfoSize);
|
|
if ((HeadlessInformation.PortType != HeadlessUndefinedPortType) &&
|
|
((HeadlessInformation.PortType != HeadlessSerialPort) ||
|
|
(HeadlessInformation.Serial.TerminalAttached)))
|
|
{
|
|
/* It is, so create the device */
|
|
RtlInitUnicodeString(&DriverName, L"\\Device\\SAC");
|
|
Status = IoCreateDevice(DriverObject,
|
|
sizeof(SAC_DEVICE_EXTENSION),
|
|
&DriverName,
|
|
FILE_DEVICE_UNKNOWN,
|
|
FILE_DEVICE_SECURE_OPEN,
|
|
FALSE,
|
|
&DeviceObject);
|
|
if (NT_SUCCESS(Status))
|
|
{
|
|
/* Setup the device extension */
|
|
DeviceExtension = DeviceObject->DeviceExtension;
|
|
DeviceExtension->Initialized = FALSE;
|
|
|
|
/* Initialize the driver object */
|
|
RtlFillMemoryUlong(DriverObject->MajorFunction,
|
|
RTL_NUMBER_OF(DriverObject->MajorFunction),
|
|
(ULONG_PTR)Dispatch);
|
|
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchDeviceControl;
|
|
DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = DispatchShutdownControl;
|
|
DriverObject->FastIoDispatch = NULL;
|
|
DriverObject->DriverUnload = UnloadHandler;
|
|
|
|
/* Initialize driver data */
|
|
if (InitializeGlobalData(RegistryPath, DriverObject))
|
|
{
|
|
/* Initialize device data */
|
|
if (InitializeDeviceData(DeviceObject))
|
|
{
|
|
/* We're all good, register a shutdown notification */
|
|
IoRegisterShutdownNotification(DeviceObject);
|
|
return Status;
|
|
}
|
|
}
|
|
|
|
/* One of the initializations failed, bail out */
|
|
Status = STATUS_INSUFFICIENT_RESOURCES;
|
|
}
|
|
else
|
|
{
|
|
/* Print a debug statement if enabled */
|
|
SAC_DBG(SAC_DBG_INIT, "unable to create device object: %X\n", Status);
|
|
}
|
|
|
|
/* Free any data we may have allocated and exit with failure */
|
|
FreeGlobalData();
|
|
SAC_DBG(SAC_DBG_ENTRY_EXIT, "Exiting with status 0x%x\n", Status);
|
|
return Status;
|
|
}
|
|
|
|
/* EMS is not enabled */
|
|
return STATUS_PORT_DISCONNECTED;
|
|
}
|