|
|
Definition at line 363 of file oblink.c.
Referenced by ObInitSystem(), and ObpLookupObjectName().
{
POBJECT_SYMBOLIC_LINK SymlinkObject = (POBJECT_SYMBOLIC_LINK)ParsedObject;
PUNICODE_STRING TargetPath;
PWSTR NewTargetPath;
ULONG LengthUsed, MaximumLength, TempLength;
NTSTATUS Status;
PAGED_CODE();
*NextObject = NULL;
if (!RemainingName->Length)
{
if (ObjectType)
{
Status = ObReferenceObjectByPointer(ParsedObject,
0,
ObjectType,
AccessMode);
if (NT_SUCCESS(Status))
{
*NextObject = ParsedObject;
}
if ((NT_SUCCESS(Status)) || (Status != STATUS_OBJECT_TYPE_MISMATCH))
{
return Status;
}
}
}
else if (RemainingName->Buffer[0] != OBJ_NAME_PATH_SEPARATOR)
{
return STATUS_OBJECT_TYPE_MISMATCH;
}
if (SymlinkObject->LinkTargetObject)
{
UNIMPLEMENTED;
}
TargetPath = &SymlinkObject->LinkTarget;
TempLength = TargetPath->Length;
if (TempLength && RemainingName->Length)
{
if ((TargetPath->Buffer[TempLength / sizeof(WCHAR) - 1] ==
OBJ_NAME_PATH_SEPARATOR) &&
(RemainingName->Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
{
TempLength -= sizeof(OBJ_NAME_PATH_SEPARATOR);
}
}
LengthUsed = TempLength + RemainingName->Length;
if (LengthUsed > 0xFFF0)
return STATUS_NAME_TOO_LONG;
if (FullPath->MaximumLength <= LengthUsed)
{
MaximumLength = LengthUsed + sizeof(WCHAR);
NewTargetPath = ExAllocatePoolWithTag(NonPagedPool,
MaximumLength,
TAG_SYMLINK_TTARGET);
if (!NewTargetPath) return STATUS_INSUFFICIENT_RESOURCES;
}
else
{
MaximumLength = FullPath->MaximumLength;
NewTargetPath = FullPath->Buffer;
}
if (RemainingName->Length)
{
RtlMoveMemory((PVOID)((ULONG_PTR)NewTargetPath + TempLength),
RemainingName->Buffer,
RemainingName->Length);
}
RtlCopyMemory(NewTargetPath, TargetPath->Buffer, TempLength);
NewTargetPath[LengthUsed / sizeof(WCHAR)] = UNICODE_NULL;
if (NewTargetPath != FullPath->Buffer) ExFreePool(FullPath->Buffer);
FullPath->Length = (USHORT)LengthUsed;
FullPath->MaximumLength = (USHORT)MaximumLength;
FullPath->Buffer = NewTargetPath;
return STATUS_REPARSE;
}
|