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
9 /* INCLUDES *******************************************************************/
13 /* FUNCTIONS ******************************************************************/
17 NpFindPrefix(IN PUNICODE_STRING Name
,
18 IN ULONG CaseInsensitiveIndex
,
19 IN PUNICODE_STRING Prefix
)
21 PUNICODE_PREFIX_TABLE_ENTRY Entry
;
25 Entry
= RtlFindUnicodePrefix(&NpVcb
->PrefixTable
,
27 CaseInsensitiveIndex
);
28 if (!Entry
) KeBugCheckEx(NPFS_FILE_SYSTEM
, 0x100065u
, 0, 0, 0);
30 Fcb
= CONTAINING_RECORD(Entry
, NP_FCB
, PrefixTableEntry
);
32 Prefix
->Length
= Name
->Length
- Fcb
->FullName
.Length
;
33 Prefix
->MaximumLength
= Prefix
->Length
;
34 Prefix
->Buffer
= &Name
->Buffer
[Fcb
->FullName
.Length
/ sizeof(WCHAR
)];
36 if ((Prefix
->Length
) && (Prefix
->Buffer
[0] == OBJ_NAME_PATH_SEPARATOR
))
38 Prefix
->Length
-= sizeof(WCHAR
);
39 Prefix
->MaximumLength
-= sizeof(WCHAR
);
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
)
56 UNICODE_STRING RootName
;
57 USHORT Length
, MaximumLength
;
60 Length
= Name
->Length
;
61 MaximumLength
= Length
+ sizeof(OBJ_NAME_PATH_SEPARATOR
) + sizeof(UNICODE_NULL
);
62 if (MaximumLength
< Length
) return STATUS_INVALID_PARAMETER
;
64 ASSERT(Dcb
->NodeType
== NPFS_NTC_ROOT_DCB
);
66 Buffer
= ExAllocatePoolWithTag(PagedPool
, MaximumLength
, NPFS_NAME_BLOCK_TAG
);
69 return STATUS_INSUFFICIENT_RESOURCES
;
72 *Buffer
= OBJ_NAME_PATH_SEPARATOR
;
73 RtlCopyMemory(Buffer
+ 1, Name
->Buffer
, Length
);
74 Buffer
[(Length
/ sizeof(WCHAR
)) + 1] = UNICODE_NULL
;
76 RootName
.Length
= Length
+ sizeof(OBJ_NAME_PATH_SEPARATOR
);
77 RootName
.MaximumLength
= MaximumLength
;
78 RootName
.Buffer
= Buffer
;
80 Fcb
= NpFindPrefix(&RootName
, CaseInsensitiveIndex
, Prefix
);
84 Prefix
->Buffer
= &Name
->Buffer
[(Length
- Prefix
->Length
) / sizeof(WCHAR
)];
87 return STATUS_SUCCESS
;