- Implemented InterlockedBitTestAndReset, InterlockedBitTestAndSet, InterlockedExchan...
[reactos.git] / reactos / ntoskrnl / ob / symlink.c
index 4f7462b..f7682b2 100644 (file)
@@ -4,7 +4,7 @@
  * PROJECT:         ReactOS kernel
  * FILE:            ntoskrnl/ob/symlink.c
  * PURPOSE:         Implements symbolic links
- * 
+ *
  * PROGRAMMERS:     David Welch (welch@mcmail.com)
  */
 
 #define NDEBUG
 #include <internal/debug.h>
 
+#if defined (ALLOC_PRAGMA)
+#pragma alloc_text(INIT, ObInitSymbolicLinkImplementation)
+#endif
+
 
 /* GLOBALS ******************************************************************/
 
@@ -25,35 +29,8 @@ static GENERIC_MAPPING ObpSymbolicLinkMapping = {
        STANDARD_RIGHTS_EXECUTE|SYMBOLIC_LINK_QUERY,
        SYMBOLIC_LINK_ALL_ACCESS};
 
-#define TAG_SYMLINK_TTARGET     TAG('S', 'Y', 'T', 'T')
-#define TAG_SYMLINK_TARGET      TAG('S', 'Y', 'M', 'T')
-
-
 /* FUNCTIONS ****************************************************************/
 
-/**********************************************************************
- * NAME                                                        INTERNAL
- *     ObpCreateSymbolicLink
- *
- * DESCRIPTION
- *
- * ARGUMENTS
- *
- * RETURNN VALUE
- *     Status.
- *
- * REVISIONS
- */
-NTSTATUS STDCALL
-ObpCreateSymbolicLink(PVOID Object,
-                     PVOID Parent,
-                     PWSTR RemainingPath,
-                     POBJECT_ATTRIBUTES ObjectAttributes)
-{
-  return(STATUS_SUCCESS);
-}
-
-
 /**********************************************************************
  * NAME                                                        INTERNAL
  *     ObpDeleteSymbolicLink
@@ -72,7 +49,7 @@ ObpDeleteSymbolicLink(PVOID ObjectBody)
 {
   PSYMLINK_OBJECT SymlinkObject = (PSYMLINK_OBJECT)ObjectBody;
 
-  RtlFreeUnicodeString(&SymlinkObject->TargetName);
+  ExFreePool(SymlinkObject->TargetName.Buffer);
 }
 
 
@@ -129,7 +106,7 @@ ObpParseSymbolicLink(PVOID Object,
      }
 
    /* transfer target path buffer into FullPath */
-   RtlFreeUnicodeString(FullPath);
+   ExFreePool(FullPath->Buffer);
    FullPath->Length = TargetPath.Length;
    FullPath->MaximumLength = TargetPath.MaximumLength;
    FullPath->Buffer = TargetPath.Buffer;
