1 /* $Id: symlink.c,v 1.9 1999/08/29 06:59:08 ea Exp $
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)
12 /* INCLUDES *****************************************************************/
14 #include <ddk/ntddk.h>
15 #include <internal/ob.h>
19 #include <internal/debug.h>
21 /* GLOBALS ******************************************************************/
28 UNICODE_STRING TargetName
;
29 OBJECT_ATTRIBUTES Target
;
31 } SYMLNK_OBJECT
, *PSYMLNK_OBJECT
;
35 IoSymbolicLinkType
= NULL
;
37 /* FUNCTIONS *****************************************************************/
40 /**********************************************************************
42 * IopCreateSymbolicLink
54 IopCreateSymbolicLink (
58 POBJECT_ATTRIBUTES ObjectAttributes
62 && (RemainingPath
!= NULL
)
71 return STATUS_SUCCESS
;
75 /**********************************************************************
77 * IopParseSymbolicLink
88 IopParseSymbolicLink (
94 PSYMLNK_OBJECT SymlinkObject
= (PSYMLNK_OBJECT
) Object
;
97 Status
= ObReferenceObjectByName(
98 SymlinkObject
->Target
.ObjectName
,
101 STANDARD_RIGHTS_REQUIRED
,
107 if (NT_SUCCESS(Status
))
109 return ReturnedObject
;
115 /**********************************************************************
117 * IoInitSymbolicLinkImplementation
130 IoInitSymbolicLinkImplementation (VOID
)
132 ANSI_STRING AnsiString
;
134 IoSymbolicLinkType
= ExAllocatePool(
139 IoSymbolicLinkType
->TotalObjects
= 0;
140 IoSymbolicLinkType
->TotalHandles
= 0;
141 IoSymbolicLinkType
->MaxObjects
= ULONG_MAX
;
142 IoSymbolicLinkType
->MaxHandles
= ULONG_MAX
;
143 IoSymbolicLinkType
->PagedPoolCharge
= 0;
144 IoSymbolicLinkType
->NonpagedPoolCharge
= sizeof (SYMLNK_OBJECT
);
145 IoSymbolicLinkType
->Dump
= NULL
;
146 IoSymbolicLinkType
->Open
= NULL
;
147 IoSymbolicLinkType
->Close
= NULL
;
148 IoSymbolicLinkType
->Delete
= NULL
;
149 IoSymbolicLinkType
->Parse
= IopParseSymbolicLink
;
150 IoSymbolicLinkType
->Security
= NULL
;
151 IoSymbolicLinkType
->QueryName
= NULL
;
152 IoSymbolicLinkType
->OkayToClose
= NULL
;
153 IoSymbolicLinkType
->Create
= IopCreateSymbolicLink
;
159 RtlAnsiStringToUnicodeString(
160 & IoSymbolicLinkType
->TypeName
,
167 /**********************************************************************
169 * NtOpenSymbolicLinkObject
182 NtOpenSymbolicLinkObject (
183 OUT PHANDLE LinkHandle
,
184 IN ACCESS_MASK DesiredAccess
,
185 IN POBJECT_ATTRIBUTES ObjectAttributes
191 Status
= ObReferenceObjectByName(
192 ObjectAttributes
->ObjectName
,
193 ObjectAttributes
->Attributes
,
201 if (!NT_SUCCESS(Status
))
206 Status
= ObCreateHandle(
207 PsGetCurrentProcess(),
213 if (!NT_SUCCESS(Status
))
218 return STATUS_SUCCESS
;
222 /**********************************************************************
224 * NtQuerySymbolicLinkObject
237 NtQuerySymbolicLinkObject (
238 IN HANDLE LinkHandle
,
239 IN OUT PUNICODE_STRING LinkTarget
,
240 OUT PULONG ReturnedLength OPTIONAL
243 PSYMLNK_OBJECT SymlinkObject
;
246 Status
= ObReferenceObjectByHandle(
251 (PVOID
*) & SymlinkObject
,
254 if (Status
!= STATUS_SUCCESS
)
259 RtlCopyUnicodeString(
261 SymlinkObject
->Target
.ObjectName
263 if (ReturnedLength
!= NULL
)
265 *ReturnedLength
= SymlinkObject
->Target
.Length
;
267 ObDereferenceObject(SymlinkObject
);
269 return STATUS_SUCCESS
;
273 /**********************************************************************
275 * IoCreateUnprotectedSymbolicLink
288 IoCreateUnprotectedSymbolicLink (
289 PUNICODE_STRING SymbolicLinkName
,
290 PUNICODE_STRING DeviceName
293 return IoCreateSymbolicLink(
300 /**********************************************************************
302 * IoCreateSymbolicLink
315 IoCreateSymbolicLink (
316 PUNICODE_STRING SymbolicLinkName
,
317 PUNICODE_STRING DeviceName
320 OBJECT_ATTRIBUTES ObjectAttributes
;
321 HANDLE SymbolicLinkHandle
;
322 PSYMLNK_OBJECT SymbolicLink
;
324 assert_irql(PASSIVE_LEVEL
);
327 "IoCreateSymbolicLink(SymbolicLinkName %w, DeviceName %w)\n",
328 SymbolicLinkName
->Buffer
,
332 InitializeObjectAttributes(
339 SymbolicLink
= ObCreateObject(
340 & SymbolicLinkHandle
,
341 SYMBOLIC_LINK_ALL_ACCESS
,
345 if (SymbolicLink
== NULL
)
347 return STATUS_UNSUCCESSFUL
;
350 ZwClose(SymbolicLinkHandle
);
352 SymbolicLink
->TargetName
.Length
= 0;
353 SymbolicLink
->TargetName
.MaximumLength
=
354 ((wcslen(DeviceName
->Buffer
) + 1) * sizeof(WCHAR
));
355 SymbolicLink
->TargetName
.Buffer
=
358 SymbolicLink
->TargetName
.MaximumLength
360 RtlCopyUnicodeString(
361 & (SymbolicLink
->TargetName
),
365 DPRINT("DeviceName %w\n", SymbolicLink
->TargetName
.Buffer
);
367 InitializeObjectAttributes(
368 & (SymbolicLink
->Target
),
369 & (SymbolicLink
->TargetName
),
375 DPRINT("%s() = STATUS_SUCCESS\n",__FUNCTION__
);
377 return STATUS_SUCCESS
;
381 /**********************************************************************
383 * IoDeleteSymbolicLink
396 IoDeleteSymbolicLink (
397 PUNICODE_STRING DeviceName
404 /**********************************************************************
405 * NAME (EXPORTED as Zw)
406 * NtCreateSymbolicLinkObject
419 NtCreateSymbolicLinkObject (
420 OUT PHANDLE SymbolicLinkHandle
,
421 IN ACCESS_MASK DesiredAccess
,
422 IN POBJECT_ATTRIBUTES ObjectAttributes
,
423 IN PUNICODE_STRING Name