* PROJECT: ReactOS kernel
* FILE: ntoskrnl/ob/symlink.c
* PURPOSE: Implements symbolic links
- *
+ *
* PROGRAMMERS: David Welch (welch@mcmail.com)
*/
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
*
* 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);
}
NTSTATUS Status = STATUS_SUCCESS;
PAGED_CODE();
-
+
PreviousMode = ExGetPreviousMode();
if(PreviousMode != KernelMode)
{
_SEH_TRY
{
- ProbeForWrite(LinkHandle,
- sizeof(HANDLE),
- sizeof(ULONG));
+ ProbeForWriteHandle(LinkHandle);
}
_SEH_HANDLE
{
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");
}
ObDereferenceObject(SymbolicLink);
}
-
- RtlReleaseCapturedUnicodeString(&CapturedLinkTarget,
- PreviousMode,
- FALSE);
+
+ ReleaseCapturedUnicodeString(&CapturedLinkTarget,
+ PreviousMode);
return Status;
}
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;
}
_SEH_END;
}
-
+
return Status;
}
PSYMLINK_OBJECT SymlinkObject;
KPROCESSOR_MODE PreviousMode;
NTSTATUS Status = STATUS_SUCCESS;
-
+
PAGED_CODE();
-
+
PreviousMode = ExGetPreviousMode();
-
+
if(PreviousMode != KernelMode)
{
_SEH_TRY
if(ResultLength != NULL)
{
- ProbeForWrite(ResultLength,
- sizeof(ULONG),
- sizeof(ULONG));
+ ProbeForWriteUlong(ResultLength);
}
}
_SEH_HANDLE
Status = _SEH_GetExceptionCode();
}
_SEH_END;
-
+
if(!NT_SUCCESS(Status))
{
return Status;
if (NT_SUCCESS(Status))
{
ULONG LengthRequired = SymlinkObject->TargetName.Length + sizeof(WCHAR);
-
+
_SEH_TRY
{
if(SafeLinkTarget.MaximumLength >= LengthRequired)
{
Status = STATUS_BUFFER_TOO_SMALL;
}
-
+
if(ResultLength != NULL)
{
*ResultLength = LengthRequired;