mirror of https://github.com/tongzx/nt5src
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.1 KiB
117 lines
3.1 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// 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);
|
|
}
|