forget update de.rc
[reactos.git] / reactos / 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 *
8 * PROGRAMMERS: David Welch (welch@mcmail.com)
9 */
10
11 /* INCLUDES *****************************************************************/
12
13 #include <ntoskrnl.h>
14 #define NDEBUG
15 #include <internal/debug.h>
16
17
18 /* FUNCTIONS ****************************************************************/
19
20 /**********************************************************************
21 * NAME EXPORTED
22 * IoCreateSymbolicLink
23 *
24 * DESCRIPTION
25 *
26 * ARGUMENTS
27 *
28 * RETURN VALUE
29 *
30 * REVISIONS
31 *
32 * @implemented
33 */
34 NTSTATUS STDCALL
35 IoCreateSymbolicLink(PUNICODE_STRING SymbolicLinkName,
36 PUNICODE_STRING DeviceName)
37 {
38 OBJECT_ATTRIBUTES ObjectAttributes;
39 HANDLE Handle;
40 NTSTATUS Status;
41
42 ASSERT_IRQL(PASSIVE_LEVEL);
43
44 DPRINT("IoCreateSymbolicLink(SymbolicLinkName %wZ, DeviceName %wZ)\n",
45 SymbolicLinkName,
46 DeviceName);
47
48 InitializeObjectAttributes(&ObjectAttributes,
49 SymbolicLinkName,
50 OBJ_PERMANENT,
51 NULL,
52 SePublicDefaultSd);
53
54 Status = ZwCreateSymbolicLinkObject(&Handle,
55 SYMBOLIC_LINK_ALL_ACCESS,
56 &ObjectAttributes,
57 DeviceName);
58 if (!NT_SUCCESS(Status))
59 {
60 DPRINT1("ZwCreateSymbolicLinkObject() failed (Status %lx)\n", Status);
61 return(Status);
62 }
63
64 ZwClose(Handle);
65
66 return(STATUS_SUCCESS);
67 }
68
69
70 /**********************************************************************
71 * NAME EXPORTED
72 * IoCreateUnprotectedSymbolicLink
73 *
74 * DESCRIPTION
75 *
76 * ARGUMENTS
77 *
78 * RETURN VALUE
79 *
80 * REVISIONS
81 *
82 * @implemented
83 */
84 NTSTATUS STDCALL
85 IoCreateUnprotectedSymbolicLink(PUNICODE_STRING SymbolicLinkName,
86 PUNICODE_STRING DeviceName)
87 {
88 SECURITY_DESCRIPTOR SecurityDescriptor;
89 OBJECT_ATTRIBUTES ObjectAttributes;
90 HANDLE Handle;
91 NTSTATUS Status;
92
93 ASSERT_IRQL(PASSIVE_LEVEL);
94
95 DPRINT("IoCreateUnprotectedSymbolicLink(SymbolicLinkName %wZ, DeviceName %wZ)\n",
96 SymbolicLinkName,
97 DeviceName);
98
99 Status = RtlCreateSecurityDescriptor(&SecurityDescriptor,
100 SECURITY_DESCRIPTOR_REVISION);
101 if (!NT_SUCCESS(Status))
102 {
103 DPRINT1("RtlCreateSecurityDescriptor() failed (Status %lx)\n", Status);
104 return(Status);
105 }
106
107 Status = RtlSetDaclSecurityDescriptor(&SecurityDescriptor,
108 TRUE,
109 NULL,
110 TRUE);
111 if (!NT_SUCCESS(Status))
112 {
113 DPRINT1("RtlSetDaclSecurityDescriptor() failed (Status %lx)\n", Status);
114 return(Status);
115 }
116
117 InitializeObjectAttributes(&ObjectAttributes,
118 SymbolicLinkName,
119 OBJ_PERMANENT,
120 NULL,
121 &SecurityDescriptor);
122
123 Status = ZwCreateSymbolicLinkObject(&Handle,
124 SYMBOLIC_LINK_ALL_ACCESS,
125 &ObjectAttributes,
126 DeviceName);
127 if (!NT_SUCCESS(Status))
128 {
129 DPRINT1("ZwCreateSymbolicLinkObject() failed (Status %lx)\n", Status);
130 return(Status);
131 }
132
133 ZwClose(Handle);
134
135 return(STATUS_SUCCESS);
136 }
137
138
139 /**********************************************************************
140 * NAME EXPORTED
141 * IoDeleteSymbolicLink
142 *
143 * DESCRIPTION
144 *
145 * ARGUMENTS
146 *
147 * RETURN VALUE
148 *
149 * REVISIONS
150 *
151 * @implemented
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 = ZwOpenSymbolicLinkObject(&Handle,
172 SYMBOLIC_LINK_ALL_ACCESS,
173 &ObjectAttributes);
174 if (!NT_SUCCESS(Status))
175 return(Status);
176
177 Status = ZwMakeTemporaryObject(Handle);
178 ZwClose(Handle);
179
180 return(Status);
181 }
182
183 /* EOF */