@@ -156,34 +133,28 @@ ObpParseSymbolicLink(PVOID Object,
  *
  * REVISIONS
  */
-VOID INIT_FUNCTION
+VOID 
+INIT_FUNCTION
+NTAPI
 ObInitSymbolicLinkImplementation (VOID)
 {
-  ObSymbolicLinkType = ExAllocatePool(NonPagedPool, sizeof(OBJECT_TYPE));
-
-  ObSymbolicLinkType->Tag = TAG('S', 'Y', 'M', 'T');
-  ObSymbolicLinkType->TotalObjects = 0;
-  ObSymbolicLinkType->TotalHandles = 0;
-  ObSymbolicLinkType->PeakObjects = 0;
-  ObSymbolicLinkType->PeakHandles = 0;
-  ObSymbolicLinkType->PagedPoolCharge = 0;
-  ObSymbolicLinkType->NonpagedPoolCharge = sizeof(SYMLINK_OBJECT);
-  ObSymbolicLinkType->Mapping = &ObpSymbolicLinkMapping;
-  ObSymbolicLinkType->Dump = NULL;
-  ObSymbolicLinkType->Open = NULL;
-  ObSymbolicLinkType->Close = NULL;
-  ObSymbolicLinkType->Delete = ObpDeleteSymbolicLink;
-  ObSymbolicLinkType->Parse = ObpParseSymbolicLink;
-  ObSymbolicLinkType->Security = NULL;
-  ObSymbolicLinkType->QueryName = NULL;
-  ObSymbolicLinkType->OkayToClose = NULL;
-  ObSymbolicLinkType->Create = ObpCreateSymbolicLink;
-  ObSymbolicLinkType->DuplicationNotify = NULL;
-
-  RtlInitUnicodeString(&ObSymbolicLinkType->TypeName,
-                      L"SymbolicLink");
-
-  ObpCreateTypeObject(ObSymbolicLinkType);
+  UNICODE_STRING Name;
+  OBJECT_TYPE_INITIALIZER ObjectTypeInitializer;
+    
+  DPRINT("Creating SymLink Object Type\n");
+  
+  /*  Initialize the Directory type  */
+  RtlZeroMemory(&ObjectTypeInitializer, sizeof(ObjectTypeInitializer));
+  RtlInitUnicodeString(&Name, L"SymbolicLink");
+  ObjectTypeInitializer.Length = sizeof(ObjectTypeInitializer);
+  ObjectTypeInitializer.DefaultNonPagedPoolCharge = sizeof(SYMLINK_OBJECT);
+  ObjectTypeInitializer.GenericMapping = ObpSymbolicLinkMapping;
+  ObjectTypeInitializer.PoolType = NonPagedPool;
+  ObjectTypeInitializer.ValidAccessMask = SYMBOLIC_LINK_ALL_ACCESS;
+  ObjectTypeInitializer.UseDefaultObject = TRUE;
+  ObjectTypeInitializer.ParseProcedure = ObpParseSymbolicLink;
+  ObjectTypeInitializer.DeleteProcedure = ObpDeleteSymbolicLink;
+  ObpCreateTypeObject(&ObjectTypeInitializer, &Name, &ObSymbolicLinkType);
 }
 
 
@@ -213,16 +184,14 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
   NTSTATUS Status = STATUS_SUCCESS;
 
   PAGED_CODE();
-  
+
   PreviousMode = ExGetPreviousMode();
 
   if(PreviousMode != KernelMode)
   {
     _SEH_TRY
     {
-      ProbeForWrite(LinkHandle,
-                    sizeof(HANDLE),
-                    sizeof(ULONG));
+      ProbeForWriteHandle(LinkHandle);
     }
     _SEH_HANDLE
     {
@@ -235,12 +204,10 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
       return Status;
     }
   }
-  
-  Status = RtlCaptureUnicodeString(&CapturedLinkTarget,
-                                   PreviousMode,
-                                   PagedPool,
-                                   FALSE,
-                                   LinkTarget);
+
+  Status = ProbeAndCaptureUnicodeString(&CapturedLinkTarget,
+                                        PreviousMode,
+                                        LinkTarget);
   if(!NT_SUCCESS(Status))
   {
     DPRINT1("NtCreateSymbolicLinkObject: Capturing the target link failed!\n");
@@ -266,7 +233,7 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
   {
     SymbolicLink->TargetName.Length = 0;
     SymbolicLink->TargetName.MaximumLength =
-      ((wcslen(LinkTarget->Buffer) + 1) * sizeof(WCHAR));
+      CapturedLinkTarget.Length + sizeof(WCHAR);
     SymbolicLink->TargetName.Buffer =
       ExAllocatePoolWithTag(NonPagedPool,
                            SymbolicLink->TargetName.MaximumLength,
@@ -298,10 +265,9 @@ NtCreateSymbolicLinkObject(OUT PHANDLE LinkHandle,
     }
     ObDereferenceObject(SymbolicLink);
   }
-  
-  RtlReleaseCapturedUnicodeString(&CapturedLinkTarget,
-                                  PreviousMode,
-                                  FALSE);
+
+  ReleaseCapturedUnicodeString(&CapturedLinkTarget,
+                               PreviousMode);
 
   return Status;
 }
@@ -330,23 +296,21 @@ NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
   NTSTATUS Status = STATUS_SUCCESS;
 
   PAGED_CODE();
-  
+
   PreviousMode = ExGetPreviousMode();
-  
+
   if(PreviousMode != KernelMode)
   {
     _SEH_TRY
     {
-      ProbeForWrite(LinkHandle,
-                    sizeof(HANDLE),
-                    sizeof(ULONG));
+      ProbeForWriteHandle(LinkHandle);
     }
     _SEH_HANDLE
     {
       Status = _SEH_GetExceptionCode();
     }
     _SEH_END;
-    
+
     if(!NT_SUCCESS(Status))
     {
       return Status;
@@ -375,7 +339,7 @@ NtOpenSymbolicLinkObject(OUT PHANDLE LinkHandle,
     }
     _SEH_END;
   }
-  
+
   return Status;
 }
 
@@ -402,11 +366,11 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
   PSYMLINK_OBJECT SymlinkObject;
   KPROCESSOR_MODE PreviousMode;
   NTSTATUS Status = STATUS_SUCCESS;
-  
+
   PAGED_CODE();
-  
+
   PreviousMode = ExGetPreviousMode();
-  
+
   if(PreviousMode != KernelMode)
   {
     _SEH_TRY
@@ -422,9 +386,7 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
 
       if(ResultLength != NULL)
       {
-        ProbeForWrite(ResultLength,
-                      sizeof(ULONG),
-                      sizeof(ULONG));
+        ProbeForWriteUlong(ResultLength);
       }
     }
     _SEH_HANDLE
@@ -432,7 +394,7 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
       Status = _SEH_GetExceptionCode();
     }
     _SEH_END;
-    
+
     if(!NT_SUCCESS(Status))
     {
       return Status;
@@ -452,7 +414,7 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
   if (NT_SUCCESS(Status))
   {
     ULONG LengthRequired = SymlinkObject->TargetName.Length + sizeof(WCHAR);
-    
+
     _SEH_TRY
     {
       if(SafeLinkTarget.MaximumLength >= LengthRequired)
@@ -470,7 +432,7 @@ NtQuerySymbolicLinkObject(IN HANDLE LinkHandle,
       {
         Status = STATUS_BUFFER_TOO_SMALL;
       }
-      
+
       if(ResultLength != NULL)
       {
         *ResultLength = LengthRequired;