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