|
|
//+----------------------------------------------------------------------------
//
// 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); }
|