windows-nt/Source/XPSP1/NT/base/fs/dfs/driver/ftdfs.c
2020-09-26 16:20:57 +08:00

118 lines
3.1 KiB
C

//+----------------------------------------------------------------------------
//
// Copyright (C) 1996, Microsoft Corporation
//
// File: ftdfs.c
//
// Contents: Support for ftdfs resolution
//
// Classes: None
//
// Functions:
//
//-----------------------------------------------------------------------------
#define Dbg DEBUG_TRACE_ROOT_EXPANSION
#include "dfsprocs.h"
#include "ftdfs.h"
#include "know.h"
#ifdef ALLOC_PRAGMA
#pragma alloc_text( PAGE, DfspParsePath )
#endif // ALLOC_PRAGMA
//+----------------------------------------------------------------------------
//
// Function: DfspParsePrefix
//
// Synopsis: Helper routine to break a path into domain, share, remainder
//
// Arguments: [Path] -- PUNICODE string of path to parse
//
// Returns: [DomainName] -- UNICODE_STRING containing DomainName, if present
// [ShareName] -- UNICODE_STRING containing ShareName, if present
// [Remainder] -- UNICODE_STRING containing remainder of Path
//
//-----------------------------------------------------------------------------
VOID
DfspParsePath(
PUNICODE_STRING PathName,
PUNICODE_STRING DomainName,
PUNICODE_STRING ShareName,
PUNICODE_STRING Remainder)
{
LPWSTR ustrp, ustart, uend;
DebugTrace(+1, Dbg, "DfspParsePath(%wZ)\n", PathName);
RtlInitUnicodeString(DomainName, NULL);
RtlInitUnicodeString(ShareName, NULL);
RtlInitUnicodeString(Remainder, NULL);
// Be sure there's something to do
if (PathName->Length == 0) {
DebugTrace(-1, Dbg, "PathName is empty\n",0 );
return;
}
// Skip leading '\'s
ustart = ustrp = PathName->Buffer;
uend = &PathName->Buffer[PathName->Length / sizeof(WCHAR)] - 1;
// strip trailing nulls
while (uend >= ustart && *uend == UNICODE_NULL)
uend--;
while (ustrp <= uend && *ustrp == UNICODE_PATH_SEP)
ustrp++;
// DomainName
ustart = ustrp;
while (ustrp <= uend && *ustrp != UNICODE_PATH_SEP)
ustrp++;
if (ustrp != ustart) {
DomainName->Buffer = ustart;
DomainName->Length = (USHORT)((ustrp - ustart)) * sizeof(WCHAR);
DomainName->MaximumLength = DomainName->Length;
// ShareName
ustart = ++ustrp;
while (ustrp <= uend && *ustrp != UNICODE_PATH_SEP)
ustrp++;
if (ustrp != ustart) {
ShareName->Buffer = ustart;
ShareName->Length = (USHORT)((ustrp - ustart)) * sizeof(WCHAR);
ShareName->MaximumLength = ShareName->Length;
// Remainder is whatever's left
ustart = ++ustrp;
while (ustrp <= uend)
ustrp++;
if (ustrp != ustart) {
Remainder->Buffer = ustart;
Remainder->Length = (USHORT)((ustrp - ustart)) * sizeof(WCHAR);
Remainder->MaximumLength = Remainder->Length;
}
}
}
DebugTrace( 0, Dbg, "DfspParsePath: DomainName -> %wZ\n", DomainName);
DebugTrace( 0, Dbg, " ShareName -> %wZ\n", ShareName);
DebugTrace(-1, Dbg, " Remainder -> %wZ\n", Remainder);
}