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.
273 lines
9.2 KiB
273 lines
9.2 KiB
/*
|
|
|
|
Copyright (c) 1992 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
pathmap.c
|
|
|
|
Abstract:
|
|
|
|
This module contains definitions relating to manipulation of AFP paths.
|
|
|
|
Author:
|
|
|
|
Sue Adams (microsoft!suea)
|
|
|
|
|
|
Revision History:
|
|
04 Jun 1992 Initial Version
|
|
|
|
Notes: Tab stop: 4
|
|
--*/
|
|
|
|
#ifndef _PATHMAP_
|
|
#define _PATHMAP_
|
|
|
|
#define UNICODE_HOST_PATHSEPZ L"\\" // a null terminated wide string
|
|
#define ANSI_HOST_PATHSEP '\\'
|
|
#define AFP_PATHSEP 0
|
|
#define UNICODE_AFP_PATHSEP UNICODE_NULL
|
|
#define AVERAGE_NODE_DEPTH 16
|
|
|
|
// describes the entity found by pathmapping routines
|
|
typedef struct _PathMapEntity
|
|
{
|
|
// Handle is returned for LOOKUPS ONLY!
|
|
FILESYSHANDLE pme_Handle; // Handle to DATA Stream, returned for lookups
|
|
|
|
// Full, UTail and ParentPath are returned whenever the following bitmap
|
|
//
|
|
// FD_INTERNAL_BITMAP_RETURN_PMEPATHS
|
|
// is specified in the AfpMapAfpPath call. These are mostly for Create and
|
|
// for lookups ONLY for apis that MAKE DISK CHANGES which will produce a
|
|
// change notification to come in. Caller must free the FullPath.Buffer.
|
|
// All other strings point into this buffer and do not need to be freed.
|
|
// Also used by Open to get the path of the file being opened.
|
|
UNICODE_STRING pme_FullPath; // Fully qualified relative to volume root
|
|
UNICODE_STRING pme_UTail; // Points to last component of Full
|
|
UNICODE_STRING pme_ParentPath; // Points to Full w/ length of UTail deleted
|
|
|
|
// pme_pDfeParent is used for Create and points to the parent directory.
|
|
// pme_pDfEntry is used for lookup (mainly for delete case) and points to the entity.
|
|
union
|
|
{
|
|
PDFENTRY pme_pDfeParent; // DFE of parent dir in which to create
|
|
PDFENTRY pme_pDfEntry; // DFE of of the entity for Lookup
|
|
};
|
|
} PATHMAPENTITY, *PPATHMAPENTITY;
|
|
|
|
#define AfpInitializePME(pPME, FullPathLen, FullPathBuffer) \
|
|
(pPME)->pme_FullPath.Buffer = FullPathBuffer; \
|
|
(pPME)->pme_FullPath.MaximumLength = FullPathLen; \
|
|
(pPME)->pme_Handle.fsh_FileHandle = NULL
|
|
|
|
//
|
|
// Values for path mapping DFFlag parameter;
|
|
// DFE_DIR/FILE/ANY tell the pathmapping code what type of entity we are
|
|
// trying to lookup/create
|
|
//
|
|
#define DFE_DIR 0x0001 // Specified if the object should be a dir
|
|
#define DFE_FILE 0x0002 // Specified if the object should be a file
|
|
#define DFE_ANY 0x0004 // Specified if the object can be either
|
|
|
|
//
|
|
// Values for reason of pathmap: Lookup, SoftCreate or HardCreate
|
|
//
|
|
typedef enum _PATHMAP_TYPE
|
|
{
|
|
Lookup,
|
|
SoftCreate,
|
|
HardCreate,
|
|
LookupForEnumerate // Same as Lookup but file children will be cached
|
|
// in during pathmap of the directory itself.
|
|
} PATHMAP_TYPE;
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpMapAfpPath(
|
|
IN PCONNDESC pConnDesc,
|
|
IN DWORD DirId,
|
|
IN PANSI_STRING Path,
|
|
IN BYTE PathType,
|
|
IN PATHMAP_TYPE MapReason,
|
|
IN DWORD DFFlag,
|
|
IN DWORD Bitmap,
|
|
OUT PPATHMAPENTITY pPME,
|
|
OUT PFILEDIRPARM pFDParm OPTIONAL // for lookups only
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpMapAfpPathForLookup(
|
|
IN PCONNDESC pConnDesc,
|
|
IN DWORD DirId,
|
|
IN PANSI_STRING Path,
|
|
IN BYTE PathType,
|
|
IN DWORD DFFlag,
|
|
IN DWORD Bitmap,
|
|
OUT PPATHMAPENTITY pPME OPTIONAL,
|
|
OUT PFILEDIRPARM pFDParm OPTIONAL
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpMapAfpIdForLookup(
|
|
IN PCONNDESC pConnDesc,
|
|
IN DWORD AfpId,
|
|
IN DWORD DFFlag,
|
|
IN DWORD Bitmap,
|
|
OUT PPATHMAPENTITY pPME OPTIONAL,
|
|
OUT PFILEDIRPARM pFDParm OPTIONAL
|
|
);
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpHostPathFromDFEntry(
|
|
IN PDFENTRY pDFE,
|
|
IN DWORD taillen,
|
|
OUT PUNICODE_STRING pPath
|
|
|
|
);
|
|
|
|
|
|
extern
|
|
AFPSTATUS
|
|
AfpCheckParentPermissions(
|
|
IN PCONNDESC pConnDesc,
|
|
IN DWORD ParentDirId,
|
|
IN PUNICODE_STRING pParentPath,
|
|
IN DWORD RequiredPerms,
|
|
OUT PFILESYSHANDLE pHandle OPTIONAL,
|
|
OUT PBYTE pUserRights OPTIONAL
|
|
);
|
|
|
|
#ifdef _PATHMAP_LOCALS
|
|
|
|
// An AFP path to an entity consists of a Dirid and pathname. A MAPPEDPATH
|
|
// structure resolves the AFP path into a PDFENTRY for the entity on lookups,
|
|
// or to a PDFENTRY of the parent directory plus the UNICODE file/dir name
|
|
// of the entity on creates.
|
|
typedef struct _MappedPath
|
|
{
|
|
PDFENTRY mp_pdfe;
|
|
UNICODE_STRING mp_Tail; // valid for Create only
|
|
WCHAR mp_Tailbuf[AFP_FILENAME_LEN+1]; // for mp_tail.Buffer
|
|
// mp_Tail is also used as an interim buffer during pathmap for looking up
|
|
// by name in the idindex database.
|
|
} MAPPEDPATH, *PMAPPEDPATH;
|
|
|
|
/* private function prototypes */
|
|
|
|
LOCAL
|
|
AFPSTATUS
|
|
afpGetMappedForLookupFDInfo(
|
|
IN PCONNDESC pConnDesc,
|
|
IN PDFENTRY pDfEntry,
|
|
IN DWORD Bitmap,
|
|
OUT PPATHMAPENTITY pPME OPTIONAL,
|
|
OUT PFILEDIRPARM pFDParm OPTIONAL
|
|
);
|
|
|
|
/*** afpGetNextComponent
|
|
*
|
|
* Takes an AFP path with leading and trailing nulls removed,
|
|
* and parses out the next path component.
|
|
*
|
|
* pComponent must point to a buffer of at least AFP_LONGNAME_LEN+1
|
|
* characters in length if pathtype is AFP_LONGNAME or AFP_SHORTNAME_LEN+1
|
|
* if pathtype is AFP_SHORTNAME.
|
|
*
|
|
* Returns the number of bytes (Mac ANSI characters) parsed off of
|
|
* pPath, else -1 for error.
|
|
LOCAL VOID
|
|
afpGetNextComponent(
|
|
IN PCHAR pPath,
|
|
IN int Length,
|
|
IN BYTE PathType,
|
|
OUT PCHAR Component,
|
|
OUT PINT pIndex
|
|
)
|
|
*/
|
|
#define afpGetNextComponent(_pPath, _Length, _PathType, _Component, _pIndex) \
|
|
do \
|
|
{ \
|
|
int Length = _Length; \
|
|
PCHAR pPath = _pPath; \
|
|
int maxlen; \
|
|
CHAR ch; \
|
|
\
|
|
maxlen = (_PathType == AFP_LONGNAME) ? \
|
|
AFP_LONGNAME_LEN : \
|
|
AFP_SHORTNAME_LEN; \
|
|
*(_pIndex) = 0; \
|
|
\
|
|
while ((Length > 0) && ((ch = *pPath) != '\0')) \
|
|
{ \
|
|
if ((*(_pIndex) == maxlen) || (ch == ':')) \
|
|
{ \
|
|
/* component too long or invalid char */ \
|
|
*(_pIndex) = -1; \
|
|
break; \
|
|
} \
|
|
\
|
|
(_Component)[(*(_pIndex))++] = ch; \
|
|
\
|
|
pPath++; \
|
|
Length--; \
|
|
} \
|
|
\
|
|
if (*(_pIndex) == -1) \
|
|
break; \
|
|
\
|
|
/* null terminate the component */ \
|
|
(_Component)[*(_pIndex)] = (CHAR)0; \
|
|
\
|
|
if ((PathType == AFP_SHORTNAME) && ((_Component)[0] != AFP_PATHSEP)) \
|
|
{ \
|
|
ANSI_STRING as; \
|
|
\
|
|
AfpInitUnicodeStringWithNonNullTerm(&as, *(_pIndex), _Component); \
|
|
if (!AfpIsLegalShortname(&as)) \
|
|
{ \
|
|
*(_pIndex) = -1; \
|
|
break; \
|
|
} \
|
|
} \
|
|
\
|
|
/* if we stopped due to null, move past it */ \
|
|
if (Length > 0) \
|
|
{ \
|
|
(*(_pIndex))++; \
|
|
} \
|
|
} while (FALSE);
|
|
|
|
|
|
LOCAL
|
|
AFPSTATUS
|
|
afpMapAfpPathToMappedPath(
|
|
IN PVOLDESC pVolDesc,
|
|
IN DWORD DirId,
|
|
IN PANSI_STRING Path,
|
|
IN BYTE PathType,
|
|
IN PATHMAP_TYPE MapReason,
|
|
IN DWORD DFflag,
|
|
IN BOOLEAN LockedForWrite,
|
|
OUT PMAPPEDPATH pMappedPath
|
|
|
|
);
|
|
|
|
LOCAL
|
|
AFPSTATUS
|
|
afpOpenUserHandle(
|
|
IN PCONNDESC pConnDesc,
|
|
IN struct _DirFileEntry * pDfEntry,
|
|
IN PUNICODE_STRING pPath OPTIONAL,
|
|
IN DWORD Bitmap,
|
|
OUT PFILESYSHANDLE pfshData // Handle of data stream of object
|
|
);
|
|
|
|
#endif // _PATHMAP_LOCALS
|
|
|
|
#endif // _PATHMAP_
|
|
|