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 // File ID number for NPFS bugchecking support
14 #define NPFS_BUGCHECK_FILE_ID (NPFS_BUGCHECK_PREFXSUP)
16 /* FUNCTIONS ******************************************************************/
20 NpFindPrefix(IN PUNICODE_STRING Name
,
21 IN ULONG CaseInsensitiveIndex
,
22 IN PUNICODE_STRING Prefix
)
24 PUNICODE_PREFIX_TABLE_ENTRY Entry
;
28 Entry
= RtlFindUnicodePrefix(&NpVcb
->PrefixTable
,
30 CaseInsensitiveIndex
);
31 if (!Entry
) NpBugCheck(0, 0, 0);
33 Fcb
= CONTAINING_RECORD(Entry
, NP_FCB
, PrefixTableEntry
);
35 Prefix
->Length
= Name
->Length
- Fcb
->FullName
.Length
;
36 Prefix
->MaximumLength
= Prefix
->Length
;
37 Prefix
->Buffer
= &Name
->Buffer
[Fcb
->FullName
.Length
/ sizeof(WCHAR
)];
39 if ((Prefix
->Length
) && (Prefix
->Buffer
[0] == OBJ_NAME_PATH_SEPARATOR
))
41 Prefix
->Length
-= sizeof(WCHAR
);
42 Prefix
->MaximumLength
-= sizeof(WCHAR
);
51 NpFindRelativePrefix(IN PNP_DCB Dcb
,
52 IN PUNICODE_STRING Name
,
53 IN ULONG CaseInsensitiveIndex
,
54 IN PUNICODE_STRING Prefix
,
55 OUT PNP_FCB
*FoundFcb
)
59 UNICODE_STRING RootName
;
60 USHORT Length
, MaximumLength
;
63 Length
= Name
->Length
;
64 MaximumLength
= Length
+ sizeof(OBJ_NAME_PATH_SEPARATOR
) + sizeof(UNICODE_NULL
);
65 if (MaximumLength
< Length
) return STATUS_INVALID_PARAMETER
;
67 ASSERT(Dcb
->NodeType
== NPFS_NTC_ROOT_DCB
);
69 Buffer
= ExAllocatePoolWithTag(PagedPool
, MaximumLength
, NPFS_NAME_BLOCK_TAG
);
72 return STATUS_INSUFFICIENT_RESOURCES
;
75 *Buffer
= OBJ_NAME_PATH_SEPARATOR
;
76 RtlCopyMemory(Buffer
+ 1, Name
->Buffer
, Length
);
77 Buffer
[(Length
/ sizeof(WCHAR
)) + 1] = UNICODE_NULL
;
79 RootName
.Length
= Length
+ sizeof(OBJ_NAME_PATH_SEPARATOR
);
80 RootName
.MaximumLength
= MaximumLength
;
81 RootName
.Buffer
= Buffer
;
83 Fcb
= NpFindPrefix(&RootName
, CaseInsensitiveIndex
, Prefix
);
87 Prefix
->Buffer
= &Name
->Buffer
[(Length
- Prefix
->Length
) / sizeof(WCHAR
)];
90 return STATUS_SUCCESS
;