+++ /dev/null
-/*
- * PROJECT: ReactOS Named Pipe FileSystem
- * LICENSE: BSD - See COPYING.ARM in the top level directory
- * FILE: drivers/filesystems/npfs/prefxsup.c
- * PURPOSE: Pipes Prefixes Support
- * PROGRAMMERS: ReactOS Portable Systems Group
- */
-
-/* INCLUDES *******************************************************************/
-
-#include "npfs.h"
-
-// File ID number for NPFS bugchecking support
-#define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_PREFXSUP)
-
-/* FUNCTIONS ******************************************************************/
-
-PNP_FCB
-NTAPI
-NpFindPrefix(IN PUNICODE_STRING Name,
- IN ULONG CaseInsensitiveIndex,
- IN PUNICODE_STRING Prefix)
-{
- PUNICODE_PREFIX_TABLE_ENTRY Entry;
- PNP_FCB Fcb;
- PAGED_CODE();
-
- Entry = RtlFindUnicodePrefix(&NpVcb->PrefixTable,
- Name,
- CaseInsensitiveIndex);
- if (!Entry) NpBugCheck(0, 0, 0);
-
- Fcb = CONTAINING_RECORD(Entry, NP_FCB, PrefixTableEntry);
-
- Prefix->Length = Name->Length - Fcb->FullName.Length;
- Prefix->MaximumLength = Prefix->Length;
- Prefix->Buffer = &Name->Buffer[Fcb->FullName.Length / sizeof(WCHAR)];
-
- if ((Prefix->Length) && (Prefix->Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
- {
- Prefix->Length -= sizeof(WCHAR);
- Prefix->MaximumLength -= sizeof(WCHAR);
- ++Prefix->Buffer;
- }
-
- return Fcb;
-}
-
-NTSTATUS
-NTAPI
-NpFindRelativePrefix(IN PNP_DCB Dcb,
- IN PUNICODE_STRING Name,
- IN ULONG CaseInsensitiveIndex,
- IN PUNICODE_STRING Prefix,
- OUT PNP_FCB *FoundFcb)
-{
- PWCHAR Buffer;
- PNP_FCB Fcb;
- UNICODE_STRING RootName;
- USHORT Length, MaximumLength;
- PAGED_CODE();
-
- Length = Name->Length;
- MaximumLength = Length + sizeof(OBJ_NAME_PATH_SEPARATOR) + sizeof(UNICODE_NULL);
- if (MaximumLength < Length) return STATUS_INVALID_PARAMETER;
-
- ASSERT(Dcb->NodeType == NPFS_NTC_ROOT_DCB);
-
- Buffer = ExAllocatePoolWithTag(PagedPool, MaximumLength, NPFS_NAME_BLOCK_TAG);
- if (!Buffer)
- {
- return STATUS_INSUFFICIENT_RESOURCES;
- }
-
- *Buffer = OBJ_NAME_PATH_SEPARATOR;
- RtlCopyMemory(Buffer + 1, Name->Buffer, Length);
- Buffer[(Length / sizeof(WCHAR)) + 1] = UNICODE_NULL;
-
- RootName.Length = Length + sizeof(OBJ_NAME_PATH_SEPARATOR);
- RootName.MaximumLength = MaximumLength;
- RootName.Buffer = Buffer;
-
- Fcb = NpFindPrefix(&RootName, CaseInsensitiveIndex, Prefix);
-
- ExFreePool(Buffer);
-
- Prefix->Buffer = &Name->Buffer[(Length - Prefix->Length) / sizeof(WCHAR)];
- *FoundFcb = Fcb;
-
- return STATUS_SUCCESS;
-}
-
-/* EOF */