Git conversion: Make reactos the root directory, move rosapps, rostests, wallpapers...
[reactos.git] / drivers / base / condrv / control.c
diff --git a/drivers/base/condrv/control.c b/drivers/base/condrv/control.c
new file mode 100644 (file)
index 0000000..78ce5b4
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * COPYRIGHT:       See COPYING in the top level directory
+ * PROJECT:         ReactOS Console Driver
+ * FILE:            drivers/base/condrv/control.c
+ * PURPOSE:         Console Driver - Controller Device
+ * PROGRAMMERS:     Hermes Belusca-Maito (hermes.belusca@sfr.fr)
+ */
+
+/* INCLUDES *******************************************************************/
+
+#include "condrv.h"
+
+#include <condrv/ntddcon.h>
+
+#define NDEBUG
+#include <debug.h>
+
+/* FUNCTIONS ******************************************************************/
+
+NTSTATUS NTAPI
+ConDrvCreateController(IN PDRIVER_OBJECT DriverObject,
+                       IN PUNICODE_STRING RegistryPath)
+{
+    NTSTATUS Status = STATUS_SUCCESS;
+    UNICODE_STRING DeviceName, SymlinkName;
+    PCONDRV_DRIVER DriverExtension;
+    PDEVICE_OBJECT Controller = NULL;
+
+    DPRINT1("Create the Controller device...\n");
+
+    RtlInitUnicodeString(&DeviceName , DD_CONDRV_CTRL_DEVICE_NAME_U);
+    RtlInitUnicodeString(&SymlinkName, DD_CONDRV_CTRL_SYMLNK_NAME_U);
+
+    /* Get the driver extension */
+    DriverExtension = (PCONDRV_DRIVER)IoGetDriverObjectExtension(DriverObject,
+                                                                 DriverObject);
+
+    /* Create the Controller device, if it doesn't exist */
+    Status = IoCreateDevice(DriverObject,
+                            0,
+                            (PUNICODE_STRING)&DeviceName,
+                            FILE_DEVICE_UNKNOWN,
+                            FILE_DEVICE_SECURE_OPEN,
+                            FALSE,
+                            &Controller);
+    if (!NT_SUCCESS(Status)) goto Done;
+
+    Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
+    if (!NT_SUCCESS(Status))
+    {
+        IoDeleteDevice(Controller);
+        goto Done;
+    }
+
+    Controller->Flags &= ~DO_DEVICE_INITIALIZING;
+
+    /* Save the Controller device */
+    DriverExtension->Controller = Controller;
+
+Done:
+    DPRINT1("Done, Status = 0x%08lx\n", Status);
+    return Status;
+}
+
+NTSTATUS NTAPI
+ConDrvDeleteController(IN PDRIVER_OBJECT DriverObject)
+{
+    NTSTATUS Status = STATUS_SUCCESS;
+    PDEVICE_OBJECT Controller;
+    UNICODE_STRING SymlinkName;
+
+    DPRINT1("Delete the Controller device...\n");
+
+    /* Retrieve the Controller device */
+    Controller = ((PCONDRV_DRIVER)IoGetDriverObjectExtension(DriverObject, DriverObject))->Controller;
+    if (!Controller) return STATUS_OBJECT_TYPE_MISMATCH;
+
+    RtlInitUnicodeString(&SymlinkName, DD_CONDRV_CTRL_SYMLNK_NAME_U);
+    IoDeleteSymbolicLink(&SymlinkName);
+    
+    /* Delete the controller device itself */
+    IoDeleteDevice(Controller);
+
+    DPRINT1("Done, Status = 0x%08lx\n", Status);
+    return Status;
+}
+
+/* EOF */