[NPFS_NEW]: Add file header info.
[reactos.git] / reactos / drivers / filesystems / npfs_new / prefxsup.c
1 /*
2 * PROJECT: ReactOS Named Pipe FileSystem
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: drivers/filesystems/npfs/prefxsup.c
5 * PURPOSE: Pipes Prefixes Support
6 * PROGRAMMERS: ReactOS Portable Systems Group
7 */
8
9 /* INCLUDES *******************************************************************/
10
11 #include "npfs.h"
12
13 /* FUNCTIONS ******************************************************************/
14
15 PNP_FCB
16 NTAPI
17 NpFindPrefix(IN PUNICODE_STRING Name,
18 IN ULONG CaseInsensitiveIndex,
19 IN PUNICODE_STRING Prefix)
20 {
21 PUNICODE_PREFIX_TABLE_ENTRY Entry;
22 PNP_FCB Fcb;
23 PAGED_CODE();
24
25 Entry = RtlFindUnicodePrefix(&NpVcb->PrefixTable,
26 Name,
27 CaseInsensitiveIndex);
28 if (!Entry) KeBugCheckEx(NPFS_FILE_SYSTEM, 0x100065u, 0, 0, 0);
29
30 Fcb = CONTAINING_RECORD(Entry, NP_FCB, PrefixTableEntry);
31
32 Prefix->Length = Name->Length - Fcb->FullName.Length;
33 Prefix->MaximumLength = Prefix->Length;
34 Prefix->Buffer = &Name->Buffer[Fcb->FullName.Length / sizeof(WCHAR)];
35
36 if ((Prefix->Length) && (Prefix->Buffer[0] == OBJ_NAME_PATH_SEPARATOR))
37 {
38 Prefix->Length -= sizeof(WCHAR);
39 Prefix->MaximumLength -= sizeof(WCHAR);
40 ++Prefix->Buffer;
41 }
42
43 return Fcb;
44 }
45
46 NTSTATUS
47 NTAPI
48 NpFindRelativePrefix(IN PNP_DCB Dcb,
49 IN PUNICODE_STRING Name,
50 IN ULONG CaseInsensitiveIndex,
51 IN PUNICODE_STRING Prefix,
52 OUT PNP_FCB *FoundFcb)
53 {
54 PWCHAR Buffer;
55 PNP_FCB Fcb;
56 UNICODE_STRING RootName;
57 USHORT Length, MaximumLength;
58 PAGED_CODE();
59
60 Length = Name->Length;
61 MaximumLength = Length + sizeof(OBJ_NAME_PATH_SEPARATOR) + sizeof(UNICODE_NULL);
62 if (MaximumLength < Length) return STATUS_INVALID_PARAMETER;
63
64 ASSERT(Dcb->NodeType == NPFS_NTC_ROOT_DCB);
65
66 Buffer = ExAllocatePoolWithTag(PagedPool, MaximumLength, NPFS_NAME_BLOCK_TAG);
67 if (!Buffer)
68 {
69 return STATUS_INSUFFICIENT_RESOURCES;
70 }
71
72 *Buffer = OBJ_NAME_PATH_SEPARATOR;
73 RtlCopyMemory(Buffer + 1, Name->Buffer, Length);
74 Buffer[(Length / sizeof(WCHAR)) + 1] = UNICODE_NULL;
75
76 RootName.Length = Length + sizeof(OBJ_NAME_PATH_SEPARATOR);
77 RootName.MaximumLength = MaximumLength;
78 RootName.Buffer = Buffer;
79
80 Fcb = NpFindPrefix(&RootName, CaseInsensitiveIndex, Prefix);
81
82 ExFreePool(Buffer);
83
84 Prefix->Buffer = &Name->Buffer[(Length - Prefix->Length) / sizeof(WCHAR)];
85 *FoundFcb = Fcb;
86
87 return STATUS_SUCCESS;
88 }
89
90 /* EOF */