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.
164 lines
4.1 KiB
164 lines
4.1 KiB
/*++
|
|
|
|
Copyright (c) 1990-91 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pathcan.c
|
|
|
|
Abstract:
|
|
|
|
Net path canonicalization routines:
|
|
|
|
NetpwCanonicalize
|
|
|
|
Notes:
|
|
|
|
The Nt versions of these routines are kept in the NetApi Dll and are
|
|
(usually) called locally. If the caller specifies a remote computer
|
|
name then we try to RPC the request. If that fails the wrapper routine
|
|
which attempts RPC will call down-level.
|
|
|
|
OLDPATHS support has been removed from this module in keeping with the
|
|
N-1 (this product and its immediate predecessor) philosophy of NT.
|
|
Therefore, we always expect a down-level server to be able to handle a
|
|
remoted canonicalization request. We don't cover for Lan Manager 1.x
|
|
|
|
Types of paths we expect to receive in this routine:
|
|
|
|
- relative path
|
|
e.g. foo\bar
|
|
|
|
- absolute path (path specified from root, but no drive or computer name)
|
|
e.g. \foo\bar
|
|
|
|
- UNC path
|
|
e.g. \\computer\share\foo
|
|
|
|
- disk path (full path specified with disk drive)
|
|
e.g. d:\foo\bar
|
|
|
|
Author:
|
|
|
|
Richard L Firth (rfirth) 06-Jan-1992
|
|
from an original script by danny glasser (dannygl)
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#include "nticanon.h"
|
|
|
|
//
|
|
// routines
|
|
//
|
|
|
|
|
|
NET_API_STATUS
|
|
NetpwPathCanonicalize(
|
|
IN LPTSTR PathName,
|
|
IN LPTSTR Outbuf,
|
|
IN DWORD OutbufLen,
|
|
IN LPTSTR Prefix OPTIONAL,
|
|
IN OUT LPDWORD PathType,
|
|
IN DWORD Flags
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
NetpPathCanonicalize produces the canonical version of the specified
|
|
pathname.
|
|
|
|
The canonical form of PRN is LPT1
|
|
The canonical form of AUX is COM1
|
|
|
|
If the value of <PathType> on entry has not been determined
|
|
by a prior (successful) call to NetpPathType, it must be set to 0.
|
|
Even if it is set to the correct non-zero value on entry, it may be
|
|
changed by this function, since the canonicalized version of a name
|
|
may be of a different type than the original version (e.g. if the
|
|
prefix is used).
|
|
|
|
Arguments:
|
|
|
|
PathName - The pathname to canonicalize
|
|
|
|
Outbuf - The place to store the canonicalized version of the pathname
|
|
|
|
OutbufLen - The size, in bytes, of <Outbuf>
|
|
|
|
Prefix - Optional prefix to use when canonicalizing a relative pathname
|
|
|
|
PathType - The place to store the type. If the type does not contain
|
|
zero on function entry, the function assumes that this type
|
|
has been determined already by a call to NetpPathType
|
|
|
|
Flags - Flags to determine operation. MBZ
|
|
|
|
Return Value:
|
|
|
|
NET_API_STATUS
|
|
Success - NERR_Success
|
|
Failure - ERROR_INVALID_PARAMETER
|
|
ERROR_INVALID_NAME
|
|
NERR_BufTooSmall
|
|
--*/
|
|
|
|
{
|
|
DWORD rc = 0;
|
|
BOOL noPrefix = ((Prefix == NULL) || (*Prefix == TCHAR_EOS));
|
|
DWORD typeOfPrefix;
|
|
DWORD typeOfPath;
|
|
|
|
#ifdef CANONDBG
|
|
NetpKdPrint(("NetpwPathCanonicalize\n"));
|
|
#endif
|
|
|
|
typeOfPath = *PathType;
|
|
|
|
if (Flags & INPCA_FLAGS_RESERVED) {
|
|
return ERROR_INVALID_PARAMETER;
|
|
}
|
|
|
|
//
|
|
// Determine type of pathname, if it hasn't been determined yet
|
|
// Abort on error
|
|
//
|
|
|
|
if (!typeOfPath) {
|
|
if (rc = NetpwPathType(PathName, &typeOfPath, 0)) {
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Validate prefix, if there is one
|
|
// Abort on error
|
|
//
|
|
|
|
if (!noPrefix) {
|
|
if (rc = NetpwPathType(Prefix, &typeOfPrefix, 0)) {
|
|
return rc;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Set the output buffer to the null string (or return with an error, if
|
|
// it's zero length). Note that we've already set the caller's
|
|
// <PathType> parameter.
|
|
//
|
|
|
|
if (OutbufLen == 0) {
|
|
return NERR_BufTooSmall;
|
|
} else {
|
|
*Outbuf = TCHAR_EOS;
|
|
}
|
|
|
|
rc = CanonicalizePathName(Prefix, PathName, Outbuf, OutbufLen, NULL);
|
|
if (rc == NERR_Success) {
|
|
rc = NetpwPathType(Outbuf, PathType, 0);
|
|
}
|
|
return rc;
|
|
}
|