118 lines
3.1 KiB
C
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);
|
||
|
}
|