1 /* 2 * PROJECT: ReactOS Kernel 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: ntoskrnl/io/iomgr/symlink.c 5 * PURPOSE: I/O Wrappers for Symbolic Links 6 * PROGRAMMERS: Alex Ionescu (alex.ionescu@reactos.org) 7 * Eric Kohl 8 */ 9 10 /* INCLUDES *****************************************************************/ 11 12 #include <ntoskrnl.h> 13 #define NDEBUG 14 #include <debug.h> 15 16 /* FUNCTIONS ****************************************************************/ 17 18 /* 19 * @implemented 20 */ 21 NTSTATUS 22 NTAPI 23 IoCreateSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, 24 IN PUNICODE_STRING DeviceName) 25 { 26 OBJECT_ATTRIBUTES ObjectAttributes; 27 HANDLE Handle; 28 NTSTATUS Status; 29 PAGED_CODE(); 30 31 /* Initialize the object attributes and create the link */ 32 InitializeObjectAttributes(&ObjectAttributes, 33 SymbolicLinkName, 34 OBJ_KERNEL_HANDLE | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, 35 NULL, 36 SePublicDefaultSd); 37 Status = ZwCreateSymbolicLinkObject(&Handle, 38 SYMBOLIC_LINK_ALL_ACCESS, 39 &ObjectAttributes, 40 DeviceName); 41 if (NT_SUCCESS(Status)) ZwClose(Handle); 42 43 /* Return status */ 44 return Status; 45 } 46 47 /* 48 * @implemented 49 */ 50 NTSTATUS 51 NTAPI 52 IoCreateUnprotectedSymbolicLink(IN PUNICODE_STRING SymbolicLinkName, 53 IN PUNICODE_STRING DeviceName) 54 { 55 SECURITY_DESCRIPTOR SecurityDescriptor; 56 OBJECT_ATTRIBUTES ObjectAttributes; 57 HANDLE Handle; 58 NTSTATUS Status; 59 PAGED_CODE(); 60 61 /* Create an SD */ 62 Status = RtlCreateSecurityDescriptor(&SecurityDescriptor, 63 SECURITY_DESCRIPTOR_REVISION); 64 if (!NT_SUCCESS(Status)) return Status; 65 66 /* Set the DACL */ 67 Status = RtlSetDaclSecurityDescriptor(&SecurityDescriptor, 68 TRUE, 69 NULL, 70 TRUE); 71 if (!NT_SUCCESS(Status)) return Status; 72 73 /* Initialize the object attributes and create the link */ 74 InitializeObjectAttributes(&ObjectAttributes, 75 SymbolicLinkName, 76 OBJ_KERNEL_HANDLE | OBJ_PERMANENT | OBJ_CASE_INSENSITIVE, 77 NULL, 78 &SecurityDescriptor); 79 Status = ZwCreateSymbolicLinkObject(&Handle, 80 SYMBOLIC_LINK_ALL_ACCESS, 81 &ObjectAttributes, 82 DeviceName); 83 if (NT_SUCCESS(Status)) ZwClose(Handle); 84 85 /* Return status */ 86 return Status; 87 } 88 89 /* 90 * @implemented 91 */ 92 NTSTATUS 93 NTAPI 94 IoDeleteSymbolicLink(IN PUNICODE_STRING SymbolicLinkName) 95 { 96 OBJECT_ATTRIBUTES ObjectAttributes; 97 HANDLE Handle; 98 NTSTATUS Status; 99 PAGED_CODE(); 100 101 /* Initialize the object attributes and open the link */ 102 InitializeObjectAttributes(&ObjectAttributes, 103 SymbolicLinkName, 104 OBJ_KERNEL_HANDLE | OBJ_CASE_INSENSITIVE, 105 NULL, 106 NULL); 107 Status = ZwOpenSymbolicLinkObject(&Handle, DELETE, &ObjectAttributes); 108 if (!NT_SUCCESS(Status)) return Status; 109 110 /* Make the link temporary and close its handle */ 111 Status = ZwMakeTemporaryObject(Handle); 112 if (NT_SUCCESS(Status)) ZwClose(Handle); 113 114 /* Return status */ 115 return Status; 116 } 117 118 /* EOF */ 119