c3734464802921ebdfeb356a235195674766c853
[reactos.git] / ntoskrnl / io / symlink.c
1 /* $Id$
2  *
3  * COPYRIGHT:       See COPYING in the top level directory
4  * PROJECT:         ReactOS kernel
5  * FILE:            ntoskrnl/io/symlink.c
6  * PURPOSE:         Implements symbolic links
7  * PROGRAMMER:      David Welch (welch@mcmail.com)
8  * UPDATE HISTORY:
9  *                  Created 22/05/98
10  */
11
12 /* INCLUDES *****************************************************************/
13
14 #include <ddk/ntddk.h>
15 #include <internal/se.h>
16
17 #define NDEBUG
18 #include <internal/debug.h>
19
20
21 /* FUNCTIONS ****************************************************************/
22
23 /**********************************************************************
24  * NAME                                                 EXPORTED
25  *      IoCreateSymbolicLink
26  *
27  * DESCRIPTION
28  *
29  * ARGUMENTS
30  *
31  * RETURN VALUE
32  *
33  * REVISIONS
34  *
35  */
36 NTSTATUS STDCALL
37 IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName,
38                      PUNICODE_STRING DeviceName)
39 {
40   OBJECT_ATTRIBUTES ObjectAttributes;
41   HANDLE Handle;
42   NTSTATUS Status;
43
44   assert_irql(PASSIVE_LEVEL);
45
46   DPRINT("IoCreateSymbolicLink(SymbolicLinkName %wZ, DeviceName %wZ)\n",
47          SymbolicLinkName,
48          DeviceName);
49
50   InitializeObjectAttributes(&ObjectAttributes,
51                              SymbolicLinkName,
52                              OBJ_PERMANENT,
53                              NULL,
54                              SePublicDefaultSd);
55
56   Status = NtCreateSymbolicLinkObject(&Handle,
57                                       SYMBOLIC_LINK_ALL_ACCESS,
58                                       &ObjectAttributes,
59                                       DeviceName);
60   if (!NT_SUCCESS(Status))
61     {
62       DPRINT1("NtCreateSymbolicLinkObject() failed (Status %lx)\n", Status);
63       return(Status);
64     }
65
66   NtClose(Handle);
67
68   return(STATUS_SUCCESS);
69 }
70
71
72 /**********************************************************************
73  * NAME                                                 EXPORTED
74  *      IoCreateUnprotectedSymbolicLink
75  *
76  * DESCRIPTION
77  *
78  * ARGUMENTS
79  *
80  * RETURN VALUE
81  *
82  * REVISIONS
83  *
84  */
85 NTSTATUS STDCALL
86 IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName,
87                                 PUNICODE_STRING DeviceName)
88 {
89   SECURITY_DESCRIPTOR SecurityDescriptor;
90   OBJECT_ATTRIBUTES ObjectAttributes;
91   HANDLE Handle;
92   NTSTATUS Status;
93
94   assert_irql(PASSIVE_LEVEL);
95
96   DPRINT("IoCreateUnprotectedSymbolicLink(SymbolicLinkName %wZ, DeviceName %wZ)\n",
97          SymbolicLinkName,
98          DeviceName);
99
100   Status = RtlCreateSecurityDescriptor(&SecurityDescriptor,
101                                        SECURITY_DESCRIPTOR_REVISION);
102   if (!NT_SUCCESS(Status))
103     {
104       DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)\n", Status);
105       return(Status);
106     }
107
108   Status = RtlSetDaclSecurityDescriptor(&SecurityDescriptor,
109                                         TRUE,
110                                         NULL,
111                                         TRUE);
112   if (!NT_SUCCESS(Status))
113     {
114       DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)\n", Status);
115       return(Status);
116     }
117
118   InitializeObjectAttributes(&ObjectAttributes,
119                              SymbolicLinkName,
120                              OBJ_PERMANENT,
121                              NULL,
122                              &SecurityDescriptor);
123
124   Status = NtCreateSymbolicLinkObject(&Handle,
125                                       SYMBOLIC_LINK_ALL_ACCESS,
126                                       &ObjectAttributes,
127                                       DeviceName);
128   if (!NT_SUCCESS(Status))
129     {
130       DPRINT1("NtCreateSymbolicLinkObject() failed (Status %lx)\n", Status);
131       return(Status);
132     }
133
134   NtClose(Handle);
135
136   return(STATUS_SUCCESS);
137 }
138
139
140 /**********************************************************************
141  * NAME                                                 EXPORTED
142  *      IoDeleteSymbolicLink
143  *
144  * DESCRIPTION
145  *
146  * ARGUMENTS
147  *
148  * RETURN VALUE
149  *
150  * REVISIONS
151  *
152  */
153 NTSTATUS STDCALL
154 IoDeleteSymbolicLink(PUNICODE_STRING SymbolicLinkName)
155 {
156   OBJECT_ATTRIBUTES ObjectAttributes;
157   HANDLE Handle;
158   NTSTATUS Status;
159
160   assert_irql(PASSIVE_LEVEL);
161
162   DPRINT("IoDeleteSymbolicLink (SymbolicLinkName %S)\n",
163          SymbolicLinkName->Buffer);
164
165   InitializeObjectAttributes(&ObjectAttributes,
166                              SymbolicLinkName,
167                              OBJ_OPENLINK,
168                              NULL,
169                              NULL);
170
171   Status = NtOpenSymbolicLinkObject(&Handle,
172                                     SYMBOLIC_LINK_ALL_ACCESS,
173                                     &ObjectAttributes);
174   if (!NT_SUCCESS(Status))
175     return(Status);
176
177   Status = NtMakeTemporaryObject(Handle);
178   NtClose(Handle);
179
180   return(Status);
181 }
182
183 /* EOF */