From 3c0e77846e858b16806e29b96fcdc3cda294bd92 Mon Sep 17 00:00:00 2001 From: Sir Richard Date: Fri, 17 Jun 2011 17:21:20 +0000 Subject: [PATCH] Patch by Anton Yarotsky: [SACDRV]: Implement DriverEntry point which connects to NTOS HeadLess Module (HDL). If HDL enabled through FreeLDR (/EMSPORT), connection should work. [SACDRV]: Fix typo's. svn path=/trunk/; revision=52320 --- reactos/drivers/sac/driver/data.c | 2 +- reactos/drivers/sac/driver/dispatch.c | 1 - reactos/drivers/sac/driver/init.c | 71 ++++++++++++++++++++++++++- reactos/drivers/sac/driver/sacdrv.h | 46 ++++++++++++++++- 4 files changed, 115 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/sac/driver/data.c b/reactos/drivers/sac/driver/data.c index 6f23fea65b9..42ebd90662d 100644 --- a/reactos/drivers/sac/driver/data.c +++ b/reactos/drivers/sac/driver/data.c @@ -49,7 +49,7 @@ InitializeDeviceData( } BOOLEAN -InitalizeGlobalData( +InitializeGlobalData( IN PUNICODE_STRING RegistryPath, IN PDRIVER_OBJECT DriverObject ) diff --git a/reactos/drivers/sac/driver/dispatch.c b/reactos/drivers/sac/driver/dispatch.c index 524a5eb95a1..58ffaca4115 100644 --- a/reactos/drivers/sac/driver/dispatch.c +++ b/reactos/drivers/sac/driver/dispatch.c @@ -80,7 +80,6 @@ TimerDpcRoutine( } VOID -NTAPI UnloadHandler( IN PDRIVER_OBJECT DriverObject ) diff --git a/reactos/drivers/sac/driver/init.c b/reactos/drivers/sac/driver/init.c index 67323e0937b..2be1425f38e 100644 --- a/reactos/drivers/sac/driver/init.c +++ b/reactos/drivers/sac/driver/init.c @@ -20,5 +20,74 @@ DriverEntry( IN PUNICODE_STRING RegistryPath ) { - return STATUS_NOT_IMPLEMENTED; + HEADLESS_RSP_QUERY_INFO HeadlessInformation; + ULONG InfoSize; + NTSTATUS Status; + UNICODE_STRING DriverName; + PDEVICE_OBJECT DeviceObject; + PSAC_DEVICE_EXTENSION DeviceExtension; + PAGED_CODE(); + + SAC_DBG(SAC_DBG_ENTRY_EXIT, "Entering.\n"); + + HeadlessDispatch( + HeadlessCmdQueryInformation, + NULL, + 0, + &HeadlessInformation, + &InfoSize + ); + if ((HeadlessInformation.Serial.TerminalType != HeadlessUndefinedPortType) && + ((HeadlessInformation.Serial.TerminalType != HeadlessSerialPort) || + (HeadlessInformation.Serial.TerminalAttached))) + { + 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)) + { + DeviceExtension = DeviceObject->DeviceExtension; + DeviceExtension->Initialized = FALSE; + + RtlFillMemoryUlong( + DriverObject->MajorFunction, + sizeof(DriverObject->MajorFunction) / sizeof(PVOID), + (ULONG_PTR)Dispatch); + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = + DispatchDeviceControl; + DriverObject->MajorFunction[IRP_MJ_SHUTDOWN] = + DispatchShutdownControl; + DriverObject->FastIoDispatch = NULL; + DriverObject->DriverUnload = UnloadHandler; + + if (InitializeGlobalData(RegistryPath, DriverObject)) + { + if (InitializeDeviceData(DeviceObject)) + { + IoRegisterShutdownNotification(DeviceObject); + return Status; + } + } + + Status = STATUS_INSUFFICIENT_RESOURCES; + } + else + { + SAC_DBG(SAC_DBG_INIT, "unable to create device object: %X\n", Status); + } + + FreeGlobalData(); + SAC_DBG(SAC_DBG_ENTRY_EXIT, "Exiting with status 0x%x\n", Status); + return Status; + } + + return STATUS_PORT_DISCONNECTED; } diff --git a/reactos/drivers/sac/driver/sacdrv.h b/reactos/drivers/sac/driver/sacdrv.h index 6d2861e51fb..3170bdd5ee6 100644 --- a/reactos/drivers/sac/driver/sacdrv.h +++ b/reactos/drivers/sac/driver/sacdrv.h @@ -7,9 +7,11 @@ */ /* INCLUDES *******************************************************************/ -#include +#include +#include #define SAC_DBG_ENTRY_EXIT 0x01 +#define SAC_DBG_INIT 0x04 #define SAC_DBG_MM 0x1000 #define SAC_DBG(x, ...) \ @@ -154,8 +156,48 @@ typedef struct _SAC_CHANNEL_ATTRIBUTES PKEVENT HasNewDataEvent; PKEVENT LockEvent; PKEVENT RedrawEvent; - GUID ChannelId; + GUID ChannelId; } SAC_CHANNEL_ATTRIBUTES, *PSAC_CHANNEL_ATTRIBUTES; +NTSTATUS +Dispatch( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +NTSTATUS +NTAPI +DispatchDeviceControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +NTSTATUS +DispatchShutdownControl( + IN PDEVICE_OBJECT DeviceObject, + IN PIRP Irp +); + +VOID +UnloadHandler( + IN PDRIVER_OBJECT DriverObject +); + +VOID +FreeGlobalData( + VOID +); + +BOOLEAN +InitializeDeviceData( + IN PDEVICE_OBJECT DeviceObject +); + +BOOLEAN +InitializeGlobalData( + IN PUNICODE_STRING RegistryPath, + IN PDRIVER_OBJECT DriverObject +); + extern ULONG SACDebug;