[NTFS] - Add some fixes and improvements to attribute.c from CR-123:
[reactos.git] / drivers / base / condrv / control.c
1 /*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Console Driver
4 * FILE: drivers/base/condrv/control.c
5 * PURPOSE: Console Driver - Controller Device
6 * PROGRAMMERS: Hermes Belusca-Maito (hermes.belusca@sfr.fr)
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "condrv.h"
12
13 #include <condrv/ntddcon.h>
14
15 #define NDEBUG
16 #include <debug.h>
17
18 /* FUNCTIONS ******************************************************************/
19
20 NTSTATUS NTAPI
21 ConDrvCreateController(IN PDRIVER_OBJECT DriverObject,
22 IN PUNICODE_STRING RegistryPath)
23 {
24 NTSTATUS Status = STATUS_SUCCESS;
25 UNICODE_STRING DeviceName, SymlinkName;
26 PCONDRV_DRIVER DriverExtension;
27 PDEVICE_OBJECT Controller = NULL;
28
29 DPRINT1("Create the Controller device...\n");
30
31 RtlInitUnicodeString(&DeviceName , DD_CONDRV_CTRL_DEVICE_NAME_U);
32 RtlInitUnicodeString(&SymlinkName, DD_CONDRV_CTRL_SYMLNK_NAME_U);
33
34 /* Get the driver extension */
35 DriverExtension = (PCONDRV_DRIVER)IoGetDriverObjectExtension(DriverObject,
36 DriverObject);
37
38 /* Create the Controller device, if it doesn't exist */
39 Status = IoCreateDevice(DriverObject,
40 0,
41 (PUNICODE_STRING)&DeviceName,
42 FILE_DEVICE_UNKNOWN,
43 FILE_DEVICE_SECURE_OPEN,
44 FALSE,
45 &Controller);
46 if (!NT_SUCCESS(Status)) goto Done;
47
48 Status = IoCreateSymbolicLink(&SymlinkName, &DeviceName);
49 if (!NT_SUCCESS(Status))
50 {
51 IoDeleteDevice(Controller);
52 goto Done;
53 }
54
55 Controller->Flags &= ~DO_DEVICE_INITIALIZING;
56
57 /* Save the Controller device */
58 DriverExtension->Controller = Controller;
59
60 Done:
61 DPRINT1("Done, Status = 0x%08lx\n", Status);
62 return Status;
63 }
64
65 NTSTATUS NTAPI
66 ConDrvDeleteController(IN PDRIVER_OBJECT DriverObject)
67 {
68 NTSTATUS Status = STATUS_SUCCESS;
69 PDEVICE_OBJECT Controller;
70 UNICODE_STRING SymlinkName;
71
72 DPRINT1("Delete the Controller device...\n");
73
74 /* Retrieve the Controller device */
75 Controller = ((PCONDRV_DRIVER)IoGetDriverObjectExtension(DriverObject, DriverObject))->Controller;
76 if (!Controller) return STATUS_OBJECT_TYPE_MISMATCH;
77
78 RtlInitUnicodeString(&SymlinkName, DD_CONDRV_CTRL_SYMLNK_NAME_U);
79 IoDeleteSymbolicLink(&SymlinkName);
80
81 /* Delete the controller device itself */
82 IoDeleteDevice(Controller);
83
84 DPRINT1("Done, Status = 0x%08lx\n", Status);
85 return Status;
86 }
87
88 /* EOF */